那麼你可以使用枚舉,最好的方法是聲明你自己的std_logic向量,由枚舉而不是整數索引。
但可能是更好的將是創紀錄的,而不是一個向量:
type Control_Signals is record
Clk : std_logic,
En : std_logic,
Foo : std_logic,
Bar : std_logic,
Baz : std_logic
end record;
編輯的詳細信息,如下評論:
平淡無奇使用std_logic_vector(和一般的VHDL的類型系統)的持有VHDL back ...
如果這是頂層實體,則std_logic_vector端口允許您在綜合設計中用頂層測試平臺替換綜合後網表。或者您可能必須遵守堅持std_logic_vector端口的陳舊的編碼風格指南。
但是在任何其他情況下,我會在包中聲明記錄,在整個設計中使用該包,並創建記錄類型的端口。當你確實需要std_logic_vectors時,這個包應該包括函數to_slv
和to_control_sigs
(罕見的,如果你理解的話)。
這同樣適用於枚舉:
type Controls is (Clk, En, Foo, Bar, Baz);
type Control_Signals is array(Controls) of std_logic;
My_Bus_Ctrl : Control_Signals := (Clk => '1', En => '1', others => '0');
My_External_SLV_Port <= std_logic_vector(My_Bus_Ctrl);
當然,枚舉比用C更強大一點;以及將它們用作數組索引類型,您可以遍歷它們。當你更新枚舉時,它可以讓循環保持一致!
通過枚舉索引的記錄或數組都可以工作;我更喜歡這個記錄更清潔,更符合面向對象的實踐。
在任何情況下,如果將它用於實體端口,它將變得更加有用。爲輸出總線信號(包括地址和數據)和輸入信號聲明一個記錄(或陣列!),因爲您不能在單個端口中混合方向......(FPGA中近期沒有雙向信號,因此不需要第三個端口)
現在,您的設計可以防止總線結構發生變化;更改地址寬度或添加中斷信號只會更改記錄聲明和任何實際用戶;沒有必要在整個層次中添加新的信號......
第一個建議是什麼樣的?此外,cntrl_signals需要爲std_logic_vector,因爲它位於實體端口聲明中,並且對外可見。 – c0m4
+1:'使用std_logic_vector(和VHDL的類型系統一般)的缺乏想象力正在把VHDL保存回去......' –
哇,好信息!謝謝! – c0m4