流程语句中的(并发)信号分配是顺序的还是并发的?

时间:2013-10-06 14:11:57

标签: vhdl

据我所知,PROCESS中的所有语句都是按顺序执行的。那么并发信号分配会发生什么(< =)?它是否与顺序赋值(:=)的工作方式相同,还是在增量延迟后执行?

如果在delta延迟之后执行,那么PROCESS中的所有语句如何被称为顺序?

如果它立即执行,那么在一个过程中,= =和< =之间是否有任何区别?

2 个答案:

答案 0 :(得分:7)

在完成处理中的所有顺序代码之后执行信号分配(< =)。这是当该时间步的所有活动进程完成时。

作为一个例子,为什么:

  

假设您有一个触发2个进程的事件。这两个过程   使用相同的信号,但其中一个改变了它的值   信号。模拟器只能执行一个过程   时间由于顺序模拟模型(不要混淆   vhdl的并发模型。因此,如果首先模拟过程A和A   改变信号,B会有错误的信号值。因此   只有在完成所有触发过程后才能更改信号。

变量赋值(:=)不可复制地执行,可用于例如暂时将一些数据存储在流程中。

答案 1 :(得分:4)

与顺序变量分配(:=)相反,顺序信号分配(< =)顺序地调度事件一个增量延迟,以便更新信号的值。您可以通过在同一进程中对同一信号使用顺序信号分配来更改预定事件。仅发生在特定信号上安排的最后更新。例如:

signal a : std_logic := '1'; --initial value is 1

process(clk)
  variable b : std_logic;
begin
  --note that the variable assignment operator, :=, can only be used to assign the value of variables, never signals
  --Likewise, the signal assignment operator, <=, can only be used to assign the value of signals.
  if (clk'event and clk='1') then
    b := '0' --b is made '0' right now.
    a <= b; --a will be made the current value of b ('0') at time t+delta
    a <= '0'; --a will be made '0' at time t+delta (overwrites previous event scheduling for a)
    b := '1' --b will be made '1' right now. Any future uses of b will be equivalent to replacing b with '1'
    a <= b; --a will be made the current value of b ('1') at time t+delta
    a <= not(a); --at time t+delta, a will be inverted. None of the previous assignments to a matter, their scheduled event have been overwritten
    --after the end of the process, b does not matter because it cannot be used outside of the process, and gets reset at the start of the process
  end if;
end process;

同样重要的是要注意,虽然顺序过程从VHDL的逻辑角度顺序操作,但在合成时,它们实际上变成了连接触发器的复杂并发语句。整个过程作为每个时钟周期之间的一个单元同时运行(不在时钟上运行的过程成为纯组合逻辑)。信号是实际存储在触发器中的值。变量只是别名,使进程更容易阅读。它们在综合后被吸收到组合逻辑中。