ベクタ
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 9/90。
ベクタは、マルチビットの wire または reg です。単一のビットではなく、ベクタを使用することでデータのバスを扱うことができます。これは、ひとまとめにされたビットの集合です。
注記: ベクトルは独立したデータ型ではありません。これは単に wire または reg のマルチビット版です。
wire single; // 1ビット
wire [7:0] bus; // 8ビットベクトル (ビット7から0)ベクタを宣言するには、[MSB:LSB]という構文を使用します。ここで、MSBは最上位ビット、LSBは最下位ビットです。
wire [3:0] a; // 4ビットのwireベクタ
reg [7:0] data; // 8ビットのregベクタ
wire [15:0] addr; // 16ビットのwireベクタビットへのアクセス
ベクトルの個々のビットやスライスにアクセスする場合、ビット位置(インデックス)には10進数を使用し、代入にはバイナリ値(0または1)を使用します。
これは、ビット位置が(アドレスのような)場所であり、通常は10進数で表現されるのに対し、そのビットに格納される値は0または1のいずれか、つまり2進法的な選択肢しかないためです。
例えば、data[0] は「ビット番号0」を意味し、= 1 は「それをハイに設定する」ことを意味します。ビットには0または1以外の値を保持する余裕がないため、1つのビットに75のような10進数を代入することはできません。
reg [7:0] data;
data = 170;
data[0] = 1; // LSBを1に設定
data[7] = 0; // MSBを0に設定
data[3:1] = 3'b101; // ビット3,2,1を101に設定(バイナリはそのまま)ビット順序
ビットの順序は重要です:
wire [3:0] a; // a[3] が MSB、a[0] が LSB です
wire [0:3] b; // b[0] が MSB、b[3] が LSB です(あまり一般的ではありません)ほとんどの設計者は、MSBを左側にした[MSB:LSB]形式を使用します。
値の代入
reg [3:0] a;
a = 10;
a = 5;
a = 3; ベクタスライス
ビットの範囲にアクセスできます:
reg [15:0] word;
word[15:8] = 255; // 上位バイトを代入 (8'hFF = 255)
word[7:0] = 0; // 下位バイトを代入 (8'h00 = 0)
word[3:1] = 3'b101; // スライスを代入 チャレンジ
以下のモジュールにはベクタ宣言が必要です。
作業内容:
- 各入力と出力を8ビットのベクタに変更してください。
チートシート
ベクタは複数ビットの wire または reg で、[MSB:LSB] 構文を使用して宣言されます:
wire [7:0] bus; // 8ビットのwireベクタ
reg [15:0] addr; // 16ビットのregベクタ個々のビットやスライスへのアクセス:
reg [7:0] data;
data[0] = 1; // LSBを1に設定
data[7] = 0; // MSBを0に設定
data[3:1] = 3'b101; // 2進数を使用してビット3,2,1を設定ビット順序: [MSB:LSB] が標準的な慣習です(例:[7:0] はビット7がMSB、ビット0がLSBであることを意味します)。
自分で試してみよう
module vector_example(
input a, // 8ビットベクタ [7:0] に変更
input b, // 8ビットベクタ [7:0] に変更
output c // 8ビットベクタ [7:0] に変更
);
assign c = a & b;
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。