Menu
Coddy logo textTech

Reduction Operators

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 25 de 90.

Os operadores de redução operam em all bits de um único vetor e os reduzem a um resultado de single bit. Ao contrário dos operadores bit a bit, que comparam dois números bit a bit, os operadores de redução recebem um número e executam uma operação em todos os seus bits para produzir um único resultado.

 

OperadorOperaçãoResultado
&AND de redução1 se all bits forem 1
|OR de redução1 se at least one bit for 1
^XOR de redução1 se um odd number de bits for 1
~&NAND de redução0 se all bits forem 1
~|NOR de redução0 se at least one bit for 1
~^XNOR de redução1 se um even number de bits for 1

Como Funcionam

AND de redução (<strong>&</strong>):

&4'b1111 = 1   // all bits are 1
&4'b1011 = 0   // nem todos os bits são 1
&4'b0000 = 0   // all bits are 0

OR de redução (<strong>|</strong>):

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // pelo menos um bit é 1
|4'b1111 = 1   // all bits are 1

XOR de redução (<strong>^</strong>):

^4'b1010 = 0   // two 1's (even) → 0
^4'b1000 = 1   // one 1 (odd) → 1
^4'b1111 = 0   // quatro 1's (par) → 0

Exemplo de código

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

Saída:

&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1

Usos comuns

Verifique se todos os bits são 1:

all_ones = &data;   // 1 se data == 8'b11111111

Verifique se algum bit é 1:

any_one = |data;    // 1 se data != 0

Verifique a paridade (quantidade ímpar de 1s):

odd_parity = ^data; // 1 se número ímpar de 1's

Verifique se all bits são 0:

all_zeros = ~|data; // 1 se data == 0
challenge icon

Desafio

Escreva as expressões de redução corretas para cada tarefa.

O que fazer:

  1. Verifique se todos os bits de a são 1 e armazene em all_ones
  2. Verifique se algum bit de b é 1 e armazene em any_one
  3. Verifique se c tem um número ímpar de 1's e armazene em odd_parity

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online