2012-12-19 34 views
10

對於VHDL中的過程是否可以執行兩個或多個順序運行?在VHDL中可重入進程嗎?

如果在順序執行過程未完成時發生另一事件(在靈敏度信號列表中)會發生什麼?

是否有可能或者我的VHDL模型記住過程是完全錯誤的?

+0

你可能想澄清一下你的問題 – briantyler

+0

你能用一些示例代碼來說明情況嗎?我相信我知道你在問什麼,但是如果沒有具體問題就很難回答。 –

回答

39

當進程正在運行時,不會發生任何事件!

當一個進程被某個事件喚醒時,它會運行到完成狀態(「結束進程」)或顯式的「等待」語句,然後進入休眠狀態。從理論上講,這需要零時間。這意味着如果您的流程中存在循環,它們將完全展開,並且當您合成時,您將生成足夠的硬件來並行運行每次迭代。而且,任何過程,函數等都需要零時間 - 除非它們包含明確的「等待」語句(在這種情況下,過程在「等待」中掛起,就像過程已被內聯一樣)。

在整個過程中,所有信號都具有它們最初在過程醒來時所具有的值,並且任何信號分配都被存儲起來,以便稍後發生。 (變量立即更新;後面的語句在過程中看到新的值)。

當進程掛起時(在「等待」或「結束進程」),沒有任何反應,直到所有其他進程也暫停。 (但請記住,他們都需要零時間!)。如果一個進程在「結束進程」中掛起,它將在其敏感列表喚醒時從頭開始重新啓動。如果它以明確的「等待」掛起,那麼「等待」將指定事件或未來時間,這將在「等待」之後重新啓動它。 (注意:1:不要在同一個過程中混合靈敏度列表和等待樣式!2:等到某個事件可合成爲止(儘管有些工具可能會反對);等待一段時間只是模擬)

然後所有信號分配被執行。由於所有的過程都是睡着的,這消除了所有的競爭條件和時間危害。其中一些賦值(如「1」到時鐘)將導致事件在對其敏感的進程上安排。

完成所有信號分配後,時間步進一個無限短的記號(稱爲增量循環),然後喚醒所有具有計劃事件的進程。

這一直持續到出現一個Δ週期,其中沒有新的事件被安排,最後仿真可以通過實時步驟前進。

因此

process(clk) 
begin 
if rising_edge(clk) then 
    A <= B; 
    B <= A; 
end if; 
end process; 

在VHDL無危險的。

如果您需要使用Verilog,請注意,其中的一些情況會以不同的方式發生,並且您不能依靠仿真結果中的相同級別的可預測性。


在綜合中,當然,我們生成的硬件需要一些實時的時間來執行這個過程。然而,綜合和後端工具(地點和路線)保證忠實地服從這種模型,或者失敗並報告失敗的原因。例如,他們會將所有實際延遲加起來,並確認總和小於您指定的時鐘週期。 (除非你把時鐘速度設得太高!)。所以結果是,只要工具報告成功(並且你正在設置時鐘速度正確的時鐘約束),你可以假設上面的「零時間」模型是真實的,真實的硬件行爲將匹配模擬。保證,禁止工具錯誤!

+4

爲什麼這個答案不在每個VHDL教程中?我有一段時間一直在用VHDL做一些事情,但你仍然爲我澄清了一些基礎知識! –

+0

感謝您的讚美! –

+0

「例如,他們會將所有實際延遲加起來,並確認總和小於您指定的時鐘週期(除非您將時鐘速度設置得太高!)。」我不明白。所以如果你設置的時鐘速度太高,那麼他們將允許一個高於時鐘週期的總和,並且不會驗證? –

5

當開始出使用VHDL(或任何其它HDL就此而言),它丟棄的連續代碼的所有概念,而是着眼於數據的通過硬件的流動是非常重要的。在硬件中,所有東西本質上是平行的(一切都是同時發生的),但是使用不斷變化的數據(輸入信號)來計算不斷變化的結果(輸出信號)!

沒有進入更高級的主題,如變量,等待命令等,一個進程內的所有內容都同時發生。如果在相同的過程中發生衝突(對相同信號進行多次寫入),則過程中的最後一個語句會勝出,這通常是對VHDL中「順序」代碼的混淆所在。

由於值被分配給信號的方式,這起作用。當爲信號賦值時,信號的值不會立即改變!取而代之的是,分配的值被記住,並且將在稍後作爲實際信號值被提交(準備下一個增量循環,這實際上是下一個時間量)。

由於下一個增量循環在上一個增量循環的所有過程完成之前不會開始,所以信號值只會在沒有過程運行時纔會改變。一旦所有信號發生變化,下一個增量循環開始,任何對某個變化信號敏感的處理都將被執行。

如果一個進程是它也寫入信號敏感,你有什麼被稱爲一個組合循環,例如,柵極其中輸出饋送的輸入。這在您的電路中(幾乎)總是一個錯誤,並且通常會導致模擬器進入無限的增量循環循環。

這就是我會爲寫信,布賴恩德拉蒙德的答案只是彈出當我在寫這一點,但隨時發表評論,我會添加一些更多的細節。一旦過程開始運行(由於事件)http://www.sigasi.com/content/vhdls-crown-jewel

3

你應該閱讀這篇博客。

2

,它運行到完成,允許任何其他事件之前觸發別的:

+0

整個「實體」中還是在「進程」內都是這樣的呢? – atomh33ls

+1

只是過程。一旦流程完成,您無法知道準備運行哪個流程,接下來將安排相同的增量循環。它可能來自同一個實體,也可能不是。而且(只要你不使用共享變量),這並不重要 –

相關問題