emerg_reanimator 0 30 октября, 2004 Опубликовано 30 октября, 2004 · Жалоба Есть такое описание: /***************************************************/ ВАРИАНТ 1 /***************************************************/ module test( input n_in_en1, in_en2, output out1 ); reg out1 ; always @( negedge n_in_en1, posedge in_en2 ) begin if ( n_in_en1 == 0 ) out1 = 1 ; else if ( in_en2 == 1 ) out1 = 0 ; end endmodule /***************************************************/ Ожидаемый результат очивиден, но на выходе неизменно стоит лог. ноль. При удалении второго условия ("if ( in_en2 == 1 )"), кодер (по моему похож на кодер) работает корректно. По срезу первого сигнала выход лог. единица, по фронту вторго сигнала выход лог. ноль. В первом случае (с использованием вторго условия, что по моему более правильно и наглядно) Quartus синтезирует Д-тригер и мультилпексор. Мультиплексор имеет два входа, на один подаётся единица, на второй выход тригера, выбор входа-первый сигнал. Вроде всё правильно: Если активен первый сигнал (лог. ноль), то на выходе мультиплексора лог. единица. Тригер сбрасывается по второму сигналу, на входе подаётся выход мультиплексора. А сигнал разрешения-это опять же первый сигнал (инвертированный). /***************************************************/ ВАРИАНТ 2 /***************************************************/ module test( input n_in_en1, in_en2, output out1 ); reg out1 ; always @( negedge n_in_en1, posedge in_en2 ) begin if ( n_in_en1 == 0 ) out1 = 1 ; else out1 = 0 ; end endmodule /*************************************************** Во втором случае (с использование только первого условия), синтезируется только Д-тригер. На входе лог. единица, сборс второй сигнал, сигнал разрешения первый инвертированный сигнал. Вопрос: Почему не работает первый вариант? test.v Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hlebn 0 30 октября, 2004 Опубликовано 30 октября, 2004 · Жалоба не имею данной версии так что проверил в MAX все работает в симуляторе только вместо запятой or будет ли работать в железе это вопрос. смахивает на double фронт. далеко не все плис его поддерживают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
emerg_reanimator 0 31 октября, 2004 Опубликовано 31 октября, 2004 · Жалоба Я попробывал для MAX7000S и для ACEX2. Для FPGA на выходе единица, для CPLD ноль. Тоже очень забавно. Я правда не смотрел, что синтезируеться для FPGA. Но хрен редьки не слаще Спасибо за ответ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hlebn 0 31 октября, 2004 Опубликовано 31 октября, 2004 · Жалоба пример 1 очень смахивает на описание D тригера с ассинхронным сбросом видимо его и генерит. тогда второе условие может трактоваться как константа. смотри RTL там все понятно почему код не рабочий Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
emerg_reanimator 0 20 ноября, 2004 Опубликовано 20 ноября, 2004 · Жалоба пример 1 очень смахивает на описание D тригера с ассинхронным сбросом видимо его и генерит. тогда второе условие может трактоваться как константа. смотри RTL там все понятно почему код не рабочий Спасибо за ответ! Действительно генерится Д-триггер, но не с асинхронным сбросом, а асинхронной установкой. А баг, сейчас я могу утверждать что именно он, в синтезе с мультиплексором на входе Д-триггера. Который србатывает позже, чем триггер. И на выходе треггера сохраняется предыдущее значение. Это жук ещё потому, что в МАХе синтезируется рабочая схема. Кроме того, я попробывал этот тест в Xilinx ISE 6.3, там синтез похож но без жука в виде мультиплексора. См. приложение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться