在您的第一段代码中 - 由于var2 是一个变量,它会立即获得新值。因此if 语句将看到新值,而//do something 将在同一时间片内发生。
(// cmets?真的吗?这是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 是 1 和 sig2 是 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 如何安排事物的重要部分。