ビット演算子
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チャレンジ
与えられた値のビット演算結果を計算してください。
行うこと:
a & bを計算し、and_resに格納してくださいa | bを計算し、or_resに格納してくださいa ^ bを計算し、xor_resに格納してください~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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。