Rus*_*ell 8 fpga vhdl modelsim
下面是我正在运行的代码.我的问题是为什么wait until在modelsim 中没有第三个触发器?控制台输出很简单GOT HERE.它从来没有上线GOT HERE 2.我认为wait until <SIGNAL> = 1连续两次相同会很好,因为两次都是正确的.我没有在那里添加'事件,所以我不认为模拟器需要看到边缘.谁能解释这种行为?
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity example_wait_failure is
end example_wait_failure;
architecture behave of example_wait_failure is
signal r_CLK_TB : std_logic := '0';
begin
r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns;
p_TEST : process
begin
wait until r_CLK_TB = '1';
report "GOT HERE" severity note;
wait until r_CLK_TB = '1';
wait until r_CLK_TB = '1';
report "GOT HERE 2 " severity note;
end process p_TEST;
end behave;
Run Code Online (Sandbox Code Playgroud)
Mor*_*mer 12
行为在wait语句的细节中(Jim Lewis引用的等待细节).原因是这些wait陈述有三个部分:
wait
[on sensitivity_list]
[until condition]
[for time_expression]; -- Only for timeout, and not relevant here
Run Code Online (Sandbox Code Playgroud)
的wait在相关代码只具有一个until部分,所以将sensitivity_list根据VHDL标准创建的:"如果没有出现灵敏度子句,灵敏度组根据下列(递归)规则构造:...".在这种情况下,生成的sensitivity_list将包含r_CLK_TB.
VHDL标准有一个精确匹配代码的例子,这表明:
wait until r_CLK_TB = '1';
Run Code Online (Sandbox Code Playgroud)
与以下内容相同:
loop
wait on r_CLK_TB;
exit when r_CLK_TB = '1';
end loop;
Run Code Online (Sandbox Code Playgroud)
因此,即使wait没有明确包含wait until
r_CLK_TB'event(写在评论),在等待,直到一个事件的执行结果r_CLK_TB,以通过第一wait中wait on r_CLK_TB.这是直观的......自己判断;-)
所以也许原始代码应该改变:
wait until r_CLK_TB = '1';
Run Code Online (Sandbox Code Playgroud)
替换为:
if r_CLK_TB /= '1' then
wait until r_CLK_TB = '1';
end if;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,"GOT HERE"和"GOT HERE 2"都显示为20 ns,因为这里所有三种结构的条件都为TRUE.
| 归档时间: |
|
| 查看次数: |
10463 次 |
| 最近记录: |