Menu
Coddy logo textTech

리덕션 연산자

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 25번째.

리덕션 연산자(Reduction operators)는 단일 벡터의 모든 비트에 대해 작동하며, 이를 단일 비트 결과로 축약합니다. 두 숫자를 비트별로 비교하는 비트 단위 연산자(bitwise operators)와 달리, 리덕션 연산자는 하나의 숫자를 취해 모든 비트에 대해 연산을 수행하여 단일 결과를 생성합니다.

 

연산자연산결과
&축약 AND (Reduction AND)모든 비트가 1이면 1
|축약 OR (Reduction OR)최소한 하나의 비트가 1이면 1
^축약 XOR (Reduction XOR)비트 중 1의 개수가 홀수이면 1
~&축약 NAND (Reduction NAND)모든 비트가 1이면 0
~|축약 NOR (Reduction NOR)최소한 하나의 비트가 1이면 0
~^축약 XNOR (Reduction 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임
|4'b1111 = 1   // 모든 비트가 1임

리덕션 XOR (<strong>^</strong>):

^4'b1010 = 0   // 1이 두 개 (짝수) → 0
^4'b1000 = 1   // 1이 한 개 (홀수) → 1
^4'b1111 = 0   // 1이 네 개 (짝수) → 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
challenge icon

챌린지

각 작업에 대해 올바른 축약 연산식을 작성하세요.

수행할 작업:

  1. a의 모든 비트가 1인지 확인하고 all_ones에 저장하세요.
  2. b의 비트 중 하나라도 1인지 확인하고 any_one에 저장하세요.
  3. c의 1의 개수가 홀수인지 확인하고 odd_parity에 저장하세요.

치트 시트

축약 연산자(Reduction operators)는 단일 벡터의 모든 비트를 대상으로 동작하며, 이를 단일 비트 결과로 축약합니다.

연산자연산결과
&축약 AND모든 비트가 1이면 1
|축약 OR적어도 하나의 비트가 1이면 1
^축약 XOR1인 비트의 개수가 홀수이면 1
~&축약 NAND모든 비트가 1이면 0
~|축약 NOR적어도 하나의 비트가 1이면 0
~^축약 XNOR1인 비트의 개수가 짝수이면 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
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨