2011-05-27 135 views
13

我是VHDL新手,無法確定哪些數據類型適合在哪裏使用。如果我理解正確,對於綜合來說,所有頂級實體端口都應聲明爲std_logic_vector或std_logic,而不是任何其他類型。什麼時候應該使用std_logic_vector,什麼時候應該使用其他數據類型?

但std_logic_vector不支持算術所以我應該怎麼處理呢?

我的直覺告訴我,我應該只是在頂層使用std_logic_vector,然後將它傳遞給其他實體時,將它轉換爲從整體的數據類型。它是否正確?

什麼整體的數據類型(整數,無符號,符號)應使用在哪裏?我理解簽名和未簽名之間的區別,但什麼時候應該使用整數?

回答

16

使用最適合建模目的的數據類型,包括端口。綜合要求您只應將std_logic或std_logic_vector用於端口是不正確的。不要相信那些告訴你的話。

如果您需要算法的支持位向量,考慮簽署/自ieee.numeric_std簽名。 (2008年VHDL,有一個標準包,增加了std_logic_vector算法的支持,但我認爲邪惡。)

有可能只在非常頂級問題後合成,當你想模仿綜合網表。該網絡列表的端口類型可能與您的頂級RTL接口不匹配。但是,在實例化門級別時,可以通過在那一刻進行正確的轉換來輕鬆修復該問題。對於這樣的低級問題,這是適當的時機 - 它們不應該影響您的RTL建模風格。

+0

那麼只要使用整數也沒有問題呢? – 2011-05-29 09:49:04

+0

@Emil。這是正確的(當然受到限制的整數子類型)。但是,整數在實踐中有一個(令人煩惱的)32位限制,這意味着您可能更喜歡無符號/有符號的例如如果你擔心參數化或一致性。 – 2011-05-29 10:05:40

+4

Nitpick(我知道揚知道這一點,但我會指出它的完整性):整數由標準保證是「不完全32位」 - 他們從 - ((2 ** 31)-1)到+((2 ** 31)-1)。許多供應商確實提供了完整的int32_t範圍,但不能保證:( – 2011-05-30 16:15:12

1

我建議,除非您嘗試三態信號模式,不使用STD_LOGIC和std_logic_vector - 我認爲是一種邪惡的。而是使用未解析的std_ulogic和std_ulogic_vector。這有利於在編譯期間檢測對未解析信號的多個分配。通過解析信號,您可以在模擬或合成後期檢測到錯誤。

缺點:這個建議是不是很常見,並使用與STD_LOGIC第三方邏輯可能需要一些類型轉換。

對於std_ulogic_vector的算術使用std_numeric。然後需要在操作之前將其轉換爲signed或unsigned並將結果轉換回std_ulogic_vector。對於未解決的信號,沒有標準的ieee.std_ulogic_unsigned庫。

adder_result <= std_ulogic_vector(unsigned(operant1) + unsigned(operant2)) ; 
increment <= std_ulogic_vector(unsigned(operant) + 1) ; 

整數,自然,正一方和無符號和正負號之間的區別是表示法。 有符號和無符號是std_logic_vector的子類型,更像是std_logic線束(或更精確的數組)。

整數類型是一個數字的數學表示。它們通常更多地用於泛型,生成循環和數組索引。但有時合成也可以爲算術單元處理它們。

相關問題