51 / 63 · Concepto
ALU e indicadores zero, negative, carry y overflow
Implemente ADD/SUB con un sumador compartido y derive comparaciones distinguiendo carry de overflow signed.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Requisitos previos: complemento a dosComplemento a dos Representación de enteros con signo mediante secuencias de bits de ancho fijo. El rango de n bits va de −2^(n−1) a 2^(n−1)−1. Más información, sumadores, MUXMultiplexor Circuito combinacional que conecta una de varias entradas a la salida según una señal de selección. Debe especificarse la correspondencia entre los bits de selección y los números de entrada. Más información combinacionales y extensión de ancho.
Una ALU produce resultado y estado
La ALU selecciona resultados de operaciones y emite indicadores para interpretarlos. En este diseño, tienen bits y se admiten ADD, SUB, AND, OR y XOR. Los resultados aritméticos conservan solo los bits bajos. Los mismos bits pueden interpretarse como unsignedunsigned Interpretación de una secuencia de bits como entero no negativo. Con n bits, el rango es de 0 a 2^n−1; puede diferir de la interpretación signed de los mismos bits. Más información o signed en complemento a dos; por eso se separan carry y overflow. No hacen falta dos sumadores según el signo.
Se definen y . Z es una reducción NOR de todo el resultado seleccionado; N es el bit superior. N=1 indica que la interpretación signed almacenada es negativa; si hay overflow, puede no coincidir con el signo de la suma exacta.
Separe carry y overflow
Para suma, C es el bit superior de la suma extendida :
V vale 1 si ambos operandos tienen el mismo signo y el resultado otro. Si son los bits superiores:
En ocho bits, da R=0, C=1, V=0: signed es , dentro del rango. En cambio, da R=0x80, C=0, V=1: unsigned 128 cabe, pero supera el máximo signed 127. Unir C y V impediría distinguirlos.
Para restar, inviertaNegación Operación NOT que cambia 0 por 1 y 1 por 0. Una barra sobre una expresión aplica NOT a toda la expresión cubierta. Más información únicamente los W bits de B y luego extienda con 0: . Invertir los W+1 bits alteraría el significado del carry superior. Aquí C=1 significa sin préstamo; por tanto, unsigned equivale a .
Solo restar signos distintos puede producir overflow signed. Una comparación puede usar los indicadores de SUB sin guardar R. signed es y es . Por ejemplo, almacena +127, pero V=1 corrige el error de mirar solo N.
El siguiente ADD cabe en unsigned pero no en signed. Observe que C=0 y V=1 pueden coexistir.
- A=7F · B=01: signed 127 + 1
- Suma T de nueve bits: 0_10000000
- Resultado R de ocho bits: 80 → signed −128
- Indicadores de estado: Z=0 · N=1 · C=0 · V=1
Sumador compartido y reglas explícitas de salida
El RTL supone W≥2. Los códigos 0–4 son ADD, SUB, AND, OR y XOR. Para operaciones lógicas, C=V=0. Un código no usado produce R=0, Z=1 y los demás indicadores a 0. Es el contrato de esta ALU, no una imitación de una ISA concreta.
module alu #(parameter int W = 8) (
input logic [W-1:0] a, b,
input logic [2:0] op,
output logic [W-1:0] y,
output logic z, n, c, v
);
logic sub;
logic [W-1:0] bx;
logic [W:0] sum;
always_comb begin
sub = (op == 3'd1);
bx = b ^ {W{sub}};
sum = {1'b0, a} + {1'b0, bx}
+ {{W{1'b0}}, sub};
y = '0;
c = 1'b0;
v = 1'b0;
case (op)
3'd0, 3'd1: begin
y = sum[W-1:0];
c = sum[W];
if (sub)
v = (a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
else
v = ~(a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
end
3'd2: y = a & b;
3'd3: y = a | b;
3'd4: y = a ^ b;
default: y = '0;
endcase
z = ~(|y);
n = y[W-1];
end
endmoduleLa inversión condicional de B y el carry inicial expresan ADD/SUB con la misma estructura. Calcular primero la salida y en cada rama y después los indicadores Z,N da resultados coherentes también para las operaciones lógicas. Las asignaciones predeterminadas cubren todas las salidas y evitan latchesLatch Elemento de almacenamiento que sigue la entrada mientras el control está activo y conserva el valor cuando está inactivo. Se distingue del flip-flop, que captura solo en un flanco. Más información. Sin registrosRegistro Circuito que almacena varios bits de estado. Los registros síncronos de este curso capturan la entrada especificada en el flanco de reloj. Más información, no hay latencia en ciclos, pero sí retardo físico. El MUX de operación y el detector de cero también deben llegar antes del setup del registro siguiente.
Para verificar, combine 0, máximo unsigned, extremos signed y valores a ambos lados de cada límite. Compare R con una referencia módulo , C con la suma unsigned extendida y V con el exceso de rango signed, independientemente. R correcto no garantiza indicadores correctos.
Un ejemplo real de esta separación entre signo, cero, carry unsigned y overflow signed aparece en la explicación de indicadores de condición de Arm.
Inténtalo tú
En una ALU de 8 bits, calcule R,Z,N,C,V para (1) 0x7F+0x01, (2) 0xFF+0x01, (3) 0x00−0x01 y (4) 0x80−0x01. Explique por qué comparar los operandos signed del caso 4 usando solo N falla.
Leer la explicación
En orden (R,Z,N,C,V): (1) (0x80,0,1,0,1), (2) (0x00,1,0,1,0), (3) (0xFF,0,1,0,0), (4) (0x7F,0,0,1,1). En (3) hay préstamo unsigned, C=0, y −1 signed es representable. En (4), unsigned 128−1=127 no requiere préstamo, C=1; signed −128−1=−129 desborda y V=1. El N=0 almacenado no refleja el signo de la diferencia exacta. N xor V=1 da correctamente A<B signed.