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

时间:2017-06-13 22:52:29

标签: vhdl

我为标题问题的繁琐措辞道歉,但不能想到任何其他方式来简明扼要地提问。我知道这与传值和参考二分法完全不同,但却类似。我想知道以下哪些代码片段的行为相同:

声明:

@Html.Label("",ViewBag.Error)

#1 - 设置"值"在时钟上

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

#2 - 设置"参考"普遍

process (clk) begin 
    if falling_edge(clk) then
       if source = '1' then
            destination <= '1';
        else
            destination <= '0';
        end if;

#3 - 设置时钟

上的(值?reference?)
-- Top-Level
destination <= source;

Snippet#1将在时钟周期的每个下降沿更改目标值以匹配源。在#2中,目的地将变为“连接”状态。对于源,无论时钟周期如何,源中的更改都将跟随目标。我不确定#3;它的行为类似于#1还是#2,获取源的值并将其放在目的地中,或者将两者链接在一起,就像在顶级作业中一样?

1 个答案:

答案 0 :(得分:3)

<强>#1

此过程具有敏感度列表。当灵敏度列表中的任何信号出现事件(值发生变化)时,该过程开始执行。此过程在灵敏度列表中有一个信号 - clk - 因此当该信号发生变化时,该过程开始执行。如果该更改是上升沿,则if语句中的条件评估为FALSE,因此不再执行代码行,并且进程挂起(进入休眠状态) )。但是,如果该更改是下降沿,那么if语句中的条件将计算为TRUE,因此,根据source的值,执行两行代码之一将值赋给destination。这是非常重要的一点:

  

当在VHDL中执行包含信号分配<=)的代码行时(效果是更改的值) >目标信号 - 分配的LHS上的信号),事件被放在我将称之为事件队列的事件上。

事件队列是模拟器的ToDo列表,放置在其上的事件将在未来某个时间执行。如果没有指定明确的延迟,那么该事件将在下一个模拟周期(或 delta cycle )上执行。忍受......

因此,假设执行包含信号分配的行的效果是更改destination的值,那么执行这些行的效果是在事件队列上放置一个事件。然后该过程暂停。

一旦所有进程都挂起,模拟器就会查看其事件队列,并将模拟时间向前移动到队列中下一个事件的时间。在这种情况下,该事件将被安排用于下一个模拟周期,因此模拟器时间提前一个模拟周期,并且该周期的事件被执行。如果任何敏感性列表包含通过操作其中一个事件而导致更改的信号,则整个周期再次开始:进程执行,包含信号分配的代码行被执行,新事件发生在事件队列中未来的时间......

<强>#3

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

<强>#2

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

所以,回答你的问题:“VHDL信号分配是设定目标值还是参考?”

  

放置在事件队列中的值(即目标信号要驱动的值)是在包含的代码行时计算的值信号分配已执行。

因此,在#3的情况下,分配给事件队列的destination的值是source信号在包含信号分配的代码行时的值。执行。如果你想要“通过副本”进行校准,那么就这样做,但我不会把这个类比推到很远的地方。

注意:LRM(VHDL标准)使用术语投影输出波形来表示我称之为事件队列的内容。