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_edge
和falling_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;
我正在尝试完成 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_edge
和falling_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;