VHDL - 等待<signal>语句

时间:2016-01-27 13:10:38

标签: vhdl

我试图通过WAIT ON语句的示例。每当我尝试编译编译器的代码时,Quartus II都会给出以下错误消息。

  

错误(10533):T1.vhd处的VHDL等待语句错误(23):等待语句必须包含带有UNTIL关键字的条件子句

模型架构如下。它的功能并不重要,只是编译器要求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;

最好的问候 d

1 个答案:

答案 0 :(得分: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_edgefalling_edge函数:

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

最后,这里表示的整个结构看起来非常不标准。编写时钟进程的常用方法如下:

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