2013-06-01 5 views
7

私はいくつかの古いものを通って試験を準備しています。カスタムタイプをポート宣言で使用できますか?

同期FSMを実装する合成可能な動作可能なVHDLコードを図... に書き込みます。FSMには、要求と呼ばれる1つの入力があり、値(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を追加し、そのエンティティのすべての顧客に追加します。もちろん、より特殊なコンポーネントには適切な名前を付けることができます!例えば

:あなたが列挙に値を追加するとき

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ずつ増やす必要があります。

各方向のレコードがすべての個々のバスとハンドシェイク信号を隠すバスインターフェイスでも機能します。

ザイリンクスの「自動テストベンチジェネレータ」のように、整数型またはブール型およびカスタム型のすべてのポートタイプをstd_logic(_vector)に変換してコンパイルできないような脳死ツールと戦わなければなりません。もう一度翻訳し直してください。

トップレベルでは、すべての外部FPGAピンがまだstd_logicベースである必要があります。合成後のバージョンのデザインをシミュレートする必要がある場合は、std_logic_vectorポートを使用してライブを行うか、あるフォームから別のフォームに変換する単純なラッパーを追加する必要があります。

+0

これは完全に機能します!質問:そのトップレベルとピンのもの...私はどのように変換しますか?ちょうどif? if(request = r1)then pin1 <= '1' ...それは本当に私にとっては問題ではありませんが、私は知ってうれしいです。 – evading

+0

Commonパッケージの "有用なツール"の詳細レベルを埋める...あなたのラッパーはエンティティ(SLVポートを持つpost_synthネットリスト)と 'slv_enum <= to_slv(my_enum);のようなシグナル割り当てを含んでいます –

+0

注意 - '' pos''と '' val''属性とnumeric_std.unsignedの観点から、それらの "有用なツール"(enum)を書くことができるので、 'to_enum'の本体は' return my_enum_type'val (署名なし); ' –

関連する問題