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 todos los bits de un solo 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 a bit, los operadores de reducción toman un número y realizan una operación a través de 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 un número impar de bits 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 un número par de bits son 1

Cómo funcionan

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

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

OR de reducción (<strong>|</strong>):

|4'b0000 = 0   // ningún bit es 1
|4'b0100 = 1   // al menos un bit es 1
|4'b1111 = 1   // todos los bits son 1

XOR de reducción (<strong>^</strong>):

^4'b1010 = 0   // dos 1s (par) → 0
^4'b1000 = 1   // un 1 (impar) → 1
^4'b1111 = 0   // cuatro 1s (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

Resultado:

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

Usos comunes

Comprobar si todos los bits son 1:

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

Comprobar si algún bit es 1:

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

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

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

Comprobar 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 almacénalo en all_ones
  2. Comprueba si algún bit de b es 1 y almacénalo en any_one
  3. Comprueba si c tiene un número impar de 1's y almacénalo en odd_parity

Hoja de referencia

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.

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 un número impar de bits 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 un número par de bits son 1

Usos comunes:

all_ones   = &data;   // 1 si todos los bits son 1
any_one    = |data;   // 1 si algún bit es 1 (data != 0)
odd_parity = ^data;   // 1 si hay un número impar de 1s
all_zeros  = ~|data;  // 1 si data == 0

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