VHDL 信号分配是否设置目标值或参考?

Do VHDL signal assignments set destination value or reference?

很抱歉标题问题的措辞繁琐,但想不出任何其他方式来简洁地提出问题。我知道这与 pass-by-value 与参考二分法有很大不同,但类似于。我想知道以下哪些代码片段的行为相同:

声明:

Port (source : in STD_LOGIC);
...
signal destination : STD_LOGIC := '0';

#1 - 在时钟

上设置 "value"
process (clk) begin 
    if falling_edge(clk) then
       if source = '1' then
            destination <= '1';
        else
            destination <= '0';
        end if;

#2 - 设置一个 "reference" 通用

-- Top-Level
destination <= source;

#3 - 在时钟

上设置(值?参考?)
process (clk) begin 
    if falling_edge(clk) then
        destination <= source;

代码段 #1 将在时钟周期的每个下降沿更改目标值以匹配源。在#2 中,目标将变为 'connected' 到源,并且无论时钟周期如何,源的变化都会跟随目标。我不确定#3;它的行为是否像 #1 或 #2,获取源的值并将其放入目标,或者像 top-level 赋值那样将两者链接在一起?

#1

此进程有一个敏感列表。当敏感列表中的任何信号发生 事件 (值发生变化)时,该过程开始执行。此进程在敏感列表中有一个信号 - clk - 因此当该信号发生变化时,进程开始执行。如果该更改是上升沿,则 if 语句中的条件计算为 FALSE,因此不再执行任何代码行并且进程 暂停 (去睡觉)。但是,如果该变化是下降沿,则 if 语句中的条件计算为 TRUE,因此,根据 source 的值,执行两行代码之一为 destination 赋值。这是真正重要的一点:

When a line of code containing a signal assignment (<=) is executed in VHDL (and the effect is to change the value of the target signal - the signal on the LHS of the assignment), an event is placed on the what I shall call the event queue.

事件队列 是模拟器的待办事项列表,放置在其中的事件将在未来某个时间执行。如果没有明确指定延迟,则该事件将在下一个 模拟周期 (或 增量周期 )上发生作用。忍...

因此,假设执行包含信号分配的行的效果是更改 destination 的值,那么执行这些行的效果是将事件放入事件队列。然后进程挂起。

所有进程挂起后,模拟器会查看其事件队列并将模拟时间向前移动到队列中下一个事件的时间。在这种情况下,该事件将被安排在下一个模拟周期,因此模拟器时间提前一个模拟周期,并且该周期的事件将被执行。如果任何敏感列表包含一个信号,该信号已通过操作其中一个事件而改变,那么整个循环将再次开始:进程被执行,包含信号分配的代码行被执行,新事件被放置在事件队列中未来时间...

#3

从本次讨论的角度来看,案例 #3 与案例 #1 完全相同。 clk 上的下降沿将导致执行包含信号分配的代码行,如果需要更改目标信号 (destination) 上的值,则事件将放置在在下一个模拟周期发生变化的事件队列。

#2

案例 #2 显然不依赖于 clk,所以是不同的。但是,#2 是 并发信号分配 的示例。这是一个有效且隐式的过程:您将获得一个隐式灵敏度列表,其中包含信号分配 RHS 上的任何信号。在这种情况下,隐式敏感性列表包含一个信号 - source。因此,如果源上有事件,则(隐式)进程开始执行,导致包含正在执行的信号分配的代码行,从而导致事件被放置在事件队列中(这将被安排用于下一次模拟循环)。

所以,回答你的问题:"do VHDL signal assignments set destination value or reference?"

The value that is placed on the event queue (ie the value to which the target signal is to be driven) is the value that was evaluated at the time the line of code containing the signal assignment was executed.

因此,在情况 #3 中,分配给事件队列中 destination 的值是 source 信号在包含该信号的代码行时所具有的值任务被执行。如果你想计算那个 'pass by copy' 那么就这样做,但我不会把这个类比做得太远。


注意:LRM - VHDL 标准 - 使用术语 投影输出波形 来表示我所说的 事件队列