Electrónica Digital · Tema 24

Sumador en cascada

De 1 bit a 4: el carry viaja, la resta sale gratis y el overflow avisa cuando mentís con signo.

01 · Punto de partida

5 + 3, bit a bit

0101 + 0011: b0 da 0 y lleva 1; el 1 viaja hasta b3; sale 1000 = 8. Encadenar Cout→Cin es el ripple-carry: 4 completos, un 7483, o tu próximo montaje.

  • ¿Cómo viaja el carry?
  • ¿Por qué el ripple es lento?
  • ¿Cómo resta el mismo circuito?
  • ¿Cuándo el resultado miente?

02 · Ripple-carry

Dominó de carries

Bit 0 (medio o completo con Cin=0), resto completos: cada carry espera al anterior (2 niveles de puertas por bit). 5+3: carries 1, 1, 1, 0 → S = 1000.

b0 → c1 → b1 →c2 → b2 → c3 →b3, listo

03 · Resta gratis

Sumar al revés + 1

A−B = A + ~B + 1: XOR controlado por M invierte B (M=0 suma, M=1 resta) y M entra al Cin como el +1. 5−3: 0101 + 1100 + 1 = 10010 → S = 0010, Cout = 1 (se descarta).

Ripple

Simple y lento

Retardo ∝ bits. Para 4–8 bits de taller sobra.

Lookahead (idea)

Rápido y complejo

Calcula carries en paralelo (P = A⊕B, G = AB). El 74283 ayuda; la idea basta.

04 · Overflow

Cuando el signo miente

Sin signo
Cout = 1 avisa (15+1 = 0 + carry): el 5.º bit se fue. Comparar con 5 bits o achicar operandos.
Con signo (Ca2)
Overflow = Cin≠Cout del MSB: 7+1 = 1000 (−8) miente. XOR de los dos carries lo detecta.
BCD aparte
El 7483 suma binario: BCD pide corrección +6 si hay acarreo o dígito > 9. Otro circuito (idea).

05 · Cascada en código

Ripple bit a bit

Suma/resta de 4 bits con carries visibles más detector de overflow.

Python en tu navegador. Mirá viajar el carry por cada bit.

def ripple(a, b, resta=False, n=4):
    if resta:
        b = (~b) & 0xF
    cin, s, carries = 1 if resta else 0, 0, []
    for i in range(n):
        ai, bi = (a >> i) & 1, (b >> i) & 1
        si = ai ^ bi ^ cin
        cout = (ai and bi) or (ai and cin) or (bi and cin)
        s |= si << i
        carries.append(cout)
        cin = cout
    print(f"{'RESTA' if resta else 'SUMA'} S={s:04b}={s} carries={carries} Cout={cin}")
    return s, cin, carries


ripple(5, 3)
ripple(5, 3, resta=True)

5+3: S=1000=8, carries [1,1,1,0]. 5−3: S=0010=2, Cout=1. ¿Y 7+1 con signo?

Overflow

def overflow(a, b, resta=False):
    s, cout, carries = ripple(a, b, resta)
    ov = carries[-2] ^ carries[-1] if len(carries) > 1 else 0
    sa = a - 16 if a >= 8 else a
    sb = b - 16 if b >= 8 else b
    print(f"{sa}{'-' if resta else '+'}{sb} = {s if s < 8 else s-16} overflow={'SI' if ov else 'no'}")
    return ov


overflow(7, 1)
overflow(5, 3, resta=True)

06 · Analogía programador

Dominó y préstamo

  1. 1
    Ripple = dominó.

    Cada ficha espera a la anterior: latencia O(n). Lookahead = avisar a todas juntas.

  2. 2
    Resta = sumar negado.

    Como restar sumando el Ca2 (Tema 5): el hardware hace lo mismo que tu int.

  3. 3
    Overflow = UB.

    Resultado que miente en silencio: como overflow en C sin sanitizer. Detectar o morir.

07 · Taller

Laboratorio: 4 bits

Sumador/restador de 4 bits: mové A, B y M, con carries y overflow a la vista.

TALLER 24

Ripple 4 bits

5+3 = 1000 (8)

S (4 bits)1000
Decimal/Cout8 · Cout 0
Carries1, 1, 1, 0
Overflow (Ca2)No ✓

5+3: S=1000 (8), sin overflow.

Preguntas para explorar

  1. Poné A=7, B=1 en suma. ¿S? ¿Overflow? ¿Por qué miente con signo?
  2. Pasá a resta con 5−3. ¿S? ¿Cout? ¿Qué significa Cout=1 restando?
  3. Probá 15+1. ¿S? ¿Cout? ¿Y con signo (−1+1)?
Ver respuestas sugeridas
  1. S=1000, overflow SÍ: 7+1 = −8 en Ca2 (Cin MSb=1, Cout=0). Sin signo es 8 ✓.
  2. S=0010, Cout=1: restando, Cout=1 = “alcanzó” (no pidió prestado). A≥B bien.
  3. S=0000, Cout=1 (16 mod 16). Con signo: −1+1 = 0 ✓ sin overflow.

08 · Comprensión

Confusiones frecuentes

«Cout = overflow»

Sin signo, Cout avisa. Con signo, overflow = Cin≠Cout del MSB (7+1 no da carry pero miente).

«Restar pide restador»

El mismo sumador con XOR en B y M al Cin: sumar y restar con un chip + 4 XOR.

«Más bits, igual de rápido»

Ripple: cada bit suma retardo. 32 bits ripple = 64 niveles: por eso existe el lookahead.

«7483 suma BCD»

Suma binario: BCD necesita +6 cuando hay carry o dígito > 9. Otro circuito encima.

09 · Práctica guiada

Ejercicios de cascada

Ejercicio 1: 9+6 a mano

Sumá 1001+0110 bit a bit con carries. ¿S? ¿Cout? Verificá con ripple().

Ver solución razonada

S = 1111 = 15, Cout 0, carries [0,0,0,0]: ningún bit genera acarreo (1+0, 0+1, 0+1, 1+0). Suma limpia.

Ejercicio 2: 3−9

Restá 0011−1001 con el método (invertir + 1). ¿S? ¿Cout? ¿Significado?

Ver solución

S = 1010, Cout = 0: Cout=0 restando = pidió prestado. En Ca2: 1010 = −6 ✓ (3−9).

Ejercicio 3: montar 7483

7483 con A/B en DIP-switch, S a LEDs. Probá 5+3, 7+1, 15+1. ¿Coincide con el laboratorio?

Ver solución

1000, 1000, 0000+Cout: el silicio confirma al simulador. Anotar carries si hay puntos de prueba.

10 · Síntesis

Ideas para recordar

  • Ripple: Cout→Cin; retardo ∝ bits.
  • A−B = A+~B+1 con M que invierte y pone Cin.
  • Restando, Cout=1 = alcanzó.
  • Overflow = Cin≠Cout del MSB (Ca2).
  • 7483 suma binario; BCD pide +6.

Cascada dominada. Ahora a comparar: en el próximo tema, comparadores.