User Tag List

Страница 55 из 273 ПерваяПервая ... 515253545556575859 ... ПоследняяПоследняя
Показано с 541 по 550 из 2727

Тема: Цифровая археология: 1801 и все-все-все

  1. #541

    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    613
    Спасибо Благодарностей отдано 
    18
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    136 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А вот ещё такой вопрос, даже два.
    В Qsync\vm1_qbus.v полно таких alwaysов: always @(posedge pin_clk_p or posedge mjres) или always @(posedge pin_clk_n or posedge mjres)
    Тут mjres - регистр, и его вроде бы уже нельзя рассматривать по аналогии как с tve_reset в always @(posedge tve_clk or posedge tve_reset) в module vm1_timer
    или можно?
    А ещё есть такая штука always @(posedge qbus_clk) для неё таки придётся отлавливать фронт при выполнении конкретно этого always среди списков и always_p и always_n ?

    ps. А я думал этот пост сольётся с предыдущим. А оказывается нет.

  2. #541
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #542

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    В Qsync\vm1_qbus.v полно таких alwaysов: always @(posedge pin_clk_p or posedge mjres) или always @(posedge pin_clk_n or posedge mjres)
    Тут mjres - регистр, и его вроде бы уже нельзя рассматривать по аналогии как с tve_reset
    Почему нельзя? Запросто, обычный асинхронный сброс, ну является выходом триггера а не входной переменной, никаких особенностей на него это не накладывает. Если есть какие-то сложности восприятия - то заведите assign mj_res_func = mj_res, типа вычисляемая функция такая.

    Цитата Сообщение от gid Посмотреть сообщение
    А ещё есть такая штука always @(posedge qbus_clk)
    Это отладочный рудимент остался от переноса с асинхронной модели, если внимательно посмотреть то qbus_clk имеет источником pin_clk_p, то есть - следует qbus_clk там где он остался (я нашел одно место) заменить на pin_clk_p и забыть про него. Никаких других тактов кроме pin_clk_p/n в синхронном проекте нет, специально так разрабатывалось, поэтому насчет детекторов фронтов можно не париться.

    Цитата Сообщение от gid Посмотреть сообщение
    ps. А я думал этот пост сольётся с предыдущим. А оказывается нет.
    У форума какой-то таймаут на слияние есть, и хорошо что не объединилось, я увидел новое сообщение.
    Последний раз редактировалось Vslav; 08.04.2015 в 15:55.

  4. #543

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

  5. #544

    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    613
    Спасибо Благодарностей отдано 
    18
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    136 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я тут заметил, что логика в vm1_qbus.v не оптимизирована, т.е. в некоторых местах можно вместо ~a | ~b записать ~(a & b) и т.п., а в некоторых выражениях общие члены можно вынести за скобки. Это потому что при моделировании в FPGA такие мелочи несущественны? Или оставлено как есть с целью облегчения поиска ошибок, а оптимизации будут потом?
    А ещё вопрос про логику редуцирования.
    выражение qbus_tovf <= &qbus_timer[5:2];
    можно записать как qbus_tovf <= (qbus_timer[5:2] == 4'b1111);
    или есть какая-то принципиальная разница, раз оставлено именно редуцирование?

  6. #545

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    Это потому что при моделировании в FPGA такие мелочи несущественны?
    Совершенно несущественны, синтезатор все минимизирует применительно к архитектуре конкретного семейства FPGA, там не всегда "руками" можно найти оптимальное решение. БОльшую часть уравнений я переписал так чтобы, по моему мнению, было нагляднее, часть осталась просто переписанная со схемы "как есть".

    Цитата Сообщение от gid Посмотреть сообщение
    Или оставлено как есть с целью облегчения поиска ошибок, а оптимизации будут потом?
    Для FPGA основная оптимизация - это тактовая частота, ресурсов же ВМ1 и так немного берет чтобы за них особо бороться (~1400 ячеек). Под повышение тактовой (чтобы перешагнуть за 100МГц), возможно, перепишу АЛУ, и больше явно узких мест пока не видно.

    Цитата Сообщение от gid Посмотреть сообщение
    есть какая-то принципиальная разница, раз оставлено именно редуцирование?
    Никакой, просто так захотелось написать

  7. #546

    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    613
    Спасибо Благодарностей отдано 
    18
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    136 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Завершил механический перенос vm1_qbus.v -> vm1_qbus.cpp
    Получилась какая-то страшная каша-малаша в которой совершенно невозможно разобраться, если не иметь перед глазами исходник на верилоге. Теперь надо заново всё сравнить и поискать насчёт опечаток.
    Пока наблюдается две проблемы.
    1) все assignы не удаётся расположить так, чтобы выполнить их за один проход, придётся крутить их в цикле пока предыдущее состояние wires не станет совпадать с нововычисленным.
    2) выходные значения модулей vm1_reg_ff и vm1_timer - wires поэтому как мне кажется, их неправильно будет вызывать при исполнении always, а при исполнении assign их нельзя вызывать, т.к. внутри них есть alwaysы.
    Если сделать их выходное значение регистром, а его значения назначать assignом первоначальному wire, логика не нарушится?
    например для vm1_reg_ff сделать так:
    Код:
    assign xr = xr_rc; //тут результат работы vm1_reg_ff
    assign yr = yr_rc; //назначается изначальным wire
    always @(posedge pin_clk_n) //внутри vm1_reg_ff все always такие же
    begin
    vm1_reg_ff vreg(
       .clk_p(pin_clk_p),
       .clk_n(pin_clk_n),
       .reset(reset),
       .plr(plr),
       .xbus_in(x),
       .xbus_out(xr_rc),
       .ybus_out(yr_rc),
       .wstbl(au_alsl),
       .wstbh(au_alsh),
       .ireg(ir),
       .vsel(vsel),
       .pa(pin_pa),
       .carry(psw[0]));
    end
    Иначе придётся прямо разворачивать все подмодули как вложения.

  8. #547

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    1) все assignы не удаётся расположить так, чтобы выполнить их за один проход, придётся крутить их в цикле пока предыдущее состояние wires не станет совпадать с нововычисленным.
    Это странно, замкнутых петель в коде нет, то есть вариантов "А зависит от В" и одновременно "В зависит от А" в assign быть не должно. То есть порядок когда все вычисляется за один проход теоретически должен быть. Наглядность записи может при этом пострадать, но принципиальных препятствия для однопроходной реализации вроде нет. Некоторые трудности может создать асинхронный сброс, но мне кажется что они решаемые.

    Цитата Сообщение от gid Посмотреть сообщение
    2) выходные значения модулей vm1_reg_ff и vm1_timer - wires поэтому как
    Тут я не очень понял в чем проблема. То, что блоки alwyas и assign находятся внутри какого-то модуля, не значит что их можно вычислять отдельно от других блоков проекта. Неважно где описан блок, он все равно работает как и все остальные, на тех же условиях. На HDL модуль скорее соответствует макросу на C, а не функции/процедуре.

  9. #548

    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    613
    Спасибо Благодарностей отдано 
    18
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    136 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    замкнутых петель в коде нет
    Вот например, строки 1540-1541:
    Код:
    assign cpred   = {c[14:0], cl};
    assign c       = (cpred & oxy) | (~cpred & axy & oxy);
    Кстати, в alwaysе, начинающемся со строки 1014, с комментарием "ACLO edge detectors" нет ошибки? Там висящий блок begin end, который перебивает действие того, что было сделано ранее.
    Цитата Сообщение от Vslav Посмотреть сообщение
    На HDL модуль скорее соответствует макросу на C
    Это я понял, но я хочу сделать его именно функцией, это очень сильно упрощает программирование. Например модуль vm1_vgen у меня выродился в одну линейную функцию из простых присваиваний, alwaysы там оказались не нужны.
    Предположим, что модуль - это такая микросхема с ножками, на вход подаётся ТЧ и входные сигналы, и в заданные моменты снимаются выходные сигналы. При этом, предполагаем, что наша модель идеальна (нет переходных состояний) и дискретна, меняет своё состояние только в моменты фронтов ТЧ. Субмоуль - точно также. При этом модулю, в котором вызывается субмодуль совершенно необязательно знать, что происходит внутри субмодуля, достаточно знать что на входе и что на выходе в заданные конкретные моменты времени, соответствующие его, модуля, дискретным состояниям. Поэтому наверняка субмодуль можно описать в виде триггера блоком(ами) always с условиями которые соответствуют условиям always внутри субмодуля.

  10. #549

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    Вот например, строки 1540-1541:
    Код:
    assign cpred   = {c[14:0], cl};
    assign c       = (cpred & oxy) | (~cpred & axy & oxy);
    Дык, это не замкнутая петля. Каждый бит результата сам от себя не зависит, а только от предыдущего разряда. Перепишем явно с указанием разрядов:
    Код:
    assign cpred[15:0]   = {c[14:0], cl};
    assign c[15:0]     = (cpred[15:0] & oxy[15:0]) | (~cpred[15:0] & axy[15:0] & oxy[15:0]);
    Затем рассмотрим, например, разряд c[1]:
    Код:
    assign cpred[1]   = c[0];
    assign c[1]     = (cpred[1] & oxy[1]) | (~cpred[1] & axy[1] & oxy[1]);
    Делаем подстановку:
    Код:
    assign c[1]     = (c[0] & oxy[1]) | (~c[0] & axy[1] & oxy[1]);
    Итого: c[i+1] зависит от c[i], но никак от самого себя. Вычисляем их в таком порядке: c[0], c[1] ... c[14], c[15] и удается все вычислить за один проход. Ну или через сдвиг сразу словом.
    Update: тут я, кажется, погорячился - сразу за одну операцию не получится, надо вычислять именно последовательно - разряд за разрядом.

    Цитата Сообщение от gid Посмотреть сообщение
    Кстати, в alwaysе, начинающемся со строки 1014, с комментарием "ACLO edge detectors" нет ошибки? Там висящий блок begin end, который перебивает действие того, что было сделано ранее.
    Да, спасибо, это ошибка, согласно схемы должно быть так:
    Код:
    always @(posedge pin_clk_p)
    begin
       if (reset | aclo_ack)
          aclo <= 1'b0;
       else
          if (~pin_aclo)
             aclo <= 1'b1;
    
       if (pin_dclo | aclo_ack)
          acok <= 1'b0;
       else
          if (pin_aclo)
             acok <= 1'b1;
    end
    Цитата Сообщение от gid Посмотреть сообщение
    Например модуль vm1_vgen у меня выродился в одну линейную функцию из простых присваиваний, alwaysы там оказались не нужны.
    Да, это вот такой верилог, always @(*) вырождается/представляется в набор assign. В-общем-то, и наоборот все assign-ы можно переписать через always @(*). Но я сознательно использовал always для триггеров, а assign для комбинационной логики. Но пару мест все-таки попалось, где это введенное мной стилистическое правило не соблюлось.

    Цитата Сообщение от gid Посмотреть сообщение
    модуля, дискретным состояниям. Поэтому наверняка субмодуль можно описать в виде триггера блоком(ами) always с условиями которые соответствуют условиям always внутри субмодуля.
    Это да, а в чем вопрос? Представить модуль в виде объекта С++? Можно, но метод always объекта надо будет вызывать в методе always всей системы, и надо будет мониторить изменение выходов объекта. А если совсем не лезть внутрь, то не получится проанализировать и выстроить assign-ы так чтобы вычислить за один проход.
    Последний раз редактировалось Vslav; 22.04.2015 в 09:31.

  11. #550

    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    613
    Спасибо Благодарностей отдано 
    18
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    136 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    тут я, кажется, погорячился
    Т.е. в самом исходнике на верилоге необходимо прямо расписать всё это побитно?
    Цитата Сообщение от Vslav Посмотреть сообщение
    Ну или через сдвиг сразу словом.
    Вот это как раз у меня и не получается. Нужно где-то хранить предыдущее состояние одной из переменных чтобы вычислить результат.
    Например, если сделать так:
    Код:
    assign c       = (cpred & oxy) | (~cpred & axy & oxy);
    assign cpred   = {c[14:0], cl};
    то нужно знать начальное значение cpred и в момент времени 0, его инициализировать например нулём. Или это задом наперёд и неправильно по схеме?
    Цитата Сообщение от Vslav Посмотреть сообщение
    Это да, а в чем вопрос?
    Вопрос отпал, я просто развернул vm1_reg_ff как макрос, чтобы не ломать голову.

Страница 55 из 273 ПерваяПервая ... 515253545556575859 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 7
    Последнее: 28.06.2014, 17:50
  2. Микросхемы МПК 580,1801,1810 и другие...
    от Alex_Vac в разделе Барахолка (архив)
    Ответов: 44
    Последнее: 07.04.2012, 08:03
  3. ЦИФРОВАЯ МУЗЫКА НА ZX
    от AAA в разделе Музыка
    Ответов: 98
    Последнее: 18.09.2011, 22:33
  4. Учебный стенд УМПК-1801
    от dk_spb в разделе ДВК, УКНЦ
    Ответов: 2
    Последнее: 12.05.2010, 16:52
  5. Цифровая музыка от Вадима Ермеева
    от zxmike в разделе Музыка
    Ответов: 2
    Последнее: 06.08.2007, 23:13

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •