无条件的WAIT语句对VHDL中的进程的影响

时间:2018-10-08 13:51:03

标签: vhdl

对于以无条件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'(红色段)。 enter image description here =>我了解这种行为,没有问题。

如果我通过将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'。

为什么不这样?

1 个答案:

答案 0 :(得分:2)

在过程中分配信号时,会从分配信号的那一刻开始直到模拟结束,为该信号创建驱动程序。因此,这两个代码段在功能上是等效的,您从时间0开始创建driver1,从第一个时钟开始创建driver2。