VHDLポートマップインスタンス化マスター:実践ガイド
VHDLにおいて、モジュールはエンティティを通じて外部世界と通信する自己完結型ユニットです。インスタンス化のポートマップ節は、エンティティの形式ポートを周囲の設計内のシグナルに接続します。
モジュール、エンティティ、テストベンチ
FPGAやASIC向け開発では、設計ロジックは明確に定義された入出力ポートを持つモジュールに存在します。ポートを持たないモジュールはテストベンチです。テストベンチはデバイス・アンダー・テスト(DUT)に刺激を与えるシミュレーションラッパーであり、物理チップには決して現れません。
以前の投稿ではすべてのVHDLを単一ファイルに書いていましたが、これは迅速な実験には便利でも本番設計には不向きです。DUTとテストベンチを分離すると、可読性、再利用性が向上し、シミュレーション階層が明確になります。
一般的な命名規約
多くのチームはシンプルなスキームを採用:設計ファイルをMyModule.vhd、テストベンチをMyModuleTb.vhdと命名。DUTのアーキテクチャはしばしばrtl(レジスタ転送レベル)、テストベンチアーキテクチャはsimと呼ばれます。この規約でファイルが合成向けかシミュレーション向けか即座に判別できます。
ポートマップインスタンス化のVHDL構文
モジュールのインターフェースをentityキーワードで定義:
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>はシミュレータ階層に表示され、<library_name>はデフォルトでwork。すべての形式ポートをローカルシグナルにバインドする必要があります。
実践例:4対1 MUX
以下は、符号なし8ビットシグナルを使用した4対1マルチプレクサを実装した完全なテストベンチとDUTの組み合わせです。
テストベンチコード
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
-- アーキテクチャrtlでMUXをインスタンス化
i_Mux1 : entity work.T15_Mux(rtl)
port map(
Sel => Sel,
Sig1 => Sig1,
Sig2 => Sig2,
Sig3 => Sig3,
Sig4 => Sig4,
Output => Output
);
-- 刺激プロセス
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;
モジュールコード
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);
-- Output
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 => Output <= (others => 'X');
end case;
end process;
end architecture;
波形分析
ModelSimでテストベンチを実行すると、MUXの期待動作と一致する波形が得られます。以下の波形スナップショットは、Sel信号変化に伴いDUTが4入力信号間を正しく切り替えることを確認しています。
重要なポイント
- モジュールは
entityポートで入出力を公開。 - テストベンチはポートを持たず、シミュレーション専用。
- 明示的ポートマッピングがVHDLモジュールインスタンス化の最も透明な方法。
- 一貫した命名規約(DUTは
rtl、テストベンチはsim)がプロジェクト間の可読性を向上。
次のチュートリアルでVHDL設計パターンの更なる洞察を得ます。
VHDL
- カッターグラインダー技術の習得:実践ガイド
- モリブデンが現代産業を形作る仕組み:用途、利点、需給動向
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- Tcl駆動テストベンチでVHDLコード・ロック・モジュールを検証する
- VHDLテストベンチ・シミュレーションを優雅に終了させる方法
- VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
- VHDLで乱数生成: 一様分布からOSVVMまで
- プロセス内プロシージャでVHDLステートマシンをクリーンに設計
- VHDLにおける不純関数の活用:FSMの可読性と保守性向上
- VHDL関数マスター:効率的な設計のための実践ガイド
- VHDLで有限ステートマシンを設計:信号機の実践例