【问题标题】:Unconditional WAIT statement's effect on processes in VHDL无条件 WAIT 语句对 VHDL 中进程的影响
【发布时间】:2018-10-08 13:51:02
【问题描述】:

关于以无条件wait 语句结尾的 VHDL 进程,我有一些不明白的地方。为了说明我的问题,我需要比较以下 2 个片段:

片段 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 有双重分配:Driver1 将信号 s 驱动为“0”,而 driver2 交替将其驱动为“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'。

为什么不是这样?

【问题讨论】:

  • 您似乎将安静(不活跃)和断开连接(不驱动)混为一谈。
  • @user1155120。谢谢,所以wait 语句使流程执行在第一次迭代后停止,但保持信号(此处的信号 s)“连接”并在其余执行期间驱动到它们的当前值?

标签: vhdl


【解决方案1】:

当您在进程中分配信号时,会为该信号创建一个驱动程序,从它分配的那一刻到模拟结束。所以在这里,两个代码 sn-ps 在功能上是等效的,您从时间 0 创建 driver1,从第一个时钟创建 driver2。

【讨论】:

  • 老实说,当您在进程中分配信号时,会在精化过程中创建驱动程序,直到模拟结束。在执行包含信号分配的代码行之前,该类型的默认值由信号驱动(在本例中为'U')。当执行包含信号分配的代码行时,将驱动分配的任何值,直到执行分配给同一信号的另一行代码(或相同的代码)。在这种情况下,这是一个'0',它一直被驱动到模拟结束。
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多