Menu
Coddy logo textTech

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 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 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 (<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