Menu
Coddy logo textTech

Reduction Operators

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

Los operadores de reducción trabajan sobre all bits de un solo vector y los reducen a un resultado de single 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 sobre todos sus bits para producir un único resultado.

 

OperadorOperaciónResultado
&AND de reducción1 si all bits son 1
|OR de reducción1 si hay at least one bit que es 1
^XOR de reducción1 si un odd number de bits son 1
~&NAND de reducción0 si all bits son 1
~|NOR de reducción0 si hay at least one bit que es 1
~^XNOR de reducción1 si un número even de bits son 1

Cómo funcionan

AND de reducción (<strong>&</strong>):

&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 (<strong>|</strong>):

|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 (<strong>^</strong>):

^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

Comprobar la paridad (número impar de 1):

odd_parity = ^data; // 1 si 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 almacena el resultado en all_ones
  2. Comprueba si algún bit de b es 1 y almacena el resultado en any_one
  3. Comprueba si c tiene un número impar de 1 y almacena 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