VHDL: 演算子
2026/05/24

演算子の分類

  • VHDLの演算子は下記5種類に分類されます。
    演算子
    算術演算子+, -, /, mod, rem
    比較演算子=, /=, <, <=, >, >=
    論理演算子and, or, xor, not, nand, nor, xnor
    シフト演算子sll, srl, sla, sra, rol, ror
    連結演算子&
  • VHDLの演算子(operator)は、被演算子(operand)のデータタイプによってオーバーロードされます。そのため型一致の原則は演算子を使用するケースでも同じです。

スカラー型に適用できる演算子

  • integer, natural, positive
    演算子カテゴリ使用可能
    算術+, -, *, /, mod, rema + b
    比較=, /=, <, <=, >, >=a < b
    論理×-
    シフト×-
    連結×-
  • real
    演算子カテゴリ使用可能
    算術+, -, *, /
    比較=, /=, <, <=, >, >=
    論理×
    シフト×
    連結×
  • boolean
    演算子カテゴリ使用可能
    算術無し-
    比較=, /=a = b
    論理and, or, xor, not, nand, nor, xnora and b
    シフト無し-
    連結無し?-
  • std_logic
    演算子カテゴリ使用可能備考
    算術無し-
    比較=, /=9値ロジック比較
    論理and, or, xor, not, nand, nor, xnorstd_logic_1164 の定義
    シフト無し-
    連結無し-

array型に適用できる演算子

  • std_logic_vector
    演算子カテゴリ使用可能備考
    算術無し(numeric_std では不可)unsigned/signed に変換が必要
    比較=, /=ビット列比較
    論理and, or, xor, not, nand, nor, xnor要素ごと
    シフトsll, srl, sla, sra, rol, rorビット列として
    連結&"01" & "10"
  • unsigned, signed (numeric_std)
    演算子カテゴリ使用可能備考
    算術+, -, *, /(一部)数値として扱われる
    比較=, /=, <, <=, >, >=数値比較
    論理and, or, xor, not要素ごと
    シフトsll, srl, sla, sra, rol, ror数値としてのシフト
    連結&ビット列として
  • string
    演算子カテゴリ使用可能
    算術無し
    比較=, /=
    論理無し
    シフト無し
    連結&

ieee.numeric_stdの算術演算子

  • array型ではsignedunsigned に算術演算子を提供しています。論理記述で多用する算術演算子とデータタイプの関係をまとめました。
    +(加算)-(減算)*(乗算)比較論理シフト
    unsigned
    signed
    std_logic_vector×××=,/= のみ
    integer××

std_logic_vectorunsigned/signed

  • 特に実際の論理記述で多用する std_logic_vectorunsigned/signed について、その違いと使い分けを見ていきましょう。ポイントは役割の違いです。
    データタイプ役割説明
    std_logic_vectorビット列信号線の集合
    unsigned数値(正の整数)正の整数
    signed数値(2の補数)整数
  • ライブラリieee.numeric_stdを使用時、unsigned/signedは数値なので算術演算子(+, -, *)の適用対象ですが、std_logic_vectorは物理的な信号なので算術演算はできません。

  • 比較演算子も同様で、数値であるunsigned/signedは大小関係を含めた比較演算子全て(=, /=, <、<=、>、>=)を利用できますが、std_logic_vectorでは一致と不一致(=, /=)だけが使えます。

  • シフト演算では、signed/unsignedは数値扱いのため、左シフトでbitデータは失われず、データbit幅は増えます。signedでは右シフト時に符号が維持されます。
    std_logic_vector("1000") srl 1 -- ⇒ "0100" =  4 論理右シフト
    signed("1000") sra 1           -- ⇒ "1100" = -4 算術右シフト
    
    std_logic_vector("1000") sll 1 -- ⇒ "0000"  =  0 論理左シフト
    signed("1000") sla 1           -- ⇒ "10000" = 16 算術左シフト
    

この後はようやく論理記述へ

  • データ型から始まり、リテラル、演算子を見てきました。説明量が多いことに驚いている方もいるでしょう。これには、VHDLのオブジェクトはクラスとデータタイプを組み合わせることと、演算はデータタイプを一致させることの2点が絡んでいます。

  • 例えばsignalクラスを与えたことで、ハードウェアの一部として扱うオブジェクトも、データタイプが異なると演算できません。暗黙の型変換を含めて厳密な型一致が要求されます。

  • その上、集合体には名前std_logic_vector, unsigned, signedが付いているものもあり、スカラーの集合体として扱うことに気付くまで、エラーの必然性を理解できないことも多いです。

  • そしてエラーは、記述のanalyze時に発生しないものや、ライブラリによって変わることも厄介です。つまり、VHDLのデータ型と演算子はリテラシーとして厳密な理解が要求されます

  • 機会を見てもう少し整理したいとは思いますが、まずはあきらめてお付き合い下さい。
Copyright(C) 2026 Altmo
本HPについて