VHDL: データ型
2026/05/16

VHDLのデータ

  • VHDLのデータはクラスのオブジェクトです。各オブジェクトが取る値はデータタイプで指定します。
    signal clk : std_logic;
    signal data : std_logic_vector(7 downto 0);
    
  • 例えば上記の信号定義記述は、下記解釈となります。
    オブジェクト名クラス名データタイプ名
    clksignalstd_logic
    datasignalstd_logic_vector()
  • ではVHDLのクラスから見ていきましょう。

クラス

  • クラスはデータの役割を定義します。VHDLのデータはクラスのオブジェクトです。
    クラス役割
    signal・ハードウェアを表す
    ・信号代入<=により、常時変化が反映される信号として扱う
    variableprocess(順次実行ブロック)内で利用
    ・即時代入:=により、ローカル変数として扱う
    constant・変更不可の定数
    file・テストベンチのtextioにてファイルを指す
    alias・文字通り別名の定義
  • variableについてはprocessで説明します。ここでは「signalとは違う/ハードウェアじゃない」の認識でOKです。

データタイプ: スカラーの種類

  • データタイプはオブジェクトが持つデータの種類や構造を定義します。まずはスカラーのデータタイプで、取り得る値の種類を見ていきましょう。

  • スカラーのデータタイプは基本要素のため種類が多いです。分類すると下記4種になります。
    種別スカラー型
    Enumeration(列挙)型(*1)boolean
    bit
    std_logic
    true, false
    '0', '1'
    'U','X','0','1','Z','W','L','H','-'
    Integer(整数)型integer
    natural
    positive
    -2^31 .. 2^31-1: 整数
    0, 1, 2 ...: ≧0の整数/自然数
    1, 2, 3 ...: 正の整数
    Pyhsical(物理量)型time10 ns, 5 us
    Floating(浮動小数点)型real
    float32, float64
    1.23

スカラー: Enumeration(列挙)型

  • 標準列挙型
    スカラー型説明記述例
    booleanboolean型/論理値
    true,false
    variable result : boolean := false;
    bitロジック値
    '0', '1'
    constant en_flag : bit := '1';
    std_logicハードウェアが取り得る1bit信号値
    'U','X','0','1','Z','W','L','H','-'
    signal a : std_logic := 'U';
  • ステートマシーンの状態定義等でユーザー定義の列挙型を利用できます。2種より多くの列挙値を設定することがほとんどのため、見かけ上はスカラーですが、合成後はstd_logic_vectorになります。
    type state_t is (IDLE, RUN, DONE);
    

スカラー: Integer(整数)型

  • 標準整数型
    スカラー型説明記述例
    integer32bit整数
    -2^31 〜 2^31-1
    variable deg : integer := -270;
    natural自然数
    0, 1, 2, ...
    constant width : natural := 4;
    positive正数
    1, 2, 3, ...
    constant init : positive := 10;
  • ハードウェアの一部として整数を利用する場合、複数bitデータになるため subtypeを利用した範囲制限は事実上必須です。
    subtype byte is integer range 0 to 255; -- 8bitになる
    
  • そしてbit幅が同じでも、異なるタイプのデータと演算する場合はキャスト(型変換)が必須です。これについては別途説明予定ですが、VHDLに暗黙の型変換はありません。
    signal a : integer range 0 to 255;
    signal b : unsigned(7 downto 0);
    
    b <= a;  -- エラー
    b <= to_unsigned(a, 8); -- OK
    a <= to_integer(b); -- OK
    

スカラー: Physical(物理量)型

  • 標準であるのはtimeのみです。
    スカラー型説明記述例
    timeテストベンチでの時間指定
    fs, ps, ns, us, ms, sec, min, hr
    constant CYC : time := 100 ns;
  • その他は必要なものをtypeでユーザー定義します。下記は定義例です。
    type length is range 0 to 1_000_000
    units
      mm;
      cm = 10 mm;
      m  = 100 cm;
    end units;
    

スカラー: Floating(浮動小数点)型

  • realは合成対象になりませんが、暗黙の標準ライブラリ(standard)で使用できます。

  • VHDL-2008 では float32, float64が追加され、これらは合成対象です。利用にはieee.math_realパッケージを呼ぶ必要がります。
    スカラー型説明記述例
    real
    float32, float64
    浮動小数点variable sense : float :=1.23;
  • しかし環境制約や合成結果が肥大する問題があるため、現時点ではテストベンチのみで使用しましょう。

データタイプ: arrayの種類

  • 同一タイプのスカラーデータを複数持つデータタイプがarray型です。IEEEライブラリで定義済みのデータタイプは下記になります。
    型名要素型(スカラー)ライブラリ用途
    std_logic_vectorstd_logicieee.std_logic_1164汎用ビットベクタ
    bit_vectorbitstandard古いが軽量
    unsignedbitieee.numeric_std符号なし整数
    signedbitieee.numeric_std符号付き整数
    stringcharacterstandardテキスト
    ※テストベンチのみ
  • その他必要なものは、ユーザーが定義します。ユーザー定義(type)は別途説明しますが、2次元の配列データだけは先行で示します。下記はレジスタファイルの記述例です。
    type word_t is array (natural range <>) of std_logic_vector; -- wordのbit数定義
    type mem_t is array (natural range <>) of word_t; -- wordの数定義
    
    signal regfile : mem_t(0 to 31)(31 downto 0); -- メモリとしての実体化
    

データタイプ毎のリテラル

  • スカラー型(scalar types)
    データタイプ使用できるリテラル備考
    booleanboolean リテラルtrue, false文字列 "TRUE" は不可
    bitbit 文字リテラル'0', '1''Z' は不可
    std_logicstd_logic 文字リテラル'0', '1', 'Z', 'X', 'U'9値ロジック
    integer整数リテラル0, 42, -1, 16#FF#基数表記可
    natural整数リテラル(非負のみ)0, 10-1 は不可
    positive整数リテラル(正のみ)1, 1000 は不可
    real実数リテラル3.14, 1.0E-3合成では通常使用しない
    time物理リテラル10 ns, 5 usns, us, ms など
  • array型(array types)
    データタイプ使用できるリテラル備考
    string文字列リテラル"HELLO"文字の配列
    bit_vectorビット文字列リテラル"0101"'Z' は不可
    std_logic_vectorstd_logic 文字列リテラル"01XZ"'U', 'W' なども可
    unsignedビット文字列リテラル"1010"数値として扱われる
    signedビット文字列リテラル"1010"2 の補数表現
    任意の array 型集合リテラル(1,2,3)要素型に依存
    others 指定others リテラル(others => '0')配列全体の初期化
  • レコード型(record types)
    データタイプ使用できるリテラル備考
    recordレコードリテラル(r => 0, g => 20, b => 30)フィールドごとに型一致必要
  • 特殊型
    リテラル適用可能な型備考
    nullaccess 型、プロセス待ちなどp <= null;配列や整数には不可
    基数表記integer
    bit_vector
    std_logic_vector
    2#1010#, 16#FF#配列型は要注意
    (型推論が必要)

array型リテラルの注意点

  • オブジェクト同士の演算は型一致が必須ですが、リテラルの場合は型推論により変換されるケースがあります。いくつか例を示します。

  • unsigned, signed は ビット列リテラル を受け入れます。
    signal a : unsigned(3 downto 0);
    a <= "1010";  -- OK
    
  • データイプによってリテラルの解釈が変わります。下記は"0101"のデータタイプ毎解釈です。
    データタイプ"0101"の解釈
    std_logic_vectorビット列(2進数)として扱われる
    unsigned数値として扱われる
    signed2の補数として扱われる
    string文字の配列として扱われる
  • integerリテラルはunsigned,signedに直接代入できません。bit列と違うので混乱しやすいところです。
    a <= 10;  -- NG
    a <= to_unsigned(10, 8); -- OK
    

リテラルのデフォルト型

  • 適用するデータタイプによってリテラルは型変換されますが、演算前はデフォルト型が決まっています。尚、表中のothersについてはstd_logic_vectorの演算で説明します。
    リテラルデフォルト型
    10integer
    3.14real
    10 nstime
    'A'character
    "HELLO"string
    "0101"(bit のみ)bit_vector
    "01XZ"std_logic_vector
    (1,2,3)コンテキスト依存
    (others => '0')コンテキスト依存
    nullaccess T

Notes

  • (1)std_ulogicは説明から外しました。多分知らない方が良いです。
  • 2026-05-16: 初版
  • 2026-05-17: リテラルについて説明を追加
  • 2026-05-23: signed/unsignedの要素をstd_logicからbitへ誤記修正
Copyright(C) 2026 Altmo
本HPについて