在您的第一段代码中 - 作为var2
一个变量,它将立即获得新值。因此,该if
语句将看到新值,并将//do something
在同一时间片内发生。
(//
评论?真的吗?这是 VHDL。我们用过--
)
您的第二段代码不起作用。变量的作用域是进程,不能用于在进程之间传递值。您必须使用信号,因此规则会发生变化。考虑这段代码:
signal sig : std_logic := 1;
signal sig2 : std_logic := 0;
process (clk)
if (sig = '1') then
sig2 <= '1';
end if;
if (sig2 = '1') then
-- do something
end if;
end process;
process (sig2)
if (sig2 = '1') then
-- do something else
end if;
end process;
初始条件:sig
is1
和sig2
is 0
,所以我们只是在等待clk
边缘。
当时钟沿到达时,我们进入我们看到的第一个进程,sig
即1
分配1
给sig2
。到目前为止一切都很简单,但是因为sig2
是一个信号,所以在过程完成之前不会发生分配。比意味着当我们在下一行比较时,它会是假的(sig2
现在仍然是),我们不会。然后我们结束这个过程。1
sig2
0
-- do something
现在,因为在第一个进程sig2
更改值结束时,0 -> 1
第二个进程将被触发(它对 敏感sig2
)。它看到了sig2
,1
所以它会-- do something else
的。
当下一个时钟沿到来时(并且它可能是此代码的负沿),sig2
仍然1
如此,所以现在我们将-- do something
,我们将为每个时钟沿执行此操作。
总之,此代码的事件顺序为:
Clk : 0->1
Sig2 : 0->1
-- Do Something Else
Clk : 1->0
-- Do Something
Clk : 0->1
-- Do Something
Clk : 1->0
-- Do Something
Clk : 0->1
-- Do Something
.........
当您了解该排序时,您将了解 VHDL 如何安排事物的重要部分。