Menu
CoddyTech

Operadores de reducción

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 25 de 90.

Los operadores de reducción actúan sobre todos los bits de un único vector y los reducen a un resultado de un solo bit. A diferencia de los operadores bit a bit, que comparan dos números bit por bit, los operadores de reducción toman un número y realizan una operación en todos sus bits para producir un único resultado.

 

OperadorOperaciónResultado
&AND de reducción1 si todos los bits son 1
|OR de reducción1 si al menos un bit es 1
^XOR de reducción1 si hay un número impar de bits que son 1
~&NAND de reducción0 si todos los bits son 1
~|NOR de reducción0 si al menos un bit es 1
~^XNOR de reducción1 si hay un número par de bits que son 1

Cómo funcionan

AND de reducción (&):

&4'b1111 = 1   // all bits are 1
&4'b1011 = 0   // no todos los bits son 1
&4'b0000 = 0   // all bits are 0

OR de reducción (|):

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // al menos un bit es 1
|4'b1111 = 1   // all bits are 1

XOR de reducción (^):

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

Ejemplo 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

Salida:

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

Usos comunes

Comprueba si todos los bits son 1:

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

Comprueba si algún bit es 1:

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

Comprueba la paridad (número impar de unos):

odd_parity = ^data; // 1 si hay un número impar de 1's

Comprueba si todos los bits son 0:

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

Desafío

Escribe las expresiones de reducción correctas para cada tarea.

Qué hacer:

  1. Comprueba si todos los bits de a son 1 y guarda el resultado en all_ones
  2. Comprueba si algún bit de b es 1 y guarda el resultado en any_one
  3. Comprueba si c tiene un número impar de 1 y guarda el resultado en odd_parity

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos

Practica por tu cuenta: Compilador de Verilog online