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.
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
- 1Ripple = dominó.
Cada ficha espera a la anterior: latencia O(n). Lookahead = avisar a todas juntas.
- 2Resta = sumar negado.
Como restar sumando el Ca2 (Tema 5): el hardware hace lo mismo que tu int.
- 3Overflow = 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.
Ripple 4 bits
5+3 = 1000 (8)
5+3: S=1000 (8), sin overflow.
Preguntas para explorar
- Poné A=7, B=1 en suma. ¿S? ¿Overflow? ¿Por qué miente con signo?
- Pasá a resta con 5−3. ¿S? ¿Cout? ¿Qué significa Cout=1 restando?
- Probá 15+1. ¿S? ¿Cout? ¿Y con signo (−1+1)?
Ver respuestas sugeridas
- S=1000, overflow SÍ: 7+1 = −8 en Ca2 (Cin MSb=1, Cout=0). Sin signo es 8 ✓.
- S=0010, Cout=1: restando, Cout=1 = “alcanzó” (no pidió prestado). A≥B bien.
- 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.