Menu
Coddy logo textTech

Operadores de Redução

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

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

 

OperadorOperaçãoResultado
&AND de Redução1 se todos os bits forem 1
|OR de Redução1 se pelo menos um bit for 1
^XOR de Redução1 se um número ímpar de bits for 1
~&NAND de Redução0 se todos os bits forem 1
~|NOR de Redução0 se pelo menos um bit for 1
~^XNOR de Redução1 se um número par de bits for 1

Como Eles Funcionam

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

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

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

|4'b0000 = 0   // nenhum bit é 1
|4'b0100 = 1   // pelo menos um bit é 1
|4'b1111 = 1   // todos os bits são 1

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

^4'b1010 = 0   // dois 1's (par) → 0
^4'b1000 = 1   // um 1 (ímpar) → 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

Verificar se todos os bits são 1:

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

Verificar se algum bit é 1:

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

Verificar paridade (número ímpar de 1s):

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

Verificar se todos os 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 1s e armazene em odd_parity

Folha de consulta

Operadores de redução operam em todos os bits de um único vetor e os reduzem a um resultado de um único bit.

OperadorOperaçãoResultado
&AND de Redução1 se todos os bits forem 1
|OR de Redução1 se pelo menos um bit for 1
^XOR de Redução1 se um número ímpar de bits forem 1
~&NAND de Redução0 se todos os bits forem 1
~|NOR de Redução0 se pelo menos um bit for 1
~^XNOR de Redução1 se um número par de bits forem 1

Usos comuns:

all_ones   = &data;   // 1 se todos os bits forem 1
any_one    = |data;   // 1 se qualquer bit for 1 (data != 0)
odd_parity = ^data;   // 1 se houver um número ímpar de 1's
all_zeros  = ~|data;  // 1 se data == 0

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