VHDL - 等待 <signal> 语句

VHDL - WAIT ON <signal> statement

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

Error (10533): VHDL Wait Statement error at T1.vhd(23): Wait Statement must contain condition clause with UNTIL keyword

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

我认为这里的基本问题是行

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.

最后,这里表示的整个结构看起来很漂亮 non-standard。时钟进程的常用写法是这样的:

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