Menu
Coddy logo textTech

ビット演算子

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 23/90。

ビット演算子は、数値の個々のビットに対して操作を行います。数値を一つの値として扱う算術演算子(+, -, *, /)とは異なり、ビット演算子はビット単位で動作します。

利用可能なビット演算子

演算子操作動作
&AND両方の入力ビットが1の場合のみ、出力ビットが1になります
|OR少なくとも一方の入力ビットが1であれば、出力ビットは1になります
^XOR入力ビットが異なる場合、出力ビットは1になります
~NOTすべてのビットを反転させます(0は1に、1は0になります)

ビット演算子を使用すると、Verilogは内部で数値をバイナリ(2進数)として扱います。

reg [3:0] a, b;

a = 4'd10;      // 10進数の10 = 2進数の1010
b = 4'd12;      // 10進数の12 = 2進数の1100
c = a & b;      // バイナリを直接使用するのと同じように動作します

数値は10進数、16進数、または2進数で記述できます。Verilogはビット演算のためにこれらを2進数に変換します。

ビット演算の仕組み

各演算子は、ビットのペア(NOTの場合は単一のビット)に対して作用します:

4ビット数値の例:

a = 1010  (binary)
b = 1100  (binary)

AND:  a & b = 1000
      (1&1=1, 0&1=0, 1&0=0, 0&0=0)

OR:   a | b = 1110
      (1|1=1, 0|1=1, 1|0=1, 0|0=0)

XOR:  a ^ b = 0110
      (1^1=0, 0^1=1, 1^0=1, 0^0=0)

NOT:  ~a = 0101
      (~1=0, ~0=1, ~1=0, ~0=1)

コード例

module bitwise_demo;
  reg [3:0] a, b;
  reg [3:0] and_res, or_res, xor_res, not_res;
  
  initial begin
    a = 4'b1010;
    b = 4'b1100;
    
    and_res = a & b;   // 1010 & 1100 = 1000
    or_res  = a | b;   // 1010 | 1100 = 1110
    xor_res = a ^ b;   // 1010 ^ 1100 = 0110
    not_res = ~a;      // ~1010 = 0101
    
    $display("a = %b", a);
    $display("b = %b", b);
    $display("a & b = %b", and_res);
    $display("a | b = %b", or_res);
    $display("a ^ b = %b", xor_res);
    $display("~a    = %b", not_res);
    $finish;
  end
endmodule

出力:

a = 1010
b = 1100
a & b = 1000
a | b = 1110
a ^ b = 0110
~a    = 0101
challenge icon

チャレンジ

与えられた値のビット演算結果を計算してください。

行うこと:

  1. a & b を計算し、and_res に格納してください
  2. a | b を計算し、or_res に格納してください
  3. a ^ b を計算し、xor_res に格納してください
  4. ~a を計算し、not_res に格納してください

チートシート

ビット演算子は、数値の各ビットに対して個別に動作します:

演算子操作出力ビットが1になる条件...
&AND両方の入力ビットが1のとき
|OR少なくとも1つの入力ビットが1のとき
^XOR入力ビットが異なるとき
~NOTすべてのビットを反転させる(単項演算)
// a = 1010, b = 1100
a & b = 1000   // AND
a | b = 1110   // OR
a ^ b = 0110   // XOR
~a    = 0101   // NOT

自分で試してみよう

module bitwise_challenge;
  reg [3:0] a, b;
  reg [3:0] and_res, or_res, xor_res, not_res;
  
  initial begin
    a = 4'b1101;
    b = 4'b1011;
    
    and_res = ______;   // a & b
    or_res  = ______;   // a | b
    xor_res = ______;   // a ^ b
    not_res = ______;   // ~a
    
    $display("a = %b", a);
    $display("b = %b", b);
    $display("a & b = %b", and_res);
    $display("a | b = %b", or_res);
    $display("a ^ b = %b", xor_res);
    $display("~a    = %b", not_res);
    $finish;
  end
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン