我为标题问题的繁琐措辞道歉,但不能想到任何其他方式来简明扼要地提问。我知道这与传值和参考二分法完全不同,但却类似。我想知道以下哪些代码片段的行为相同:
声明:
@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,获取源的值并将其放在目的地中,或者将两者链接在一起,就像在顶级作业中一样?
答案 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标准)使用术语投影输出波形来表示我称之为事件队列的内容。