VHDL: 基本構造
2026/05/13

VHDLの記述ブロック

  • VHDLの記述は下記3ブロックで構成されます。
    ブロック説明
    ライブラリ(library)ライブラリやパッケージの呼出し
    エンティティ(entity)回路名, パラメータ, ポートの定義
    アーキテクチャ(architecture)回路動作の記述
  • 記述例とブロックの対応です。
    alt text

libraryブロック

  • 使用するライブラリとパッケージを宣言するブロックです。まずは下記の記述が「お約束」です
    library ieee; -- 必須/標準ライブラリ
    use ieee.std_logic_1164.all; -- 必須パッケージ
    use ieee.numeric_std.all;    -- 数値演算の標準パッケージ
    
  • 上記以外にVHDL-2008で使用するieeeライブラリのパッケージは以下ですが、この説明は別途とします。
    パッケージ名内容
    use ieee.math_real.all;
    use ieee.math_complex.all;
    数学関数や複素数演算
    シミュレーション用途
    use ieee.fixed_pkg.all;
    use ieee.float_pkg.all;
    固定小数点演算
    浮動小数点演算
    use ieee.std_logic_textio.all;ファイルI/O

entityブロック

  • entityブロックは、回路(module_name)のentity(外部とやり取りできる信号やパラメーター)を定義します。下記は 回路モジュール名:fifo のentityの定義記述例です。
    entity fifo is
      generic (
        P_DEPTH : natural := 16;
        P_WIDTH : natural := 8
      );
      port (
        clk : in  std_logic;
        din : in  std_logic_vector(P_WIDTH-1 downto 0);
        dout: out std_logic_vector(P_WIDTH-1 downto 0)
      );
    end entity;
    

generic(...);

  • パラメータを定義します。複数のパラメータを定義する場合は;で繋げます。
    generic (
      <parameter_name> : <type> := <value>;
      ...
      <parameter_name> : <type> := <value>  -- 最後は行末の;無し
    );
    
  • entityのgenericで定義する値は初期値です。構造化記述では他のentityを利用する際にパラメータを指定上書きできます。この詳細説明は別途とします。

  • パラメータに指定できる型にはnatural, integer, boolean, enum, array等があります。記述例で使用しているnatural は自然数...正の整数です。

port(...);

  • entityブロックのport(〜);がポート名定義記述です。
    port (
      <port_name> : <direction> <signal_type>;
      ...
      <port_name> : <direction> <signal_type>  -- 最後は行末の;無し
    );
    
  • ポートの<direction>(in/outの方向)は下記3種類です。本当は5種類ですが、RTLで使用する3種類だけ示しています。
    <direction>説明記述例
    in入力ポートa : in std_logic;
    out出力ポートz : out std_logic;
    inout双方向ポートsd : inout std_logic;
  • ポートの<signal_type>(信号タイプ)は下記4種類ですが、unsigned/signedの使用についてはチームの記述ルールに従って下さい。
    <signal_type>説明記述例
    std_logic1bitのポートa : in std_logic;
    std_logic_vector多bitのポートz : out std_logic_vector(7 downto 0);
    unsigned多bitのポート(符号無し)q : unsigned std_logic_vector(7 downto 0);
    signed多bitのポート(符号付き)y : signed std_logic_vector(7 downto 0);
  • VHDL-2008では、portの<signal_type>に、enum, record, arrayも使用することができます。下記はrecordの使用例です。Interfaceとして利用しています。

    type axi_stream is record
      tdata  : std_logic_vector(31 downto 0);
      tvalid : std_logic;
      tready : std_logic;
    end record;
    
    entity axi_master is
      port (
        m : out axi_stream
      );
    end entity;
    
  • VHDL-2008では、portに初期値を設定することができます。ですが、この記述を合成対象のRTLで使用するのは避けて下さい。RTLとNetlistの間で検証結果に違いを生じさせることがあります。テストベンチ側だけに適用しましょう。

    entity foo is
      port (
        enable : in std_logic := '1'
      );
    end entity;
    

architectureブロック

  • 回路<entity_name>の記述種別<architecture_name>と、内部信号/他の回路接続/論理動作を記述するブロックです。つまり回路の中身です。大きくは<declarative_region>(宣言部)と、<statement_region>(実装部)で構成されます。
    architecture <architecture_name> of <entity_name> is
      <declarative_region>
    begin
      <statement_region>
    end architecture;
    

<architecture_name>(アーキテクチャ名)

  • <architecture_name>(アーキテクチャ名)は任意ですが、慣習的にルールが決まっています。下記のパターンが多いです。実務時はチームのルールに従って下さい。
    <architecture_name>説明
    rtl論理合成可能な記述
    gate論理合成後のゲートネットリスト記述
    simテストベンチ等Simulation用記述(論理合成不可)

<declarative_region>(宣言部)

  • 回路が使用する信号等の内部リソースを宣言/定義します。VHDL-2008で使用できるものは下記です。ローカルpackageとして機能します。packageの説明ついては別途。
    種別説明
    signal内部信号
    constant内部定数
    type/subtype型定義
    record/array構造化データ定義
    function/procedureサブプログラム
    alias別名
    attribute属性
    fileファイル(テストベンチ用)
  • 記述例を列挙します。
    -- signal(内部信号)
    signal a_int : unsigned(7 downto 0);
    
    -- constant(内部定数)
    constant LATENCY : natural := 3;
    
    -- type/subtype(型定義)
    type state_t is (IDLE, RUN, DONE);
    
    -- record/array(構造化データ定義)
    type pixel is record
    r, g, b : unsigned(7 downto 0);
    end record;
    
    -- function/procedure(サブプログラム)
    -- 下記は宣言だが、実装も<declarative_region>で記述できる
    function sat_add(a, b : signed) return signed;
    
    -- alias(別名)
    alias sum is a_int;
    
    -- attribute(属性)
    attribute keep : boolean;
    attribute keep of a_int : signal is true;
    
    -- file(ファイル)
    file f : text;
    

<statement_region>(実装部)

  • 実際の論理や信号接続を記述する領域です。詳細は論理記述に関する今後のレポートで説明します。

  • 下記はconcurrent statements(並列/同時実行文)として扱われる記述/ブロックです
    • signal <= <logic_assignment>;
    • process ... begin 〜 end process;
    • foo: entity work.<entity> port map (...);
    • generate ... begin 〜 end generate;
    • label: bar ... begin 〜 end bar;

次回

  • 次回より記述の詳細として、信号(std_logic, std_logic_vector)から見ていきます。
Copyright(C) 2026 Altmo
本HPについて