在你的第一段代碼 - 由於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
是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安排事情的重要組成部分。
嗨,謝謝你的回答,我現在明白了。但是,由於sig <='1'仍然會使if語句執行,而sig2會不斷地被賦值爲'1'?或者它不知何故知道它已經是'1',並且跳過那條語句? (只是因爲你沒有在你的例子中的'do something'之前顯示sig2 <='1') –
你是對的。它會不斷地被分配'1',但是因爲這不是從當前值的變化,所以它不會導致第二個過程重新評估。我只列出了會導致某些事情發生的任務。 –