对于以无条件wait
语句结尾的VHDL进程,我有些不了解。为了说明我的问题,我需要比较以下两个片段:
片段1:
library ieee;
use ieee.std_logic_1164.all;
entity foo is
end entity;
architecture sim of foo is
signal clk : std_logic := '0';
signal s : std_logic;
begin
clk <= not clk after 10 ns;
-- driver1
s <= '0';
-- driver2
process (clk) is
begin
s <= clk;
end process;
end architecture;
信号s有两种分配方式:驱动程序1将信号s驱动为“ 0”,而驱动程序2则将信号s驱动为“ 0”和“ 1”。正如我们在波形图上看到的那样,当clk为'0'时,结果s为'0'(绿色段),但当clk为'1'时,结果s为'X'(红色段)。
=>我了解这种行为,没有问题。
如果我通过将driver1更改为以无条件wait
指令结束的进程来对此代码进行一些修改:
snipet2:
library ieee;
use ieee.std_logic_1164.all;
entity foo is
end entity;
architecture sim of foo is
signal clk : std_logic := '0';
signal s : std_logic;
begin
clk <= not clk after 10 ns;
-- driver1
-- s <= '0';
process
begin
s <= '0';
wait;
end process;
-- driver2
process (clk) is
begin
s <= clk;
end process;
end architecture;
令人惊讶的是,对于我来说,片段2产生与片段1相同的波形。我的理解是,带有最终“无条件” wait
语句的进程中的指令将永远停止,这意味着它们的代码将在第一次执行运行后处于非活动状态。但是,如果确实如此,我希望snipet 2中的driver1在第一次运行后就处于非活动状态,并且从那时起,driver2仍然是信号s的唯一活动驱动程序,始终为其分配clk的替代值'1'和'0'。
为什么不这样?
答案 0 :(得分:2)
在过程中分配信号时,会从分配信号的那一刻开始直到模拟结束,为该信号创建驱动程序。因此,这两个代码段在功能上是等效的,您从时间0开始创建driver1,从第一个时钟开始创建driver2。