Menu
Coddy logo textTech

ベクタ

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;     // スライスを代入 
challenge icon

チャレンジ

以下のモジュールにはベクタ宣言が必要です。 

作業内容: 

  1. 各入力と出力を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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン