01 · Punto de partida
Y = B, pero parpadea
Y = A·B + ~A·B es B (Tema 15): con B=1 la salida debería quedar en 1 siempre. Pero al pasar A de 1 a 0, un AND se apaga antes de que el otro se prenda: pozo de 2 retardos a 0. Tabla perfecta, tiempo traidor.
- ¿Por qué un camino tarda más?
- ¿Cuándo el glitch importa?
- ¿Cómo lo tapa un término redundante?
- ¿Qué cambia con diseño síncrono?
02 · Tipos
Fijo que se mueve
| Tipo | Debería | Hace |
|---|---|---|
| Static-1 | Quedar en 1 | Pozo a 0 (nuestro caso) |
| Static-0 | Quedar en 0 | Pico a 1 (dual) |
| Dinámico | Cambiar 1 vez | Rebota 3+ veces |
Causa: la señal llega por dos caminos (directo y negado) con distinto retardo; al reconverger en la OR hay un instante sin nadie en 1.
03 · Cuándo importa
No siempre duele
Duele
Relojes y sets
Glitch en clock/enable/set asíncrono = evento fantasma. Contadores y curso 6 sufren.
No duele
LEDs y lentos
Nanosegundos invisibles a ojo y a lógica muestreada después. Diseño síncrono lo ignora.
- Remedio 1: redundancia
- Agregar el término consenso B (Y = A·B + ~A·B + B = B): cubre la transición. Consenso del Tema 14 trabajando.
- Remedio 2: síncrono
- Muestrear con clock después de asentarse (curso 6): el glitch muere solo antes del flanco.
04 · Ejemplo cronometrado
Pozo en t = 2
Retardo 1 por puerta, B = 1, A pasa 1→0 en t = 0: el AND directo cae en t = 1 pero el negado recién sube en t = 2. La OR ve 0+0 y muestra 0 en t = 2, volviendo a 1 en t = 3. El laboratorio lo dibuja.
05 · Glitch en código
Simular retardos
Puertas con retardo 1 paso: el pozo aparece solo.
Python en tu navegador. Cambiá la transición y mirá si hay pozo.
def glitch(transicion=(1, 0), redundante=False):
A = lambda t: transicion[0] if t < 0 else transicion[1]
nA = lambda t: 1 - A(t - 1)
y1 = lambda t: A(t - 1) and 1
y2 = lambda t: nA(t - 1) and 1
r = lambda t: 1
ys = []
for t in range(0, 5):
y = (y1(t - 1) or y2(t - 1) or (r(t - 1) if redundante else 0))
ys.append(int(y))
print(f"{transicion} redundante={redundante}: Y={ys}")
return ys
glitch()
glitch(redundante=True)
glitch(transicion=(0, 1))
1→0: [1, 1, 0, 1, 1] (pozo en t=2). Con redundante: todo 1. 0→1: limpio (solape, no pozo).
Ancho del pozo
ys = glitch()
print(f"pozo de {ys.count(0)} paso(s) x retardo de puerta")
print("a 10ns por puerta: ~20ns invisible al ojo, mortal para un clock")
06 · Analogía programador
Race condition
- 1Glitch = race.
Dos caminos escriben el resultado a distinto tiempo: ventana donde nadie escribió bien. Igual que threads sin lock.
- 2Redundancia = idempotencia.
Término extra que cubre la ventana: como reintento que tapa el hueco.
- 3Síncrono = barrier.
Muestrear cuando todos llegaron: barrera que elimina carreras por diseño.
07 · Exploración
Laboratorio: cazar el pozo
Transición de A con B=1, con o sin término redundante: el laboratorio dibuja Y(t) paso a paso.
Caza-pozos
1→0 · pozo en t=2
1→0 sin +B: pozo de 1 paso en t=2.
Preguntas para explorar
- Probá 0→1 sin +B. ¿Pozo? ¿Por qué un sentido sí y el otro no?
- Activá +B con 1→0. ¿Pozo? ¿Qué término lo tapa?
- ¿De qué sirve saber el ancho en pasos? (Pista: ns por puerta.)
Ver respuestas sugeridas
- No: hay solape (ambos en 1 un rato). La asimetría viene del NOT en un solo camino.
- No: +B (consenso) vale 1 durante la transición y tapa el hueco.
- Pasos × tp (ns) = ancho real: si es menor que el setup del destino, no importa.
08 · Comprensión
Confusiones frecuentes
«El simulador ideal lo muestra»
Sin retardos no hay glitch: hace falta timing sim (con tp) u osciloscopio. Ideal ≠ real.
«Glitch = bug lógico»
La tabla está bien: es el tiempo el que falla. Corregir la lógica no lo saca.
«Más rápido = sin glitch»
Más rápido = pozo más angosto, pero existe. Se tapa (redundancia) o se ignora (síncrono).
«X en simulación = glitch»
X es desconocido/contención (otro tema): el glitch es 0/1 bien definidos en mal momento.
09 · Práctica guiada
Ejercicios de pozos
Ejercicio 1: static-0
Y = ~(A·B + ~A·B) (NOR del ejemplo). ¿Transición con pico a 1? ¿Redundante dual?
Ver solución razonada
0→1 de A con B=1 (dual del caso del tema): pico a 1 donde debería quedar en 0. Redundante dual: factor B extra, Y = (A+B)·(~A+B)·B. El consenso también tiene dual.
Ejercicio 2: medir un glitch
XOR con A=B=misma señal que cambia: Y debería ser 0 siempre. ¿Qué ves en el scope? ¿Por qué?
Ver solución
Picos en cada flanco: los caminos internos del 86 difieren en retardo (hazard dinámico del XOR). Clásico de laboratorio.
Ejercicio 3: ¿importa?
Glitch de 20 ns en: (a) LED, (b) enable de latch, (c) entrada de clock. ¿En cuáles actuás?
Ver solución
(b) y (c): eventos fantasma. (a) invisible. Actuar donde el glitch es evento.
10 · Síntesis
Ideas para recordar
- Retardos distintos + reconvergencia = glitch.
- Static-1 = pozo; static-0 = pico; dinámico = rebotes.
- Consenso tapa; síncrono ignora.
- Importa en clocks/enables, no en LEDs.
- Tabla bien ≠ tiempo bien.
Pozos entendidos. Ahora lo eléctrico fino: en el próximo tema, consumo y buenas prácticas.