VHDL でポート マップのインスタンス化を使用する方法
モジュールは、VHDL コードの自己完結型ユニットです。モジュールはエンティティを通じて外界と通信します . 港マップ モジュールのインスタンス化の一部であり、モジュールの入力と出力が接続されるローカル信号を宣言します。
このシリーズの以前のチュートリアルでは、すべてのコードをメインの VHDL ファイルに記述しましたが、通常はそうしません。シミュレーター用ではなく、FPGA または ASIC 設計で使用する目的でロジックを作成します。
シミュレータで実行するために作成された VHDL モジュールには、通常、入力信号も出力信号もありません。それは完全に自己完結型です。だからこそ、私たちのデザインの実体は空でした。 entity
の間には何もありませんでした タグと end entity;
タグ。
このブログ投稿は、基本的な VHDL チュートリアル シリーズの一部です。
入力信号または出力信号のないモジュールは、実際の設計では使用できません。その唯一の目的は、シミュレーターで VHDL コードを実行できるようにすることです。したがって、テストベンチと呼ばれます。 .入力信号と出力信号でモジュールをシミュレートするには、インスタンス化する必要があります テストベンチで。
多くの場合、モジュールとテストベンチはペアで提供され、別のファイルに保存されます。一般的な命名スキームは、テストベンチをモジュール名に「Tb」を追加して呼び出し、アーキテクチャを「sim」と命名することです。モジュールが「MyModule」と呼ばれる場合、テストベンチは「MyModuleTb」と呼ばれます。その結果、ファイル名は「MyModuleTb.vhd」および「MyModule.vhd」になります。
テストベンチ コードを使用して、モジュールがシミュレーション環境で正しく動作していることを確認できます。テスト対象のモジュールは、一般的に テスト対象のデバイス と呼ばれます。 (DUT).
モジュールは、他のモジュール内でインスタンス化することもできます。コードをモジュールに分割すると、複数回インスタンス化できます。同じ設計内でモジュールの複数のインスタンスを作成でき、多くの設計で再利用できます。
VHDL のポートを持つエンティティの構文は次のとおりです。entity <entity_name> is
port(
<entity_signal_name> : in|out|inout <signal_type>;
...
);
end entity;
このようなモジュールを別の VHDL ファイルでインスタンス化するための構文は次のとおりです。<label> : entity <library_name>.<entity_name>(<architecture_name>) port map(
<entity_signal_name> => <local_signal_name>,
...
);
<label>
任意の名前にすることができ、ModelSim の階層ウィンドウに表示されます。 <library_name>
モジュールは、VHDL コードではなく、シミュレーターで設定されます。デフォルトでは、すべてのモジュールは work
にコンパイルされます 図書館。 <entity_name>
そして <architecture_name>
インスタンスを作成しているモジュールと一致する必要があります。最後に、各エンティティ シグナルをローカル シグナル名にマッピングする必要があります。
VHDL でモジュールをインスタンス化する方法は他にもありますが、これは明示的なインスタンス化の基本的な構文です。
エクササイズ
このビデオ チュートリアルでは、VHDL でモジュールを作成してインスタンス化する方法を学習します。
MUX テストベンチの最終的なコード :
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T15_PortMapTb is end entity; architecture sim of T15_PortMapTb is signal Sig1 : unsigned(7 downto 0) := x"AA"; signal Sig2 : unsigned(7 downto 0) := x"BB"; signal Sig3 : unsigned(7 downto 0) := x"CC"; signal Sig4 : unsigned(7 downto 0) := x"DD"; signal Sel : unsigned(1 downto 0) := (others => '0'); signal Output : unsigned(7 downto 0); begin -- An instance of T15_Mux with architecture rtl i_Mux1 : entity work.T15_Mux(rtl) port map( Sel => Sel, Sig1 => Sig1, Sig2 => Sig2, Sig3 => Sig3, Sig4 => Sig4, Output => Output); -- Testbench process process is begin wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= "UU"; wait; end process; end architecture;
MUX モジュールの最終的なコード :
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T15_Mux is port( -- Inputs Sig1 : in unsigned(7 downto 0); Sig2 : in unsigned(7 downto 0); Sig3 : in unsigned(7 downto 0); Sig4 : in unsigned(7 downto 0); Sel : in unsigned(1 downto 0); -- Outputs Output : out unsigned(7 downto 0)); end entity; architecture rtl of T15_Mux is begin process(Sel, Sig1, Sig2, Sig3, Sig4) is begin case Sel is when "00" => Output <= Sig1; when "01" => Output <= Sig2; when "10" => Output <= Sig3; when "11" => Output <= Sig4; when others => -- 'U', 'X', '-', etc. Output <= (others => 'X'); end case; end process; end architecture;
[実行] を押してタイムラインを拡大した後の ModelSim の波形ウィンドウ:
分析
波形からわかるように、マルチプレクサ (MUX) モジュールは期待どおりに動作します。波形は、モジュールを使用せずに作成した前のチュートリアルのものと同じです。
これで、デザイン モジュールとテストベンチが明確に分離されました。 MUX を含むモジュールは設計で使用するものであり、テストベンチの唯一の目的はシミュレータで実行できるようにすることです。テストベンチに wait
を使用するプロセスがあります シミュレーションで人為的な時間遅延を作成するためのステートメント。設計モジュールには時間の概念がなく、外部刺激にのみ反応します。
テストベンチのアーキテクチャに sim
という名前を付けました 、シミュレーション用。デザイン モジュールのアーキテクチャは rtl
と名付けられました 、レジスタ転送レベルを表します。これらは単なる命名規則です。このような名前のファイルを見ると、それがテストベンチなのか設計モジュールなのかすぐにわかります。会社によって命名規則が異なる場合があります。
テイクアウト
- 入力信号と出力信号はモジュールのエンティティで指定されます
- 入出力信号のないモジュールは、テストベンチと呼ばれます 、シミュレータでのみ使用できます
- in/out シグナルを持つモジュールは、通常、シミュレーターで直接実行することはできません
次のチュートリアルに進む »
VHDL