VHDL-等待<;信号>;陈述

VHDL-等待<;信号>;陈述,vhdl,Vhdl,我正在尝试处理WAIT-ON语句的一个示例。每次我试图用编译器编译代码时,Quartus II都会给我以下错误消息 错误(10533):VHDL等待语句在T1处出错。vhd(23):等待语句必须包含带有UNTIL关键字的条件子句 模型架构如下所示。它的功能并不重要,只是因为编译器需要一个UNTIL语句。我所看到的所有例子、互联网和书籍都显示了它的用途如下: ARCHITECTURE dflow OF T1 IS SIGNAL middle : std_logic; BEGIN P1 : PR

我正在尝试处理WAIT-ON语句的一个示例。每次我试图用编译器编译代码时,Quartus II都会给我以下错误消息

错误(10533):VHDL等待语句在T1处出错。vhd(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;
T1的架构数据流是 信号中间:标准逻辑; 开始 P1:过程是 开始 如果CLK='1',则
中间我认为这里的基本问题是

WAIT ON CLK;
正在等待
CLK
上的任何类型的事件。例如,这可能是从
'H'
'1'
的转换,也可能是
CLK
的上升或下降边缘。在这两种情况下,FPGA中都没有真正的硬件能够以这种方式工作。对于您来说,很明显您正在寻找一个上升的边缘,因为CLK='1'行是
的,但这不是合成工具所看到的

通过在
之前添加一个
,您可以缩小您感兴趣的特定事件的范围,希望选择能够在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'事件和clk='1'
边缘检测技术。这不是一种推荐的方法,因为由于模拟器响应从
'H'
'1'
的转换(除其他可能性外),可能会导致模拟与现实不匹配,这是硬件无法做到的

建议使用
上升沿
下降沿
功能检测边缘:

wait until falling_edge(clk); -- OK, no ambiguity here.
最后,这里表示的整个结构看起来非常不标准。编写时钟进程的常用方法如下:

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

我认为这里的基本问题是线路

WAIT ON CLK;
正在等待
CLK
上的任何类型的事件。例如,这可能是从
'H'
'1'
的转换,也可能是
CLK
的上升或下降边缘。在这两种情况下,FPGA中都没有真正的硬件能够以这种方式工作。对于您来说,很明显您正在寻找一个上升的边缘,因为CLK='1'
行是
的,但这不是合成工具所看到的

通过在
之前添加一个
,您可以缩小您感兴趣的特定事件的范围,希望选择能够在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'事件和clk='1'
边缘检测技术。这不是一种推荐的方法,因为由于模拟器响应从
'H'
'1'
的转换(除其他可能性外),可能会导致模拟与现实不匹配,这是硬件无法做到的

建议使用
上升沿
下降沿
功能检测边缘:

wait until falling_edge(clk); -- OK, no ambiguity here.
最后,这里表示的整个结构看起来非常不标准。编写时钟进程的常用方法如下:

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

允许合成限制它接受的VHDL构造的范围。在这种情况下,
等待上升沿(clk)可能被接受,正如错误消息所暗示的那样。请注意,
等待
如果需要检测两个时钟边缘,则会出现问题,常规FPGA硬件无法支持这一点。如果需要使用
等待
。。。模拟。@BrianDrummond是
等待clk
相当于
等待clk'event
,因此在合成上下文中不明确?允许合成限制其接受的VHDL构造的范围。在这种情况下,
等待上升沿(clk)可能被接受,正如错误消息所暗示的那样。请注意,
等待
如果需要检测两个时钟边缘,则会出现问题,常规FPGA硬件无法支持这一点。如果需要使用
等待
。。。模拟。@BrianDrummond是
等待clk
相当于
等待clk'event
,因此在合成的上下文中是不明确的?嗨,杰夫,谢谢你花时间整理出一个非常好的答案。嗨,杰夫,谢谢你花时间整理出一个非常好的答案。