2015-09-22 59 views
4

我碰到過VHDL中的兩種風格的進程語句。等到rising_edge(clk)vs如果rising_edge(clk)

process(clk) 
begin 
    if rising_edge(clk) 
....do something.... 

另一種是

process 
begin  
    wait until rising_edge(clk) 
    ....do something.... 

什麼是每種方法的優點和缺點。

+0

vs'等到clk ='1'' –

回答

3

假設...第二個示例的一部分沒有任何wait語句,這兩個表單在語義上是等價的。

它們在模擬中的表現完全相同。

但是,第一種形式是用於合成的推薦樣式,並且會被許多人認爲更具可讀性。

+1

由誰推薦?支持這兩種形式,請參閱撤回的IEEE Std 1076.6-2004,6.1.3.1靈敏度列表和一個時鐘的進程中的邊緣敏感存儲,以及使用單個等待語句的6.1.3.2邊緣敏感存儲。區別在於流程是否有一個靈敏度列表,暗示「等待時鐘;'作爲流程的最後一個順序語句(IEEE標準1076-2008 11.3流程語句)。哪種形式是純粹的編碼風格選擇, – user1155120

+0

@user我手邊沒有任何參考,但有_synthesis_工具,它不會用'wait'語法推斷出合適的FF。 – wap26

+0

他們不會是1076.6兼容。 – user1155120

-2

基本上,第二種類型只在仿真中有用。等待語句需要時間在流程內的不同語句之間流動,這與硬件合成過程不同。它通常會出現在模擬刺激或診斷過程中。在第一種形式中,進程由時鐘事件觸發,並在一個步驟中運行,表示同步邏輯。

+1

我不完全同意你答案的第二部分。「wait」確實可以用來產生複雜/異步的刺激,但它也可以用來模擬完全同步的行爲,例如觸發器。 – wap26

+1

這是不正確的。就「時間流量」而言,兩者基本相同,兩者之間只有一點次要的(不相關的)區別。我希望大多數綜合工具,如果不是全部,都可以接受這兩種形式。不過,幾乎每個人都使用第一個。 – EML

+1

你被誤導了。在之前的項目中,我們使用「等到rising_edge(clk)」,因爲它「保存」了縮進級別並且更緊湊。綜合工具(例如Vivado)認爲兩種形式都是等效的。 – kraigher

1

這兩種形式在Vivado中都是等效的。第二個wait表單可以被認爲更緊湊,因爲它「節省」了縮進級別。

+0

恕我直言,保存縮進級別是毫無意義的,除非你的編輯器只顯示80列。 – wap26

+0

我不是說它有巨大的價值。這種選擇大多是任意的,並且像任何編碼標準一樣可以根據個人喜好。這些工具不關心。 – kraigher

相關問題