Electrónica Digital · Tema 27

ALU elemental

Cinco operaciones, un selector: AND, OR, XOR, ADD y SUB con banderas que avisan.

01 · Punto de partida

Calculadora de 5 botones

El mismo silicio suma, resta y opera bits según S1S0 + M: AND, OR, XOR, ADD, SUB. Más 4 banderas (Z, C, N, V) que el micro usará para saltar. Es la 74181 en miniatura.

  • ¿Qué hace cada operación?
  • ¿Cómo se resta sin restador?
  • ¿Qué avisa cada flag?
  • ¿Cómo crece a N bits?

02 · Operaciones

Cinco por el precio de una

ALU 1 bit (lógicas ignoran Cin).
OPFCout
ANDA·B0
ORA+B0
XORA⊕B0
ADDA⊕B⊕Cinmayoría
SUBA⊕~B⊕Bin~préstamo

SUB con Bin=1: A + ~B + 1 (Tema 24). Cout en SUB = 1 significa “alcanzó” (sin préstamo); 0 = pidió prestado.

03 · N bits y 74181

Ripple + banderas

ALU discreta (taller)

Ripple de 1 bit

4 celdas encadenadas como el sumador: simple, didáctica, lenta.

74181 (la real)

4 bits, 22 operaciones

Con P/G para lookahead y salidas A=B + carry. La de los minis de los 70.

Z (cero)
F = 0000: igualdad, fin de conteo, string terminado. La más usada.
C (carry)
Acarreo/préstamo del MSB: aritmética sin signo y rotaciones.
N (signo)
Copia del MSB: con Ca2 dice si es negativo.
V (overflow)
Cin≠Cout del MSB: la suma con signo mintió (Tema 24).

04 · Para qué sirven

Los ojos del programa

El micro salta según flags: BEQ (Z=1), BCS (C=1), BMI (N=1). Sin ALU no hay comparación; sin flags no hay if. El curso 7 los usará; este tema los fabrica.

ALU opera →flags avisan →programa salta

05 · ALU en código

Cinco ops, cuatro flags

ALU de 1 bit más versión 4 bits con banderas.

Python en tu navegador. Operá y mirá los flags.

def alu1(op, a, b, cin=0):
    if op == "AND":
        f, c = a and b, 0
    elif op == "OR":
        f, c = a or b, 0
    elif op == "XOR":
        f, c = a ^ b, 0
    elif op == "ADD":
        f, c = a ^ b ^ cin, (a and b) or (a and cin) or (b and cin)
    else:
        nb = 1 - b
        f, c = a ^ nb ^ cin, (a and nb) or (a and cin) or (nb and cin)
    print(f"{op} {a},{b},{cin} -> F={int(f)} Cout={int(c)}")
    return int(f), int(c)


for op in ("AND", "OR", "XOR", "ADD", "SUB"):
    alu1(op, 1, 0, 1)

AND 1,0→0; OR→1; XOR→1; ADD 1+0+1→0 c1; SUB 1−0… con Bin=1: 1+1+1→1 c1. ¿Y SUB 0−1?

4 bits con flags

def alu4(op, a, b):
    bb = b if op != "SUB" else (~b) & 0xF
    cin, f, cs = (1 if op == "SUB" else 0), 0, []
    for i in range(4):
        ai, bi = (a >> i) & 1, (bb >> i) & 1
        if op in ("ADD", "SUB"):
            si, cout = ai ^ bi ^ cin, (ai and bi) or (ai and cin) or (bi and cin)
        else:
            si = {"AND": ai and bi, "OR": ai or bi, "XOR": ai ^ bi}[op]
            cout = 0
        f |= si << i
        cs.append(int(cout))
        cin = int(cout)
    z, n, v = (f == 0), (f >> 3) & 1, (cs[2] ^ cs[3])
    print(f"{op} {a:04b},{b:04b} -> {f:04b}={f} Z={int(z)} N={n} V={v} C={cin}")
    return f


alu4("ADD", 9, 6)
alu4("SUB", 6, 9)
alu4("AND", 9, 6)

06 · Analogía programador

CPU en miniatura

  1. 1
    ALU = calculadora.

    Opera sin decidir el programa: el opcode elige, ella ejecuta.

  2. 2
    Flags = return codes.

    Cero, carry, signo: como exit codes que el siguiente comando consulta.

  3. 3
    74181 = librería.

    Operaciones listas y probadas: no reescribir lo que el MSI ya da.

07 · Exploración

Laboratorio: mini-181

ALU de 4 bits con 5 operaciones: mové A/B y mirá F más banderas.

LABORATORIO 27

Mini-181

ADD 9+6 = 1111

F binario1111
F decimal15
Cout0
Z N V0 1 0

ADD 9+6: F=1111 (15), Cout 0.

Preguntas para explorar

  1. Probá AND con 9 y 6. ¿F? ¿Por qué 0?
  2. Probá SUB 6−9. ¿F? ¿Cout? ¿Qué significa?
  3. Probá ADD 7+7. ¿F? ¿V? ¿Por qué?
Ver respuestas sugeridas
  1. 0 (1001·0110 sin bits comunes): AND exige coincidencia por posición.
  2. 1101 (13), Cout 0 = pidió prestado: 6−9 = −3 mod 16 ✓. (V da 1 porque con signo leería 6−(−7) = 13: overflow. V siempre habla en Ca2.)
  3. 1110 (14), V=1: 7+7 = 14 > 7 con signo (Cin MSb=1, Cout=0): overflow.

08 · Comprensión

Confusiones frecuentes

«ALU = microprocesador»

Falta control, registros y programa: la ALU es el músculo, no el cerebro. Cerebro en el curso 7.

«Resta con otro circuito»

XOR en B + Cin=1 convierten el sumador: M elige sin duplicar silicio.

«Flags decorativos»

Los usa cada salto condicional: Z decide ==, C decide >= sin signo. Sin flags no hay if.

«Cout en SUB es carry»

Es “no-préstamo”: 1 = alcanzó, 0 = pidió. Leerlo al revés que en ADD es el error clásico.

09 · Práctica guiada

Ejercicios de operación

Ejercicio 1: tabla de 1 bit

Completá AND/OR/XOR/ADD/SUB para (1,0,1). Verificá cada fila con alu1().

Ver solución razonada

AND 0, OR 1, XOR 1, ADD 0 c1, SUB 1 c1: ADD 1+0+1 = 0 lleva 1; SUB 1+1+1 (B negado) = 1 lleva 1.

Ejercicio 2: flags de 0

SUB 5−5. ¿F? ¿Z? ¿Cout? ¿Qué “dice” cada flag?

Ver solución

F=0000, Z=1, Cout=1: cero (“iguales”), alcanzó (“no pidió”). BEQ saltaría.

Ejercicio 3: XOR vs ADD

A=B=7: XOR da 0, ADD da 14. Explicá bit a bit por qué difieren.

Ver solución

XOR: 0 sin carry (iguales se anulan). ADD: 0111+0111 = 1110 con carries 1,1,1,0. El carry lo cambia todo.

10 · Síntesis

Ideas para recordar

  • 5 ops: AND/OR/XOR/ADD/SUB; SUB = ADD + ~B + 1.
  • SUB Cout = no-préstamo (1 alcanzó).
  • Flags Z/C/N/V: cero, carry, signo, overflow.
  • Ripple para N bits; 74181 la real.
  • Flags → saltos: el if del futuro.

Operaciones dominadas. Ahora lo que parpadea: en el próximo tema, hazards.