VHDLレコードでクリーンかつ再利用可能なFIFOインターフェースを実現
VHDLにおいてレコードは、C言語の構造体のように設計を効率化する強力な機能です。関連する信号を単一の型にグループ化することで、コード重複を大幅に削減し、可読性を高め、複数エンティティ間のポート マップをシンプルにできます。
レコードは、オフチップ メモリやFIFOへの接続など、大規模で繰り返し現れるインターフェースで真価を発揮します。同じ制御/データ信号セットが何度も現れる場合、専用パッケージで一度レコードを定義し、どこでも再利用すれば、エンティティ インターフェースが整理され、将来の変更も容易になります。
以下の例では、専用パッケージ(example_record_pkg.vhd)で2つのレコード型を定義し、FIFOの入力信号と出力信号をモデル化します。単一のレコード信号でFIFOからのすべての入力を、もう一つでFIFOへのすべての出力を表現します。
重要ポイント:
- レコードでVHDLのエンティティ宣言とポート マップがシンプルになる。
std_logic、integer、std_logic_vectorなど異なる型の要素を保持可能。- C言語の構造体と類似し、多くのエンジニアに馴染みのあるパラダイム。
- 共有レコード型は単一パッケージに置くべきで一貫性が保たれる。
- レコード信号は定数で初期化可能、予測可能な起動値を設定できる。
- レコードの配列で構造化データ処理が可能(例:FIFO設定テーブル)。
以下にパッケージ定義と、レコード型を用いてFIFO読み書きロジックを管理するエンティティ例を示します。コードはIEEE 1076-2008標準に完全準拠しています。
library ieee; use ieee.std_logic_1164.all; package example_record_pkg is -- FIFOからの出力. type t_FROM_FIFO is record wr_full : std_logic; -- FIFO Full Flag rd_empty : std_logic; -- FIFO Empty Flag rd_dv : std_logic; rd_data : std_logic_vector(7 downto 0); end record t_FROM_FIFO; -- FIFOへの入力. type t_TO_FIFO is record wr_en : std_logic; wr_data : std_logic_vector(7 downto 0); rd_en : std_logic; end record t_TO_FIFO; constant c_FROM_FIFO_INIT : t_FROM_FIFO := (wr_full => '0', rd_empty => '1', rd_dv => '0', rd_data => (others => '0')); constant c_TO_FIFO_INIT : t_TO_FIFO := (wr_en => '0', wr_data => (others => '0'), rd_en => '0'); end package example_record_pkg;
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.example_record_pkg.all; -- パッケージ使用! entity example_record is port ( i_clk : in std_logic; i_fifo : in t_FROM_FIFO; o_fifo : out t_TO_FIFO := c_TO_FIFO_INIT -- 出力レコード初期化 ); end example_record; architecture behave of example_record is signal r_WR_DATA : unsigned(7 downto 0) := (others => '0'); begin -- FIFO書き込み処理 p_FIFO_WR : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.wr_full = '0' then o_fifo.wr_en <= '1'; o_fifo.wr_data <= std_logic_vector(r_WR_DATA + 1); end if; end if; end process p_FIFO_WR; -- FIFO読み出し処理 p_FIFO_RD : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.rd_empty = '0' then o_fifo.rd_en <= '1'; end if; end if; end process p_FIFO_RD; end behave;
VHDL
- LPレコード製造の芸術とプロセス
- AC解析設定:カーブ、ポイント、周波数スイープ設定
- VHDL入門:最初のANDゲートを作る
- VHDL型変換完全ガイド:Numeric_StdとStd_Logic_Arithパッケージ活用
- VHDLプロシージャ例:std_logic_vectorのインクリメント
- VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察
- VHDL変数の解説:実践例と信頼性設計のためのルール
- PSLによるVHDLモジュールの形式的検証マスター
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- VHDLジェネレート文をマスターする: 再利用可能なデバウンサーを簡単に構築
- VHDLテストベンチ・シミュレーションを優雅に終了させる方法