ベクタ
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 9/90。
vector はマルチ bit の wire や reg です。single bit の代わりに、vector を使用すると data の bus を扱うことができます。これはまとめてグループ化された bits の集合です。
注: vectorは別のデータ型ではありません。単に wire や reg のマルチビット版です。
wire single; // 単一ビット
wire [7:0] bus; // 8ビットベクトル(ビット7から0まで)ベクトルを宣言するには、[MSB:LSB] という構文を使用します。ここで MSB は最上位ビット(most significant bit)、LSB は最下位ビット(least significant bit)です。
wire [3:0] a; // 4ビットのwireベクトル
reg [7:0] data; // 8ビットのregベクトル
wire [15:0] addr; // 16ビットのwireベクトルビットへのアクセス
ベクトルの個々のビットやスライスにアクセスする際は、ビット位置(インデックス)には十進数を使用し、代入には 2 進数値(0 または 1)を使用します。
これは、ビット位置が住所のような場所であり、自然と十進数で表されるのに対し、そのビットに格納される値は 0 または 1(バイナリの選択肢)にしかならないためです。
例えば、data[0] は「bit 番号 0」を意味し、= 1 は「ハイに設定する」ことを意味します。single bit に 75 のような 10 進数を assign しても 75 は保存されません — Verilog は黙って最下位 bit のみを保持します — そのため、常に明示的に 0 または 1 を記述してください。
reg [7:0] data;
data = 170;
data[0] = 1; // LSBを1に設定
data[7] = 0; // MSBを0に設定
data[3:1] = 3'b101; // Set bits 3,2,1 to 101 (binary remains)Bit Order
ビットの順序は重要です:
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; // Assign a slice チャレンジ
以下の module には vector 宣言が必要です。
作業内容:
- 各 input と output を 8-bit の vector に Change してください。
自分で試してみよう
module vector_example(
input a, // 8ビットベクトル [7:0] に変更
input b, // 8ビットベクトル [7:0] に変更
output c // 8ビットベクトル [7:0] に変更
);
assign c = a & b;
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。