演算子の分類
| 演算子 | 例 |
|---|
| 算術演算子 | +, -, /, mod, rem | | 比較演算子 | =, /=, <, <=, >, >= | | 論理演算子 | and, or, xor, not, nand, nor, xnor | | シフト演算子 | sll, srl, sla, sra, rol, ror | | 連結演算子 | & |
- VHDLの演算子(operator)は、被演算子(operand)のデータタイプによってオーバーロードされます。そのため型一致の原則は演算子を使用するケースでも同じです。
スカラー型に適用できる演算子
integer, natural, positive
| 演算子カテゴリ | 使用可能 | 例 |
|---|
| 算術 | +, -, *, /, mod, rem | a + b | | 比較 | =, /=, <, <=, >, >= | a < b | | 論理 | × | - | | シフト | × | - | | 連結 | × | - |
| 演算子カテゴリ | 使用可能 |
|---|
| 算術 | +, -, *, / | | 比較 | =, /=, <, <=, >, >= | | 論理 | × | | シフト | × | | 連結 | × |
| 演算子カテゴリ | 使用可能 | 例 |
|---|
| 算術 | 無し | - | | 比較 | =, /= | a = b | | 論理 | and, or, xor, not, nand, nor, xnor | a and b | | シフト | 無し | - | | 連結 | 無し | ?- |
| 演算子カテゴリ | 使用可能 | 備考 |
|---|
| 算術 | 無し | - | | 比較 | =, /= | 9値ロジック比較 | | 論理 | and, or, xor, not, nand, nor, xnor | std_logic_1164 の定義 | | シフト | 無し | - | | 連結 | 無し | - |
array型に適用できる演算子
| 演算子カテゴリ | 使用可能 | 備考 |
|---|
| 算術 | 無し(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 | 数値としてのシフト | | 連結 | & | ビット列として |
| 演算子カテゴリ | 使用可能 |
|---|
| 算術 | 無し | | 比較 | =, /= | | 論理 | 無し | | シフト | 無し | | 連結 | & |
ieee.numeric_stdの算術演算子
- array型では
signed と unsigned に算術演算子を提供しています。論理記述で多用する算術演算子とデータタイプの関係をまとめました。
| 型 | +(加算) | -(減算) | *(乗算) | 比較 | 論理 | シフト |
|---|
unsigned | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ | signed | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ | std_logic_vector | × | × | × | =,/= のみ | ◯ | ◯ | integer | ◯ | ◯ | ◯ | ◯ | × | × |
std_logic_vectorとunsigned/signed
- 特に実際の論理記述で多用する
std_logic_vector と unsigned/signed について、その違いと使い分けを見ていきましょう。ポイントは役割の違いです。
| データタイプ | 役割 | 説明 |
|---|
std_logic_vector | ビット列 | 信号線の集合 | unsigned | 数値(正の整数) | 正の整数 | signed | 数値(2の補数) | 整数 |
この後はようやく論理記述へ
- データ型から始まり、リテラル、演算子を見てきました。説明量が多いことに驚いている方もいるでしょう。これには、VHDLのオブジェクトはクラスとデータタイプを組み合わせることと、演算はデータタイプを一致させることの2点が絡んでいます。
- 例えば
signalクラスを与えたことで、ハードウェアの一部として扱うオブジェクトも、データタイプが異なると演算できません。暗黙の型変換を含めて厳密な型一致が要求されます。
- その上、集合体には名前
std_logic_vector, unsigned, signedが付いているものもあり、スカラーの集合体として扱うことに気付くまで、エラーの必然性を理解できないことも多いです。
- そしてエラーは、記述のanalyze時に発生しないものや、ライブラリによって変わることも厄介です。つまり、VHDLのデータ型と演算子はリテラシーとして厳密な理解が要求されます。
- 機会を見てもう少し整理したいとは思いますが、まずはあきらめてお付き合い下さい。
|