2016-01-27 3 views
0

Я пытаюсь работать с примером заявления WAIT ON. Каждый раз, когда я пытаюсь скомпилировать свой код, компилятор Quartus II дает мне следующее сообщение об ошибке.VHDL - WAIT ON <signal> statement

Ошибка (10533): VHDL Подождите Заявление об ошибке на T1.vhd (23): Подождите заявление должно содержать положение условие с ключевым словом ПОКА

модель архитектуры не ниже. Его функция не важна только по той причине, почему компилятор запрашивает инструкцию UNTIL. Все примеры, которые я видел, интернет и книги показывают его использование в качестве таковых ниже:

ARCHITECTURE dflow OF T1 IS 
SIGNAL middle : std_logic; 
BEGIN 
P1 : PROCESS IS 
BEGIN 
     IF CLK = '1' THEN 
      middle <= input; 
     END IF; 
    WAIT ON CLK; 
END PROCESS P1; 
OUTPUT <= MIDDLE; 
END ARCHITECTURE dflow; 

Best Regard D

+0

Синтез позволяет ограничивать диапазон конструкций VHDL, которые он принимает. В этом случае, 'wait until rising_edge (clk);', вероятно, принято, что подразумевается сообщением об ошибке. Учтите, что 'wait on' проблематично, если для этого требуется обнаружение обоих краев тактовых импульсов, обычное аппаратное обеспечение FPGA не может это поддерживать. Если вы хотите использовать 'WAIT ON' ... имитировать. –

+0

@BrianDrummond 'wait on clk' эквивалентен' wait до clk'event' и, следовательно, неоднозначен в контексте синтеза? –

ответ

2

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

WAIT ON CLK; 

является ожидая любой тип события на CLK. Это может быть переход от 'H' к '1', например, или это может быть либо восходящий, либо падающий край CLK. В любом из этих случаев в FPGA нет реального оборудования, которое может работать таким образом. Может показаться вам очевидным, что вы ищете нарастающий фронт из-за линии if CLK = '1', но это не так, как это делает инструмент синтеза.

Добавляя until, вы можете сузить область поиска, которая вас интересует, и мы надеемся выбрать что-то, что может быть реализовано в FPGA. Примеры:

wait on clk until clk = '1'; -- Detect a rising edge, OK (ish, see below) 
wait on clk until clk = '0'; -- Detect a falling edge, OK (^^) 

Этот метод аналогичен clk'event and clk = '1' методики обнаружения края. Это не рекомендуется, потому что вы можете получить несоответствие симуляции реальности из-за того, что симулятор реагирует на переходы от 'H' до '1' (среди других возможностей), что-то, что аппаратное обеспечение не может сделать.

Рекомендуемый метод обнаружения края является с функциями rising_edge и falling_edge:

wait until falling_edge(clk); -- OK, no ambiguity here. 

Наконец, вся структура представлена ​​здесь выглядит довольно нестандартно. Обычный способ записи тактового процесса выглядит так:

process (clk) 
begin 
    if (rising_edge(clk)) then 
    -- Do something 
    end if; 
end process; 
+0

Привет, Джефф, и спасибо за ваше время, собрав действительно хороший ответ. – hoboBob