01 · Punto de partida
Escribir un dato, no dos órdenes
Con un latch SR, para guardar un bit hay que decidir si es un 1 (dar la orden de Set) o un 0 (dar la de Reset), y cuidar que nunca coincidan. Pero el bit que queremos almacenar casi siempre llega como un dato: una línea que vale 0 o 1. Convertir ese dato en las dos órdenes cada vez sería un trabajo repetitivo, y cualquier error nos lleva a la combinación prohibida del tema anterior.
Tampoco queremos que el latch reaccione a cualquier cambio de sus entradas en cualquier momento, como hacía el SR. Necesitamos poder decir «ahora guardá lo que hay en D» y «ahora ignorá todo». Esa segunda señal es la habilitación (enable).
Es el último escalón antes del flip-flop: casi todo lo que veremos en el tema 8 se explica comparándolo con este circuito.
02 · Primer paso
Latch SR con habilitación
Para controlar cuándo el latch escucha, se colocan dos puertas AND delante de sus entradas. Cada orden pasa solo si la habilitación E vale 1:
| E | S | R | Q+ | Operación |
|---|---|---|---|---|
| 0 | X | X | Q | Cerrado: retiene, sin importar S y R |
| 1 | 0 | 0 | Q | Abierto: retiene |
| 1 | 1 | 0 | 1 | Set |
| 1 | 0 | 1 | 0 | Reset |
| 1 | 1 | 1 | — | Prohibida |
La habilitación resuelve la mitad del problema: ahora hay un momento controlado para escribir. Con E = 0, el latch ignora el ruido de S y R. Pero con E = 1 sigue valiendo todo lo del tema 5: dos entradas, una combinación prohibida, y la obligación de traducir cada dato a órdenes.
03 · La idea clave
El latch D: una sola entrada de datos
El truco para eliminar las dos órdenes es derivarlas de una sola señal, el dato D, de forma que sean siempre opuestas: si D vale 1, se pide Set; si vale 0, se pide Reset. Basta un inversor:
Como S′ y R′ nunca valen 1 a la vez, la combinación prohibida desaparece por construcción. Si E = 0, ambas valen 0 y el latch retiene. Si E = 1, exactamente una de las dos vale 1 y empuja a Q hacia el valor de D:
| E | D | Q+ | Operación |
|---|---|---|---|
| 0 | X | Q | Cerrado: retiene el valor guardado |
| 1 | 0 | 0 | Abierto: Q sigue a D (escribe 0) |
| 1 | 1 | 1 | Abierto: Q sigue a D (escribe 1) |
Su tabla característica, con el estado actual Q como entrada, queda así. Coincide, fila por fila, con la ecuación de abajo:
| E | D | Q | Q+ |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
Reconocerás la forma: es un multiplexor de 2 a 1 (Electrónica Digital, tema 18) con E como selector, D como una entrada y la propia salida Q como la otra. Con E = 1 elige el dato nuevo; con E = 0 elige lo que ya tenía. Un latch D es un multiplexor que se elige a sí mismo cuando no se lo habilita. Esa es, quizás, la mejor definición de «memoria» que vimos hasta ahora.
04 · Cómo se comporta
Transparente o cerrado
El latch D tiene dos modos. Con E = 1 es transparente: la salida sigue a la entrada como si el latch no estuviera (con el retardo de las puertas). Con E = 0 está cerrado y mantiene el último valor. El momento clave es el instante en que E pasa de 1 a 0: el dato que haya en D en ese instante queda guardado. Se dice que es un elemento sensible al nivel de E, a diferencia del flip-flop del tema 8, que será sensible a un flanco.
Tres cosas para observar. Primero, mientras E = 0 los cambios de D (como el de t = 2 o el de t = 14) no llegan a Q. Segundo, mientras E = 1, Q repite todos los cambios de D, incluidos los que no queríamos. Tercero, cuando E baja, queda guardado el último valor de D. Para que sea el correcto, D debe estar estable un tiempo antes y después de que E baje; son los tiempos de preparación y mantenimiento (setup y hold) que estudiaremos en el tema de tiempos reales. En el dibujo, para simplificar, no hay retardos.
05 · En los catálogos
Polaridad de la habilitación e integrados reales
Como pasaba con las entradas del latch SR, la habilitación puede ser activa en alto (el latch está abierto con E = 1) o activa en bajo (abierto con Ē = 0). Los datasheets la llaman E, G, LE (latch enable), C o CP, y la burbuja indica polaridad baja. Hay que leerlo siempre: la misma etiqueta puede significar lo contrario según el fabricante.
| Integrado | Qué contiene | Habilitación | Detalle útil |
|---|---|---|---|
| 74HC75 | 4 latches D (dos pares con habilitación común) | Activa en alto (por par) | Salidas Q y ~Q; ejemplo clásico de «registro de 4 bits» |
| 74HC373 | 8 latches D con salida de tres estados | LE activa en alto | Salida habilitada por OE̅; se usa para retener direcciones en un bus |
| 74HC573 | Como el 373, con otra distribución de pines | LE activa en alto | Entradas y salidas en lados opuestos: más fácil de cablear |
Dos entradas distintas caben en el 373 y el 573, y no hay que confundirlas: LE decide cuándo el latch captura (transparencia), y OE̅ decide si las salidas se ven en el bus o quedan en alta impedancia (tri-estado, del curso de Electrónica Digital). Se puede retener un dato con las salidas desconectadas, y recuperarlo después.
06 · Aplicaciones
Dónde se usa un latch D
| Uso | Cómo funciona |
|---|---|
| Captura de un dato de un bus | El bus lleva el dato por un instante. Un pulso en LE lo captura, y el latch lo mantiene mientras el bus se usa para otra cosa. |
| Bus de direcciones y datos multiplexado | Algunos microprocesadores antiguos (como el 8085) usan los mismos pines para direcciones y datos. Un 74HC373 guarda la parte baja de la dirección con una señal ALE. |
| Retener un valor para un display o un conversor | El contador sigue cambiando; el latch congela la lectura mientras se muestra. Evita el parpadeo y las lecturas a medias. |
| Sincronizar un dato con un evento | Un pulso de «dato válido» abre el latch lo justo para capturar la medición y lo cierra. |
| Registro de salida de un puerto | El procesador escribe un byte con una señal de escritura que habilita el latch; las salidas se mantienen hasta la siguiente escritura. Es el principio de los puertos de salida. |
En todos los casos se repite el esquema: un dato que está disponible un instante, una señal que dice «guardalo ahora» y una salida que lo mantiene. Si programás, es la primera forma de la asignación a una variable: el momento de la asignación es la habilitación; el valor, D; y la variable, el latch.
07 · El límite
Cuando la transparencia es un problema
Realimentar un latch transparente
Imaginá un contador que usa un latch D con D = ¬Q: la idea es que Q cambie cada vez que se habilita. Con E = 1, Q se invierte; pero al cambiar, vuelve a D, que cambia otra vez; mientras E siga en 1, la salida no deja de invertirse. Cuántas veces cambia depende de cuánto dura el pulso de E, no de cuántos pulsos hubo.
| Ancho de E (en ciclos del lazo) | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| Q final, partiendo de 0 | 1 | 0 | 1 | 0 |
Esta carrera es exactamente la que hace imposible usar un latch transparente como elemento de un contador o de un registro de desplazamiento. Se necesita un elemento que, aun estando habilitado, no vea su propia salida hasta el siguiente ciclo. La solución es capturar en un instante, no durante un intervalo: el flip-flop.
Dos latches hacen un flip-flop
Si se ponen dos latches D en serie, con habilitaciones opuestas (uno abierto cuando E = 1 y el otro cuando E = 0), el primero («maestro») sigue a D mientras el segundo («esclavo») está cerrado; al bajar E, el maestro se cierra y el esclavo se abre, trasladando a la salida el dato que quedó capturado. La salida cambia una sola vez por ciclo, justo en un flanco. Es la estructura maestro-esclavo del flip-flop del tema 8.
Un riesgo oculto: el hazard del multiplexor
Hay además un problema de tiempos interno. Si el latch se arma literalmente con la ecuación Q+ = E·D + ¬E·Q con puertas AND y OR, aparece el hazard estático que estudiaste en Electrónica Digital (tema 28): con D = Q = 1, al bajar E, un término se apaga antes de que el otro se encienda. Como el resultado se realimenta, el pozo puede convertirse en una oscilación sostenida. La corrección es el término de consenso D·Q, que mantiene la salida en 1 durante la transición. Los integrados comerciales ya lo resuelven por dentro, pero es una buena razón para no inventar los latches con puertas sueltas.
08 · Analogía con programación
Una variable con cerrojo
Un latch D se parece a una variable que solo se actualiza cuando una bandera lo permite. Este código lo modela y sigue una secuencia de habilitación y datos; los valores salen de la tabla característica de la sección 3:
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
Paso 1: la variable con cerrojo
class LatchD:
def __init__(self, q=0):
self.q = q
def actualizar(self, e, d):
if e: # habilitado: transparente, Q sigue a D
self.q = d
return self.q # con e = 0 retiene
latch = LatchD()
secuencia = [(0, 1), (1, 1), (1, 0), (1, 1), (0, 1), (0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]
for e, d in secuencia:
print(f"E={e} D={d} -> Q={latch.actualizar(e, d)}")
Con E = 1 el valor entra, con E = 0 se ignora: las líneas 5 y 6 (E = 0) y 9 y 10 conservan el 1 aunque D valga 0. Tras el último E = 1, D = 1, Q queda en 1 y nada más lo cambia. Cambiá la secuencia para que el último E = 1 llegue con D = 0 y comprobá que Q se queda en 0.
Paso 2: construirlo con puertas y verificar la ecuación
def nor(a, b):
return 0 if (a or b) else 1
def latch_sr(s, r, q, qn):
"""Dos NOR realimentadas, hasta que el lazo se asienta."""
for _ in range(8):
nq, nqn = nor(r, qn), nor(s, q)
if (nq, nqn) == (q, qn):
break
q, qn = nq, nqn
return q, qn
def latch_d(e, d, q, qn):
s = d & e # set solo si hay dato 1 y habilitación
r = (1 - d) & e # reset solo si hay dato 0 y habilitación
assert not (s and r) # nunca se pide set y reset a la vez
return latch_sr(s, r, q, qn)
print("E D Q | Q+ E·D + ~E·Q")
ok = True
for e in (0, 1):
for d in (0, 1):
for q in (0, 1):
q2, qn2 = latch_d(e, d, q, 1 - q)
ecuacion = (e & d) | ((1 - e) & q)
ok = ok and q2 == ecuacion and qn2 == 1 - q2
print(f"{e} {d} {q} | {q2} {ecuacion}")
print("coincide con la ecuación y Q, ~Q siempre complementarios:", ok)
En las ocho filas, el latch hecho con dos AND y dos NOR coincide con Q+ = E·D + ¬E·Q, y Q y ~Q son siempre complementarios. La aserción de la función latch_d nunca falla: S′ y R′ no valen 1 a la vez. Quitá el inversor ((1 - d)) y la aserción saltará.
Paso 3: transparente frente a cerrado
def latch(e_lista, d_lista, q=0):
salida = []
for e, d in zip(e_lista, d_lista):
if e:
q = d
salida.append(q)
return salida
# t = 0 1 2 3 4 5 6 7 8 9
d = [0, 0, 1, 0, 0, 0, 1, 0, 0, 0] # dos glitches de un tick, en t = 2 y t = 6
e_abierta = [1] * 10 # siempre transparente
e_mitad = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0] # se cierra en t = 5
print("D ", *d)
print("abierto ", *latch(e_abierta, d))
print("se cierra", *latch(e_mitad, d))
print()
# el dato que queda guardado es el último que vio D antes de cerrar
for cierre in (2, 3, 6, 7):
e_c = [1 if t < cierre else 0 for t in range(10)]
print(f"E cae en t={cierre}: queda guardado Q = {latch(e_c, d)[-1]} (D valía {d[cierre - 1]} justo antes)")
Con el latch siempre abierto, los dos glitches de D (en t = 2 y t = 6) llegan a Q. Con E cerrándose en t = 5, el glitch de t = 2 pasa y el de t = 6 queda bloqueado. Lo que guarda el latch al cerrar es el valor que D tenía justo antes: si E cae en t = 3, queda 1; si cae en t = 7, queda 1 por el glitch.
Paso 4: la carrera al realimentar
def latch_realimentado(ancho_e, ticks=10):
"""Latch transparente con D = ~Q y E alto durante ancho_e ticks."""
q = 0
trazas = []
for t in range(ticks):
e = 1 if 1 <= t < 1 + ancho_e else 0
if e:
q = 1 - q # D = ~Q: cada tick abierto invierte Q
trazas.append(q)
return trazas
print("ancho de E | Q en cada tick | Q final")
for ancho in range(1, 7):
q = latch_realimentado(ancho)
print(f"{ancho:10d} | {' '.join(map(str, q))} | {q[-1]}")
print()
print("El resultado depende del ancho del pulso de E (par o impar), no del diseño.")
Con D = ¬Q, la salida cambia en cada tick en que E está en alto, así que el resultado depende de la paridad del ancho del pulso. Con ancho 1 y 3 termina en 1; con 2 y 4 termina en 0. Por eso el latch transparente no sirve como bloque de un contador.
Paso 5: el hazard del multiplexor realimentado
def simular(consenso, ticks=14):
"""Latch D con mux de puertas AND-OR; cada puerta tarda 1 tick."""
E = [1 if t < 2 else 0 for t in range(ticks)] # E cae en t = 2
D = [1] * ticks
nE, A1, A2, A3, Q = ([0] * ticks for _ in range(5))
nE[0], A1[0], A2[0], A3[0], Q[0] = 0, 1, 0, 1, 1 # estado inicial coherente: Q = 1
for t in range(1, ticks):
nE[t] = 1 - E[t - 1]
A1[t] = E[t - 1] & D[t - 1]
A2[t] = nE[t - 1] & Q[t - 1]
A3[t] = D[t - 1] & Q[t - 1]
Q[t] = A1[t - 1] | A2[t - 1] | (A3[t - 1] if consenso else 0)
return E, Q
for consenso in (False, True):
E, Q = simular(consenso)
print("con término de consenso D·Q" if consenso else "sin consenso (Q = E·D + ~E·Q)")
print(" E", *E)
print(" Q", *Q)
Con cada puerta tardando un tick, la ecuación sin consenso deja un pozo cuando E cae, y el lazo oscila entre 0 y 1 sin asentarse. Con el término de consenso D·Q, Q se mantiene en 1. Es un modelo ideal; un chip real puede asentarse o no, pero el diseñador no debe apostar a eso.
Las diferencias con el software son las de siempre: el código evalúa una línea tras otra, y el circuito mantiene la memoria con la energía de las puertas. Pero la idea es la misma: una variable cuyo valor cambia solo si una condición lo habilita.
09 · Exploración interactiva
Abrir y cerrar el latch
El diagrama muestra el latch D construido con dos AND y un latch SR de NOR. Los cables en verde valen 1. Las casillas controlan el dato D y la habilitación (abrir el latch); el botón «Glitch en D» introduce un pulso breve en el dato. La opción de polaridad cambia qué nivel físico abre el latch, sin cambiar el significado de la casilla. El contador cuenta cuántos cambios de D llegaron a la salida.
Latch D con habilitación
Latch cerrado con Q = 0. Marcá «Dato D = 1» y observá que Q no se mueve; después abrí el latch.
| N.º | Evento | Latch | D | Q después |
|---|---|---|---|---|
| Sin eventos registrados. | ||||
Recorrido guiado
- Con el latch cerrado, marcá «Dato D = 1». Q sigue en 0: el dato espera en la entrada, y las señales internas S′ y R′ valen 0.
- Marcá «Abrir el latch». Ahora S′ = 1 y Q pasa a 1: el latch tomó el dato que esperaba. Con el latch abierto, desmarcá D: Q baja a 0. Está siguiendo a D.
- Con D = 1 y el latch abierto (Q = 1), desmarcá «Abrir el latch». Se cierra con Q = 1. Desmarcá D: Q sigue en 1. El dato quedó guardado.
- Con el latch cerrado y Q = 1, usá «Glitch en D». Los pulsos no llegan a Q y el contador no sube.
- Abrí el latch y repetí el glitch. Q cambia y vuelve. El historial registra dos cambios: la transparencia deja pasar también lo que no queríamos.
- Cambiá la polaridad a «activa en bajo». La casilla «Abrir el latch» sigue abriéndolo, pero en el diagrama el pin Ē vale 0 cuando está abierto. Fijate que el interior del circuito (S′, R′) no cambia.
- Probá cerrar justo después de cambiar D. Lo que queda guardado es el valor de D en el último instante en que el latch estaba abierto. En un circuito real, esto exige que D esté estable un tiempo antes de cerrar.
Desafío: guardar un 0 sin tocar D
Con Q = 1, dejá D en 0 y el latch cerrado: no pasa nada. Abrí el latch y cerralo enseguida: Q toma el valor 0 de D y lo retiene. Un pulso de apertura de cualquier ancho (suficiente para el lazo) es una «orden de escribir» y D, el contenido. Así escribe un procesador en un registro de salida.
10 · Método de trabajo
Cómo especificar y usar un latch D
- Definí qué dato se guarda y cuándo es válido. D debe ser estable en el instante en que se cierra el latch.
- Elegí la señal de habilitación y su polaridad. Anotá si el latch se abre con 1 o con 0.
- Decidí si necesitás un latch o un flip-flop. Si el dato no depende de la salida y la transparencia no molesta, un latch alcanza y ocupa menos. Si hay realimentación (contadores, registros que se desplazan), hace falta un flip-flop.
- Limitá el tiempo de apertura a lo necesario. Cuanto más tiempo abierto, más ruido de D llega a Q.
- Definí el estado inicial. Como todo biestable, arranca en cualquiera de sus estados: un pulso inicial de habilitación con un dato conocido lo fija.
- Revisá tiempos de preparación y mantenimiento de D respecto del cierre de E.
- Verificá con una secuencia: cerrado con D cambiando (nada), abierto (sigue a D), cierre (retiene) y glitch.
En la mesa, si la salida parece «inventar» valores, revisá primero que la habilitación no tenga rebotes ni glitches: un pulso extra en E equivale a una escritura que nadie pidió.
11 · Comprensión
Confusiones frecuentes
«Un latch D copia a D en el instante en que E sube»
Lo copia durante todo el tiempo que E está en alto. Lo que queda guardado es el valor de D en el instante en que E baja. No es un evento de un instante sino un intervalo.
«Con E = 0 el latch está apagado»
Está retiendo: las puertas internas siguen alimentadas y sosteniendo el lazo. Solo ignora a D. Si se corta la alimentación, el dato se pierde.
«El latch D tiene una combinación prohibida, como el SR»
No: la inversión de D hace que S′ y R′ no puedan valer 1 a la vez. Esa es la razón principal de su popularidad.
«Latch y flip-flop son lo mismo»
Un latch es sensible al nivel de E (transparente mientras está abierto); un flip-flop es sensible a un flanco (captura en un instante). No son intercambiables, sobre todo si hay realimentación.
«OE y LE hacen lo mismo en un 74HC373»
LE decide cuándo se captura el dato; OE̅ decide si las salidas se conectan al bus. Se puede capturar con las salidas desconectadas, y se pueden conectar sin capturar nada nuevo.
«Si realimento Q a D, el latch cuenta»
Mientras E esté en alto, la salida se invierte una y otra vez: el resultado depende del ancho del pulso. Para contar hace falta un flip-flop.
«Un glitch en D con el latch abierto desaparece solo»
No: aparece en Q, y si Q alimenta algo sensible, lo afecta. Un latch cerrado es inmune; uno abierto, no.
12 · Práctica guiada
Predecí antes de comprobar
1. Seguir un latch D
Q = 0 al comienzo. Se aplican estos pares (E, D): (0, 1), (1, 1), (1, 0), (0, 0), (0, 1), (1, 0), (0, 1). Escribí Q después de cada uno.
Ver solución razonada
Q: 0, 1, 0, 0, 0, 0, 0. (0, 1): cerrado, Q no cambia. (1, 1): abierto, Q = 1. (1, 0): abierto, Q = 0. Los pares (0, 0) y (0, 1) están cerrados y retienen 0. (1, 0): abierto, Q = 0. El último (0, 1) retiene 0. Comprobalo en el Paso 1.
2. Dibujar el cronograma
E vale 1 entre t = 2 y t = 6 y D cambia a 1 en t = 3 y a 0 en t = 5. Si Q = 0 al comienzo, ¿qué valores toma Q en cada tramo y cuál queda guardado cuando E baja?
Ver solución
Q = 0 hasta t = 3; con el latch abierto sube a 1 en t = 3 (sigue a D), baja a 0 en t = 5 y cuando E baja en t = 6 queda guardado 0. El pulso de D entre 3 y 5 llegó a la salida durante dos unidades, pero no quedó almacenado.
3. Cerrar con el dato correcto
Una medición llega por D y es válida solo entre t = 10 y t = 14. ¿Cuándo hay que cerrar el latch para guardarla y qué condición debe cumplir D?
Ver solución
E debe bajar dentro de la ventana válida, con margen (por ejemplo en t = 13), de modo que D esté estable un tiempo antes (preparación) y un tiempo después (mantenimiento) del cierre. Si E baja en t = 14 o más tarde, puede guardar un valor que ya cambió.
4. Elegir latch o flip-flop
¿Cuál de estos casos admite un latch D y cuál exige otro elemento? (a) Un puerto de salida que mantiene el último byte escrito. (b) Un contador de 4 bits.
Ver solución razonada
(a) Latch D: el dato viene de afuera y no depende de la salida. (b) Flip-flops: el próximo valor depende del actual (Q+ = Q + 1); un latch transparente con realimentación entraría en la carrera de la sección 7.
5. Un 74HC373 en un bus
Un 74HC373 retiene la parte baja de una dirección mientras el bus pasa a llevar datos. ¿Cuándo hay que bajar LE y cuándo conviene tener OE̅ activa?
Ver solución
LE baja mientras la dirección todavía es válida en el bus (justo antes de que el bus pase a datos), con tiempo de preparación respecto de la bajada. OE̅ se mantiene activa (en 0) mientras el dispositivo conectado necesite ver la dirección, y se desactiva si hay que liberar sus salidas para otro dispositivo en el bus.
6. La ecuación como multiplexor
Escribí Q+ = E·D + ¬E·Q como un multiplexor 2:1 y explicá qué entrada se elige cuando E = 0. Para D = Q = 1, ¿qué término mantiene la salida en 1 durante la transición de E?
Ver solución
Un MUX 2:1 con selector E: la entrada 1 es D y la entrada 0 es Q; con E = 0 se elige Q (la propia salida). Para D = Q = 1, el término de consenso D·Q mantiene la salida en 1 mientras E cambia. Sin él, el modelo con retardos oscila (Paso 5).
13 · Síntesis
Ideas para recordar
- Una habilitación (AND delante del latch SR) decide cuándo se escucha; con E = 0 el latch retiene.
- Derivando S′ = D·E y R′ = ¬D·E, el latch SR se convierte en un latch D: una sola entrada de datos y sin combinación prohibida.
- Q+ = E·D + ¬E·Q: un multiplexor que se elige a sí mismo cuando no está habilitado.
- Es sensible al nivel: transparente con E activa (Q sigue a D) y cerrado cuando no (retiene el último valor de D antes de cerrar).
- La habilitación puede ser activa en alto o en bajo; en un 74HC373, LE captura y OE̅ conecta las salidas al bus.
- Transparencia significa que los glitches de D pasan a Q mientras el latch esté abierto.
- Con realimentación (D = ¬Q), el latch transparente entra en carrera: hace falta capturar en un flanco. Dos latches opuestos hacen un flip-flop maestro-esclavo.
¿Listo para el tema 7?
Antes de avanzar, construí un latch D a partir de un latch SR, explicá por qué desaparece la combinación prohibida y describí qué ocurre si D cambia mientras el latch está abierto y cuando está cerrado. Si podés justificar las tres respuestas, ya podés armar tu primera memoria de un bit.
En el próximo tema pasamos al banco: el taller de memoria de un bit y antirrebote, donde montamos con puertas un latch y lo usamos para limpiar un pulsador.