2011-11-03 46 views
2

VHDL提供了兩種主要的對象類型來保存數據,NAMEL signalvariable,但我無法找到任何地方是在什麼時候比其他使用一個數據類型明確。任何人都可以闡明他們的優勢/侷限性/範圍/綜合/使用哪一個比另一個好?信號VS可變

回答

5

信號可用於在進程之間傳遞值。變量不能。有shared variables可以在較老的編譯器中使用,但如果你這樣做的話,你確實需要問題(有競爭條件) - 除非你使用protected types,這有點像類。然後他們是相同的用於溝通,但沒有(據我所知)合成。

通信的這個基本限制來自信號和變量更新的工作方式。

最大的區別是因爲變量立即更新而被更新(與:=運算符一起)。信號有更新日期分配給(與<=運營商),但任何人看到他們讀取信號的價值將不會改變,直到一段時間過去。 (除此之外:這個時間量可以和Δ循環一樣小,這是VHDL仿真器中最小的時間量 - 沒有「真實」時間過去。類似於wait for 0 ps;之類的東西會導致模擬器等待下一個時間繼續之前△循環。)

如果你需要相同的邏輯來養活多個觸發器的變量是融通這種邏輯到一個點,而不是複製/粘貼代碼的好方法。

就邏輯而言,在鍾控過程中,信號總是推斷觸發器。變量可以用於組合邏輯和推斷觸發器。有時候對於同一個變量。有些人認爲這混亂的,我個人認爲這是罰款:

process (clk) 
    variable something : std_logic; 
    if rising_edge(clk) then 
    if reset = '1' then 
     something := '0'; 
    else 
     output_b <= something or input c; -- using the previous clock's value of 'something' infers a register 
     something := input_a and input_b; -- comb. logic for a new value 
     output_a <= something or input_c; -- which is used immediately, not registered here 
    end if; 
    end if; 
end process; 

一件事使用變量看是因爲如果他們讀他們寫後,沒有寄存器輸出時,你可以得到邏輯的長鏈這可能導致錯過你的fmax目標

使用信號(在時鐘進程中)的一件事是它們總是推斷一個寄存器,並因此導致延遲。

3

正如其他人所說的那樣,信號在時間片的末尾用新值更新,但變量會立即更新。

// inside some process 
// varA = sigA = 0. sigB = 2 
varA := sigB + 1;  // varA is now 3 
sigC <= varA + 1;  // sigC will be 4 

sigA <= sigB + 1;  // sigA will be 3 
sigD <= sigA + 1;  // sigD will be 1 (original sigA + 1) 

對於硬件設計,我很少使用變量。通常,當我在一些需要重新考慮代碼的功能中進行黑客攻擊時,但我已經處於截止日期。我避開它們是因爲我發現處理信號和變量的心智模式太差了,無法在一段代碼中很好地生活。這並不是說它不能完成,但我認爲大多數RTL工程師避免混合......並且無法避免信號。

其他景點:

  • 信號具有實體的作用域。變量是本地流程。
  • 兩種合成
+2

,如果你不使用變量這很好,但許多工程師使用他們所有的時間。一個公開的例子是用於航空航天應用的GRLIB/LEON3。 – Philippe

+0

夠公平的,每個人都有自己的風格。我傾向於在合同中移動一點點,我只是根據我所做的觀察來評論我的意見。使用它們本質上沒有什麼錯誤。 –