Вложенные операторы if (rise_edge (clk)) в VHDL - PullRequest
3 голосов
/ 16 июня 2011

поэтому я наткнулся на какой-то старый код, который мне нужно скопировать, но он не скомпилируется с новым компилятором 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 выдает ошибку: «Логика для сигнала контролируется часами, но не представляется действительным последовательным описанием»

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

Ответы [ 4 ]

6 голосов
/ 17 июня 2011

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

Следовательно, эту секунду, если она может быть заменена на if true then ... или действительно пропущено!

1 голос
/ 16 июня 2011

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

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

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

  1. Операторы внутри вложенного переднего фронта всегда активны.(Удалите вложенный передний фронт, если оператор покидает код, который он окружил).
  2. Операторы внутри вложенного переднего края никогда не активны.Удалите весь вложенный блок переднего фронта.
  3. Вы можете попробовать это, но я действительно не могу представить, как синтезатор может создать из этого 2-тактную задержку.Возможно, вам придется попробовать эту или другие, даже более невероятные ситуации.Очень трудно предсказать, каким будет этот режим отказа.
1 голос
/ 16 июня 2011

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

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

0 голосов
/ 23 июня 2011

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

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

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

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

...