在您的第一段代码中 - 作为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;
初始条件:sigis1和sig2is 0,所以我们只是在等待clk边缘。
当时钟沿到达时,我们进入我们看到的第一个进程,sig即1分配1给sig2。到目前为止一切都很简单,但是因为sig2是一个信号,所以在过程完成之前不会发生分配。比意味着当我们在下一行比较时,它会是假的(sig2现在仍然是),我们不会。然后我们结束这个过程。1sig20-- 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 如何安排事物的重要部分。