Перейти к содержанию
    

Altera Quartus 4.1 SP2 Verilog BUG ???

Есть такое описание:

 

/***************************************************/

ВАРИАНТ 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не имею данной версии так что проверил в MAX все работает в симуляторе только вместо запятой or

будет ли работать в железе это вопрос. смахивает на double фронт. далеко не все плис его поддерживают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я попробывал для MAX7000S и для ACEX2. Для FPGA на выходе единица, для CPLD ноль. Тоже очень забавно. Я правда не смотрел, что синтезируеться для FPGA. Но хрен редьки не слаще

 

Спасибо за ответ!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пример 1 очень смахивает на описание D тригера с ассинхронным сбросом видимо его и генерит. тогда второе условие может трактоваться как константа.

 

смотри RTL там все понятно почему код не рабочий

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пример 1 очень смахивает на описание D тригера с ассинхронным сбросом видимо его и генерит. тогда второе условие может трактоваться как константа.

 

смотри RTL там все понятно почему код не рабочий

Спасибо за ответ!

 

Действительно генерится Д-триггер, но не с асинхронным сбросом, а асинхронной установкой.

 

А баг, сейчас я могу утверждать что именно он, в синтезе с мультиплексором на входе Д-триггера. Который србатывает позже, чем триггер. И на выходе треггера сохраняется предыдущее значение.

 

Это жук ещё потому, что в МАХе синтезируется рабочая схема. Кроме того, я попробывал этот тест в Xilinx ISE 6.3, там синтез похож но без жука в виде мультиплексора. См. приложение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...