VHDL提供了兩種主要的對象類型來保存數據,NAMEL signal
和variable
,但我無法找到任何地方是在什麼時候比其他使用一個數據類型明確。任何人都可以闡明他們的優勢/侷限性/範圍/綜合/使用哪一個比另一個好?信號VS可變
Q
信號VS可變
2
A
回答
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工程師避免混合......並且無法避免信號。
其他景點:
- 信號具有實體的作用域。變量是本地流程。
- 兩種合成
相關問題
- 1. Win32事件vs信號量
- 2. C信號。 signal()vs sigset()?
- 3. 信號燈:DISPATCH_TIME_NOW VS DISPATCH_TIME_FOREVER
- 4. 的sed VS陣VS可變
- 5. 愛可信VS請求
- 6. 可調信號量
- 7. BoundedSemaphore信號量vs標準互斥量
- 8. 等待隊列VS信號量在linux
- 9. Python的二進制信號VS鎖
- 10. 二進制信號VS互斥
- 11. 同樣的噪聲信號,Matlab vs Python
- 12. 類型(可變)VS(類型)可變
- 13. Python範圍可變vs不可變
- 14. 信號變爲0X00從0100
- 15. QTableView中 - 改變的信號
- 16. 變量,「 - 」(減號信號)中的Bash
- 17. VS不能顯示變量的信息
- 18. 班PDO VS可變PDO
- 19. VHDL信號在兩個單獨的信號的邊沿改變
- 20. 將信號分配給變量並將變量分配給信號
- 21. Python:構建可重入信號量(結合RLock和信號量)
- 22. 反應可可信號不工作
- 23. 可變參數信號和通用的Lambda表達式
- 24. 錯誤信息無法找到符號 - 可變mobileserviceprovider
- 25. pyqt:當widget變得可見/隱藏時接收信號
- 26. 基於信號控制simulink可變時間步長大小
- 27. 如何聲明一個可變長度std_logic_vector信號
- 28. 可能改變Django信號的順序嗎?
- 29. 信號與信號2
- 30. 線程1:信號SIGABRT突變方法發送到不可變對象'
,如果你不使用變量這很好,但許多工程師使用他們所有的時間。一個公開的例子是用於航空航天應用的GRLIB/LEON3。 – Philippe
夠公平的,每個人都有自己的風格。我傾向於在合同中移動一點點,我只是根據我所做的觀察來評論我的意見。使用它們本質上沒有什麼錯誤。 –