2013-06-01 78 views
7

我正在準備通過一些舊的考試。其中一個問題是:可以在端口聲明中使用自定義類型嗎?

編寫實現同步FSM的可綜合行爲VHDL代碼,如圖所示... FSM有一個輸入,稱爲請求,具有值(r1,r2,r3)的枚舉類型, ...

這讓我想寫這樣的代碼:

entity fsm is 
    port (clk  : in std_logic; 
     request : in my_enum_type 
); 
end fsm; 

而且某處有:

type my_enum_type is (r1, r2, r3); 

地方(我曾嘗試權利在港口聲明和建築聲明之後)。

但我似乎無法得到那個工作。 我可以將自定義類型作爲輸入或輸出嗎?

回答

7

是的,你可以,我認爲這是最佳實踐 - 它意味着最少的工作,最好的理解,最簡單的維護和最乾淨的設計。

訣竅是在包裝中聲明整個設計的通用類型(我通常稱之爲「Common」:-),並在實體聲明之前添加use work.Common.all,並在該實體的每個客戶中添加use work.Common.all。當然,更專業化的組件可以有適當的名稱!

例如:

package Common is -- untested... 

    type my_enum_type is (r1, r2, r3); 

    -- (optional) useful tools 
    function to_slv (e : my_enum_type) return std_logic_vector; 
    function to_enum (s : std_logic_vector(my_enum'length downto 0)) 
        return my_enum_type; 

end Common; 

package body Common is 
    -- subprogram bodies here 
end Common; 

現在,當你把值添加到枚舉,僅修改「通用」和重建的設計,而那些誰遵循傳統的準則仍在試圖確定每個端口和信號他們必須將其「std_logic_vector」的範圍增加1.

對於總線接口也非常適用,每個方向的記錄隱藏了所有單獨的總線和握手信號。

您將不得不與Xilinx的「自動測試臺生成器」這樣的大腦死亡工具進行對戰,這將有助於將所有端口類型(整數或布爾以及自定義)轉換爲std_logic(_vector),然後無法編譯。只需將它們翻譯一遍即可。

您仍然可以在最高層次上說明所有外部FPGA引腳仍應該基於std_logic。如果您需要模擬您的設計的綜合後版本,那麼您需要使用std_logic_vector端口,或者添加一個簡單的包裝器以將一種形式轉換爲另一種形式。

+0

完全有效!問題:頂級別和別針的東西...我會如何轉換?只是一個if?如果(request = r1),那麼pin1 <='1'...這對我來說不是一個真正的問題,但我不會很高興知道。 – evading

+0

將通用程序包中「有用工具」的詳細程度隱藏起來......然後,您的包裝程序將包含一個實體(具有SLV端口的post_synth網表)和信號分配像'slv_enum <= to_slv(my_enum);' –

+0

注意 - 你可以用它們的'pos''和''val''屬性和numeric_std.unsigned來寫這些「有用的工具」(用於枚舉),所以'to_enum'的主體可以簡單地''返回my_enum_type'val (無符號(一個或多個));' –

相關問題