我试图通过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
答案 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_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;