Вложенные операторы if (rise_edge (clk)) в VHDL

поэтому я наткнулся на старый код, который мне нужно воспроизвести, но он не будет компилироваться с новым компилятором Xilinx, поэтому мне нужно точно выяснить, что он делает. У меня примерно так:

if rising_edge(clk) then
   —do some things
   if rising_edge(clk) then
      —do some other things
   end if
end if

Требуется ли 2 тактовых цикла, чтобы добраться до внутреннего оператора if, или второй оператор if просто избыточен?

Кроме того, Xilinx выдает ошибку: «Логика для сигнала управляется часами, но не является действительным последовательным описанием».

Спасибо, и любая помощь приветствуется.


person Jamal    schedule 16.06.2011    source источник


Ответы (4)


Если он синтезировался до того, это был сбой / ошибкой синтезатора. Насколько вы уверены, что код соответствует тому, что было протестировано и определено как работающее? (Похоже, у вас есть только чье-то слово, подтверждающее, что это правильный код, который был синтезирован ранее.)

Доступна ли существующая система для сравнения и тестирования? Какие версии инструментов используются? Можете ли вы использовать старые инструменты и убедиться, что они синтезируют и какие предупреждения выдают? В зависимости от того, какую версию вы используете, вы можете использовать отчет синтеза, fpgaeditor (или аналогичный), чтобы посмотреть, что на самом деле синтезировано.
Или вы можете проанализировать код, чтобы увидеть, что задумал дизайнер, и продублировать это с действительным HDL .

Если все, что у вас осталось, не получится, это метод проб и ошибок. Попробуйте предположить:

  1. Операторы внутри вложенного нарастающего фронта всегда активны. (Удалите вложенный нарастающий фронт оператора if, оставив окруженный блок кода).
  2. Операторы внутри вложенного нарастающего фронта никогда не активны. Удалите весь вложенный блок переднего фронта.
  3. Вы могли бы попробовать, но я действительно не могу представить, как синтезатор может создать из этого 2-тактную задержку. Вы можете столкнуться с этой или другой, еще более маловероятной ситуацией. Очень сложно предсказать, каким будет этот режим отказа.
person davidd    schedule 16.06.2011
comment
Спасибо за такой отличный ответ! Я почти уверен, что могу определить намерения первоначальных авторов по остальной части кода (без комментариев, заметьте), и я собираюсь попробовать реализовать это и посмотреть, что произойдет. Спасибо за помощь! - person Jamal; 17.06.2011
comment
Я не уверен, что это будет ошибкой, если синтезатор примет это. Второй оператор if всегда будет проходить при моделировании (проверяется то же условие). Хотя для инструмента синтеза имеет смысл отказаться от двух вложенных краевых условий, также имеет смысл просто игнорировать второе условие. Тем не менее, код действительно должен быть изменен, чтобы он имел только одно обнаружение края. - person Philippe; 19.06.2011

Учитывая, что rising_edge(clk) равно true для первого if, конечно, это все еще верно для второго вложенного if. Это предполагает, что в разделе -- do some stuff не прошло времени, что, вероятно, и имеет место.

Следовательно, это второе if может быть заменено на _6 _... или вообще исключено!

person Martin Thompson    schedule 17.06.2011

Это просто невозможно синтезировать ни в одном инструменте, который я видел. Не делайте этого даже для симуляции.

Второй оператор rise_edge не является последовательным оператором, например назначение. Это утверждение требует времени, поэтому вы можете быть уверены в этом.

person Brian Carlton    schedule 16.06.2011
comment
Я тоже не могу заставить его синтезировать, и, честно говоря, я бы никогда не подумал написать об этом. Я просто пытаюсь определить намерения первоначального автора, чтобы можно было перезаписать код. По-видимому, со старым синтезатором это работало, по крайней мере, мне так сказали. - person Jamal; 16.06.2011
comment
Второй, если не требует прохождения времени, это тот же тест, что и первый (если clk = '1' и clk'event) - person Martin Thompson; 17.06.2011

на самом деле вы хотите вывести вложенные синхронизированные процессы.

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

Вам следует переписать свой код в соответствии с xst.pdf (например, если вы используете Xilinx ISE).

С уважением, Николаос Каввадиас

person Nikolaos Kavvadias    schedule 23.06.2011