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.
| Operador | Operación | Resultado |
|---|---|---|
& | AND de reducción | 1 si todos los bits son 1 |
| | OR de reducción | 1 si al menos un bit es 1 |
^ | XOR de reducción | 1 si hay un número impar de bits que son 1 |
~& | NAND de reducción | 0 si todos los bits son 1 |
~| | NOR de reducción | 0 si al menos un bit es 1 |
~^ | XNOR de reducción | 1 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 0OR 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 1XOR 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) → 0Ejemplo 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
endmoduleSalida:
&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1Usos comunes
Comprueba si todos los bits son 1:
all_ones = &data; // 1 si data == 8'b11111111Comprueba si algún bit es 1:
any_one = |data; // 1 si data != 0Comprueba la paridad (número impar de unos):
odd_parity = ^data; // 1 si hay un número impar de 1'sComprueba si todos los bits son 0:
all_zeros = ~|data; // 1 si data == 0Desafío
Escribe las expresiones de reducción correctas para cada tarea.
Qué hacer:
- Comprueba si todos los bits de
ason 1 y guarda el resultado enall_ones - Comprueba si algún bit de
bes 1 y guarda el resultado enany_one - Comprueba si
ctiene un número impar de 1 y guarda el resultado enodd_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
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
Qué es VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: circuito de compuertas lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores, parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un móduloPractica por tu cuenta: Compilador de Verilog online