リダクション演算子
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 25/90。
リダクション演算子は、単一のベクトルのすべてのビットに対して動作し、それらを1ビットの結果に短縮します。2つの数値をビットごとに比較するビット単位演算子とは異なり、リダクション演算子は1つの数値を受け取り、そのすべてのビットにわたって演算を実行して、単一の結果を生成します。
| 演算子 | 操作 | 結果 |
|---|---|---|
& | リダクションAND | すべてのビットが1の場合に1 |
| | リダクションOR | 少なくとも1つのビットが1の場合に1 |
^ | リダクションXOR | ビットの奇数個が1の場合に1 |
~& | リダクションNAND | すべてのビットが1の場合に0 |
~| | リダクションNOR | 少なくとも1つのビットが1の場合に0 |
~^ | リダクションXNOR | ビットの偶数個が1の場合に1 |
動作の仕組み
リダクションAND (<strong>&</strong>):
&4'b1111 = 1 // すべてのビットが1
&4'b1011 = 0 // すべてのビットが1ではない
&4'b0000 = 0 // すべてのビットが0リダクションOR (<strong>|</strong>):
|4'b0000 = 0 // 1のビットがない
|4'b0100 = 1 // 少なくとも1つのビットが1
|4'b1111 = 1 // すべてのビットが1縮約XOR (<strong>^</strong>):
^4'b1010 = 0 // 1が2個 (偶数) → 0
^4'b1000 = 1 // 1が1個 (奇数) → 1
^4'b1111 = 0 // 1が4個 (偶数) → 0コード例
module reduction_demo;
reg [3:0] a, b, c;
reg and_red, or_red, xor_red;
initial begin
a = 4'b1111;
b = 4'b1010;
c = 4'b1000;
and_red = &a; // 1111 → 1
or_red = |b; // 1010 → 1
xor_red = ^c; // 1000 → 1
$display("&4'b1111 = %d", and_red);
$display("|4'b1010 = %d", or_red);
$display("^4'b1000 = %d", xor_red);
$finish;
end
endmodule出力:
&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1一般的な用途
すべてのビットが1であるか確認する:
all_ones = &data; // data == 8'b11111111 の場合に 1いずれかのビットが1であるかを確認する:
any_one = |data; // data != 0 の場合に 1パリティのチェック(1の数が奇数個か):
odd_parity = ^data; // 1の数が奇数個の場合は1すべてのビットが0であるか確認する:
all_zeros = ~|data; // data == 0 の場合は 1チャレンジ
各タスクに対して正しいリダクション演算式を記述してください。
作業内容:
aのすべてのビットが 1 であるかを確認し、all_onesに格納してくださいbのいずれかのビットが 1 であるかを確認し、any_oneに格納してくださいcの 1 の数が奇数個であるかを確認し、odd_parityに格納してください
チートシート
リダクション演算子は、単一ベクトルのすべてのビットに対して動作し、それらを1ビットの結果に縮約します。
| 演算子 | 動作 | 結果 |
|---|---|---|
& | リダクションAND | すべてのビットが1の場合に1 |
| | リダクションOR | 少なくとも1つのビットが1の場合に1 |
^ | リダクションXOR | ビットの奇数個が1の場合に1 |
~& | リダクションNAND | すべてのビットが1の場合に0 |
~| | リダクションNOR | 少なくとも1つのビットが1の場合に0 |
~^ | リダクションXNOR | ビットの偶数個が1の場合に1 |
一般的な用途:
all_ones = &data; // すべてのビットが1の場合に1
any_one = |data; // いずれかのビットが1の場合に1 (data != 0)
odd_parity = ^data; // 1の数が奇数個の場合に1
all_zeros = ~|data; // data == 0 の場合に1自分で試してみよう
module reduction_challenge;
reg [3:0] a, b, c;
reg all_ones, any_one, odd_parity;
initial begin
a = 4'b1111;
b = 4'b0100;
c = 4'b1011;
all_ones = ______; // all bits 1?
any_one = ______; // any bit 1?
odd_parity = ______; // odd number of 1's?
$display("&4'b1111 = %d", all_ones);
$display("|4'b0100 = %d", any_one);
$display("^4'b1011 = %d", odd_parity);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。