← Índice del curso

Circuitos Secuenciales y Memoria · Tema 11

Tiempos reales y sincronización

Hasta ahora el flip-flop capturaba «en un instante». La realidad es más estrecha: necesita que el dato esté quieto durante una ventana alrededor del flanco, tarda en responder y, si algo cambia dentro de esa ventana, puede quedar un momento sin decidirse. Este tema pone cifras a todo eso, enseña a comprobar si un circuito cumple sus tiempos y explica cómo se hace entrar una señal que no pertenece al reloj sin que el diseño se vuelva impredecible.

01 · Punto de partida

Del instante a la ventana

En los temas 3 y 8 dejamos varias promesas: que el dato debe estar estable alrededor del flanco, que el período mínimo depende de los retardos, y que si algo cambia en el peor momento ocurre un fenómeno llamado metastabilidad. Este es el tema donde se cumplen esas promesas.

La idea central es que cada afirmación del tipo «el flip-flop captura D en el flanco» tiene una letra chica: siempre que D se haya mantenido estable un tiempo antes y otro después. Si el circuito entero respeta esa letra chica, se comporta como los diagramas ideales. Si no, el resultado depende de la temperatura, la tensión, el ejemplar del chip y la suerte.

Todos los valores numéricos son ejemplos orientativos para comprender las magnitudes; los reales vienen en la hoja de datos de cada componente, en condiciones de tensión y temperatura determinadas.

02 · Tres parámetros

La ventana de un flip-flop

Un flip-flop se caracteriza por tres tiempos alrededor del flanco activo del reloj:

Ventana de preparación y mantenimiento de un flip-flop Alrededor del flanco ascendente del reloj hay una ventana en la que el dato debe estar estable: t de preparación antes del flanco y t de mantenimiento después. La salida cambia un t de reloj a salida después del flanco. CLKDQ tsuthtclk→QD estable en esta ventanaflanco ↑
Parámetros de un flip-flop (valores de ejemplo para una familia 74HC a 5 V).
ParámetroSímboloQué diceEjemplo
Preparación (setup)tsuEl dato debe estar estable al menos este tiempo antes del flanco15 ns
Mantenimiento (hold)thDebe seguir estable al menos este tiempo después del flanco3 ns
Reloj a salidatclk→QCuánto tarda Q en cambiar después del flanco; las hojas de datos dan un mínimo y un máximo10 a 20 ns

Entre tsu antes y th después del flanco hay una ventana prohibida de 18 ns en este ejemplo. Si D cambia fuera de ella, el resultado es el esperado: antes de la ventana, el flip-flop captura el dato nuevo; después, el viejo. Si cambia dentro de ella, el flip-flop puede capturar cualquiera de los dos valores, o quedar en un estado a medias que se resuelve después de un tiempo indeterminado. El laboratorio lo muestra con un deslizador.

03 · Verificar un circuito

El camino entre dos flip-flops

En un circuito síncrono, lo que importa es lo que ocurre entre un flip-flop de origen y uno de destino con lógica en el medio. Dos desigualdades, una por cada ventana, resumen todo el análisis temporal:

Preparación: T ≥ tclk→Q,máx + tlógica,máx + tsu + tskew
Mantenimiento: tclk→Q,mín + tlógica,mín ≥ th + tskew

Cada una usa un extremo distinto del retardo. Para la preparación importa el camino más lento (máximos), porque el dato tiene que llegar a tiempo para el próximo flanco. Para el mantenimiento importa el camino más rápido (mínimos), porque el dato nuevo no debe llegar antes de que el flip-flop termine de «soltar» el anterior. A la diferencia entre lo que hay y lo que se exige se la llama holgura (slack): positiva, cumple; negativa, viola.

Holguras de cuatro caminos con T = 60 ns y skew de 2 ns (tclk→Q de 10 a 20 ns, tsu = 15 ns, th = 3 ns).
CaminoLógica (máx / mín)Holgura de preparaciónHolgura de mantenimiento
Registro de desplazamiento (Q → D directo)0 / 0 ns+23 ns+5 ns
Contador: T1 = Q08 / 5 ns+15 ns+10 ns
Contador: T3 = Q0·Q1·Q212 / 8 ns+11 ns+13 ns
Sumador de 4 bits entre registros45 / 15 ns−22 ns+20 ns

El sumador no llega: necesita 20 + 45 + 15 + 2 = 82 ns, y el período es de 60. El período mínimo de todo el circuito lo fija su camino crítico (el sumador), que limita la frecuencia a unos 12 MHz. Las opciones son bajar la frecuencia, partir el sumador en dos con un registro intermedio (pipeline, con latencia mayor) o usar una lógica más rápida.

Observá también el registro de desplazamiento: al conectar Q directo a D no hay lógica, y su único colchón de mantenimiento es el tclk→Q,mín del propio flip-flop (10 ns contra los 3 + 2 que se exigen). Funciona, pero si el reloj llegara con mucho desfasaje, esa holgura se perdería, como se ve en la sección siguiente.

04 · El reloj no es perfecto

Skew y jitter

Dos imperfecciones del reloj.
FenómenoQué esOrigenEfecto
Skew (desfasaje)El mismo flanco llega a distintos flip-flops en instantes distintosCableado de distinta longitud, carga desigual, buffers de reloj distintosResta margen de preparación o de mantenimiento, según la dirección del desfasaje
Jitter (temblor)El instante de cada flanco varía de un ciclo al siguienteRuido en la alimentación, interferencias, el propio osciladorAcorta el período efectivo de forma aleatoria

El skew es especialmente peligroso para el mantenimiento. Si el reloj llega al flip-flop de destino 12 ns después que al de origen, el dato nuevo ya salió del origen y puede llegar al destino antes de que este termine de capturar el anterior. Con los números del ejemplo, el registro de desplazamiento pasa de +5 ns a −5 ns de holgura de mantenimiento: violación, sin que se haya tocado la frecuencia. Es el caso más difícil de reconocer en la mesa, porque no se arregla bajando la velocidad.

Las prácticas para reducir el skew son simples: el mismo reloj llega con trazas de longitud parecida, con un buffer dedicado para repartirlo (como en el fan-out del curso de Electrónica Digital), a pocos destinos por rama, y sin pasar por compuertas que lo retrasen o lo ensucien.

05 · Cuando algo cambia dentro de la ventana

Metastabilidad

Recordá el paisaje del tema 4: un biestable tiene dos valles estables y una loma inestable entre ambos. Si D cambia dentro de la ventana, el flip-flop puede quedar «sobre la loma»: su salida no es un 0 ni un 1 limpios, sino un nivel intermedio que cae hacia un lado tras un tiempo impredecible. Ese tiempo es aleatorio; lo que se conoce es la probabilidad de que dure más que cierto valor:

P(sigue indefinida tras tr) ≈ e−tr/τ

τ es una constante del dispositivo (decenas de picosegundos en tecnologías rápidas, fracciones de nanosegundo en una familia 74HC). La probabilidad cae exponencialmente con el tiempo de resolución disponible tr: cada τ extra la divide por e ≈ 2,7. Y la frecuencia con que ocurre el evento depende de cuántas veces cae un cambio de D en la ventana. Juntas, dan el tiempo medio entre fallos:

MTBF = etr/τ / ( TW · fclk · fdato )
Un ejemplo ilustrativo: reloj de 20 MHz, el dato cambia 1 millón de veces por segundo, τ = 0,5 ns y TW = 0,1 ns.
ConfiguraciónTiempo de resolución trProbabilidad por eventoMTBF
Un flip-flop, con lógica detrás5 ns4,5 × 10−5≈ 11 segundos
Dos flip-flops en cadena20 ns4,2 × 10−18≈ 3,7 millones de años

Es una lección sobre la exponencial: sumar un período de resolución (de 5 a 20 ns de tiempo disponible) pasa de segundos a millones de años. La metastabilidad nunca desaparece, pero se vuelve tan improbable que deja de importar. Y no es un defecto de un chip: es una propiedad de cualquier biestable al que se le pida decidir sobre una señal que cambia a destiempo.

06 · La solución estándar

El sincronizador de dos flip-flops

Si una entrada asíncrona tiene que entrar al sistema, se la pasa por dos flip-flops en cadena, ambos con el mismo reloj, y solo la salida del segundo se usa en el resto del circuito:

Sincronizador de dos flip-flops Una entrada asíncrona entra a un primer flip-flop D, cuya salida va directo a un segundo flip-flop D. Ambos reciben el mismo reloj. La salida del segundo es la señal sincronizada. El primero puede quedar indefinido; el segundo recibe un valor ya resuelto. FF 1FF 2entrada asíncronaQ1salida sincronizadaCLKpuede quedar indefinidorecibe un valor ya resueltotiempo de resolución: T − tclk→Q − tsu

El primer flip-flop puede tomar la señal en cualquier momento y, eventualmente, quedar indefinido. Pero el segundo no mira su salida hasta un período completo después: tiempo suficiente, con altísima probabilidad, para que el primero se haya decidido. Cada flip-flop de la cadena aporta otro período de resolución, y el MTBF crece exponencialmente.

Reglas para usar un sincronizador.
ReglaPor qué
Nada de lógica entre FF1 y FF2Toda la holgura de ese período se dedica a la resolución
Solo la salida de FF2 se usa en el resto del diseñoLa salida de FF1 puede ser indefinida
Un solo bit por sincronizadorCada bit resuelve en un ciclo distinto: un bus de varios bits se leería incoherente
La señal debe durar más de un período de relojUn pulso más corto que T puede caer entre dos flancos (tema 3) y perderse
Aceptar 1 o 2 períodos de latenciaLa salida llega después que la entrada: es el precio de la seguridad

07 · Casos de uso

Pulsadores, pulsos y buses

Un pulsador, una pulsación

Con la señal ya sincronizada (y limpia de rebotes, tema 7), todavía queda un problema: si el pulsador se mantiene apretado durante 5 ciclos, un contador que la use como habilitación contaría 5. Lo que se quiere es un pulso de un ciclo por cada pulsación: un detector de flancos. Se guarda el valor anterior de la señal en un tercer flip-flop y se comparan:

pulso = Qactual · ¬Qanterior   (un ciclo en alto por cada flanco ascendente)

La cadena completa para un botón es: antirrebote → sincronizador de dos flip-flops → detector de flancos → contador. La construiremos como proyecto en el taller del contador de eventos.

Pulsos cortos

Un sincronizador no puede ver lo que dura menos de un período. Si el evento es muy breve, hay que capturarlo antes con un biestable asíncrono, es decir, un latch SR del tema 5 que se borra con el reloj una vez leído. Es el equivalente a un bit de «interrupción pendiente».

Buses de varios bits

Sincronizar bit por bit un bus que cambia con otro reloj (por ejemplo una cuenta) no sirve: como los bits cambian con pequeñas diferencias, cada sincronizador puede capturarlos en ciclos distintos y el destino lee una combinación que nunca existió, el mismo problema del hazard de función del curso de Electrónica Digital. Hay tres soluciones: usar un código Gray (un solo bit cambia por paso), un protocolo de señalización (un bit sincronizado le avisa al destino cuándo el dato es estable) o una memoria FIFO entre los dos dominios. Las veremos en el último bloque.

08 · Analogía con programación

Presupuestos de tiempo, ventanas de carrera y sincronización

Verificar los tiempos de un circuito se parece a revisar un presupuesto de latencia: cada etapa consume una parte del período, y la suma tiene que entrar. La metastabilidad se parece a una condición de carrera con una ventana minúscula: ocurre muy poco, pero cuando ocurre es irreproducible. Un sincronizador es la solución clásica: no intentar leer el estado hasta que se haya asentado.

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: holguras de preparación y mantenimiento

# Parámetros del flip-flop (ns, orientativos)
T_CLKQ_MAX, T_CLKQ_MIN = 20.0, 10.0
T_SU, T_H = 15.0, 3.0

# (camino, retardo máximo de la lógica, retardo mínimo de la lógica)
CAMINOS = [("registro de desplazamiento (Q → D directo)", 0.0, 0.0),
           ("contador: T1 = Q0 (una AND)", 8.0, 5.0),
           ("contador: T3 = Q0·Q1·Q2 (AND de 3)", 12.0, 8.0),
           ("sumador de 4 bits entre registros", 45.0, 15.0)]


def holgura_setup(periodo, t_log_max, skew):
    """Cuánto sobra del período: T - (clk→Q + lógica + setup + skew)."""
    return periodo - (T_CLKQ_MAX + t_log_max + T_SU + skew)


def holgura_hold(t_log_min, skew):
    """El dato nuevo no debe llegar antes de que pase el mantenimiento."""
    return (T_CLKQ_MIN + t_log_min) - (T_H + skew)


for skew in (2.0, 12.0):
    print(f"--- skew = {skew} ns, período = 60 ns ---")
    print("camino                                          setup   hold")
    peor = 0.0
    for nombre, t_max, t_min in CAMINOS:
        s, h = holgura_setup(60.0, t_max, skew), holgura_hold(t_min, skew)
        marca = "  <-- VIOLACIÓN" if (s < 0 or h < 0) else ""
        print(f"{nombre:46s} {s:6.1f} {h:6.1f}{marca}")
        peor = max(peor, T_CLKQ_MAX + t_max + T_SU + skew)
    print(f"período mínimo = {peor:.0f} ns -> f máx = {1000 / peor:.1f} MHz\n")

Con 2 ns de skew, el sumador viola la preparación (−22 ns) y el período mínimo del circuito es de 82 ns, unos 12 MHz. Con 12 ns de skew aparece una violación de mantenimiento en el registro de desplazamiento (−5 ns), que no depende del período. Cambiá el skew o el período y miralo cambiar.

Paso 2: ventana, probabilidad y MTBF

import math
import random

T, T_SU, T_H = 50.0, 15.0, 3.0           # período y ventana (ns)
TAU, T_W = 0.5, 0.1                      # constantes de metastabilidad de ejemplo (ns)
T_CLKQ, T_LOGICA = 20.0, 10.0

rnd = random.Random(1)
N = 200_000
dentro = sum(1 for _ in range(N) if (lambda t: t >= T - T_SU or t < T_H)(rnd.uniform(0, T)))
print(f"fracción de cambios de D que caen en la ventana: simulada {dentro / N:.3f}, teórica {(T_SU + T_H) / T:.3f}")

f_clk, f_dato = 1e9 / T, 1e6              # 20 MHz de reloj y 1 MHz de cambios del dato


def mtbf_segundos(tr_ns):
    return math.exp(tr_ns / TAU) / (T_W * 1e-9 * f_clk * f_dato)


def legible(seg):
    if seg < 120:
        return f"{seg:.0f} s"
    for nombre, valor in (("años", 3.15e7), ("días", 86400.0), ("horas", 3600.0)):
        if seg >= valor:
            return f"{seg / valor:.3g} {nombre}"
    return f"{seg / 60:.0f} min"


tr_uno = T - T_CLKQ - T_LOGICA - T_SU                       # un flip-flop, con lógica detrás
tr_dos = (T - T_CLKQ - T_SU) + (T - T_CLKQ - T_LOGICA - T_SU)   # sincronizador de dos etapas
print(f"\ntiempo de resolución disponible: una etapa {tr_uno:.0f} ns, dos etapas {tr_dos:.0f} ns")
for nombre, tr in (("una etapa", tr_uno), ("dos etapas", tr_dos)):
    p = math.exp(-tr / TAU)
    print(f"{nombre:10s}: P(indefinida) = {p:.1e} por evento, MTBF = {legible(mtbf_segundos(tr))}")

La fracción de cambios que cae en la ventana coincide con (tsu + th) / T = 36 %. Con una sola etapa la probabilidad de quedar indefinida es de 4,5 × 10⁻⁵ por evento y el MTBF de unos 11 segundos; con dos etapas, 4,2 × 10⁻¹⁸ y millones de años. Probá bajar T a 46 ns y mirá cómo se desploma la ventaja (con T menor que 45 ns ya no queda tiempo de resolución y el modelo deja de tener sentido).

Paso 3: un sincronizador frente a pulsos al azar

import random

T, T_SU, T_H = 50.0, 15.0, 3.0
rnd = random.Random(3)

# Pulsos asíncronos: (inicio, ancho) en ns, sin relación con el reloj
pulsos, t = [], 20.0
for _ in range(40):
    ancho = rnd.uniform(10, 120)
    pulsos.append((t, ancho))
    t += ancho + rnd.uniform(60, 200)

flancos = [k * T for k in range(int(t / T) + 3)]


def valor(tiempo):
    return int(any(ini <= tiempo < ini + w for ini, w in pulsos))


def cambia_cerca(tiempo):
    cambios = [x for ini, w in pulsos for x in (ini, ini + w)]
    return any(tiempo - T_H < c < tiempo + T_SU for c in cambios)    # ventana de [flanco - setup, flanco + hold]


q1, q2, indefinidos = 0, 0, 0
salida = []
for f in flancos:
    q2 = q1                                  # la segunda etapa copia lo que ya se asentó
    if cambia_cerca(f):
        indefinidos += 1
        q1 = rnd.randint(0, 1)               # la primera etapa elige cualquiera (modelo de resolución)
    else:
        q1 = valor(f - 0.01)                 # justo antes del flanco
    salida.append(q2)

vistos = sum(1 for ini, w in pulsos if any(ini <= f < ini + w for f in flancos))
print(f"pulsos asíncronos enviados: {len(pulsos)}")
print(f"pulsos que algún flanco vio: {vistos}; perdidos por ser más cortos que el período: {len(pulsos) - vistos}")
print(f"muestras de la 1.ª etapa dentro de la ventana (indefinidas): {indefinidos} de {len(flancos)}")
print("la 2.ª etapa solo ve valores ya resueltos; su salida llega entre 1 y 2 períodos después que la entrada")
print(f"salida sincronizada: {sum(1 for a, b in zip(salida, salida[1:]) if a == 0 and b == 1)} flancos de subida")

De 40 pulsos asíncronos, el reloj de 50 ns vio 37 y perdió 3, todos más cortos que el período. De 168 flancos, 29 cayeron cerca de un cambio de la entrada y la primera etapa quedó indefinida (el modelo la resuelve al azar). La segunda etapa siempre recibe un valor limpio, con un retraso de 1 a 2 períodos.

Paso 4: de un nivel a un pulso de un ciclo

def detector_de_flancos(sincronizada):
    """Un pulso de un ciclo por cada flanco ascendente: q_actual AND NOT q_anterior."""
    q_ant, pulsos = 0, []
    for q in sincronizada:
        pulsos.append(1 if q == 1 and q_ant == 0 else 0)
        q_ant = q
    return pulsos


# Un pulsador ya sincronizado: se mantuvo apretado 5 ciclos, se soltó, y se apretó 2 ciclos más
entrada = [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0]
pulsos = detector_de_flancos(entrada)
print("pulsador   ", *entrada)
print("un solo ciclo", *pulsos)
print(f"cuenta = {sum(pulsos)} pulsaciones (no importa cuánto se mantuvo apretado)")

contador = 0
for p in pulsos:
    contador += p             # el contador usa el pulso de un ciclo como habilitación
print("valor del contador:", contador)

El pulsador se mantuvo apretado 5 ciclos y, después, 2: el detector entrega exactamente un pulso de un ciclo por cada flanco ascendente, y el contador suma 2. Si el contador usara el nivel directamente como habilitación, habría sumado 7.

Una diferencia con el software: acá no hay forma de «reintentar» una lectura. Si el dato se capturó mal, el sistema continúa con un valor equivocado, y por eso la defensa se hace en el diseño, no en el tiempo de ejecución.

09 · Exploración interactiva

La ventana y el sincronizador

El primer panel muestra la ventana de un flip-flop: el flanco ascendente en t = 80 ns, la ventana sombreada entre tsu antes y th después, y la transición de D en el instante que elijas con el deslizador «Cambio de D». El resultado se calcula con la regla de la sección 2. El segundo panel envía transiciones asíncronas al azar contra un reloj de período T y mide qué parte cae en la ventana, con las probabilidades de la sección 5 para una y dos etapas.

Panel 1: ¿qué captura el flip-flop?

Ventana de captura interactiva El reloj sube en 80 nanosegundos. La ventana sombreada marca el tiempo de preparación antes y de mantenimiento después. El dato cambia en el instante elegido. La salida muestra qué se captura.
Cambio de D-40 ns
Resultado de la capturaCaptura el dato nuevo (1)
Distancia al borde de la ventana25 ns
Ventana total18 ns
Período mínimo (clk→Q + lógica + tsu)45 ns
Frecuencia máxima22,2 MHz

Panel 2: entrada asíncrona y sincronizador

Transiciones enviadas0
Cayeron en la ventana0
Fracción teórica (tsu + th) / T36 %
P(indefinida), 1 etapa—
P(indefinida), 2 etapas—

D cambia 40 ns antes del flanco, fuera de la ventana: el flip-flop captura el dato nuevo.

Últimas transiciones enviadas (τ = 0,5 ns y tclk→Q = 20 ns).
N.ºInstante dentro del período¿En la ventana?Primera etapaSegunda etapa
Sin transiciones enviadas.

Recorrido guiado

  1. Con los valores iniciales, D cambia 40 ns antes del flanco: queda 25 ns antes del borde de la ventana. El flip-flop captura el dato nuevo y Q sube tclk→Q después del flanco.
  2. Llevá el deslizador a −15 ns: el cambio coincide con el borde de la ventana (tsu = 15). Todavía es seguro, con margen 0.
  3. Pasá a −10 ns, −5 ns, 0 y +2 ns: la zona roja con «¿0 o 1?» indica una violación. En esos casos nadie puede predecir qué captura.
  4. Con +3 ns el cambio llega justo después del mantenimiento: el flip-flop captura el dato viejo. Con +20 ns, también.
  5. Subí tsu a 25 ns: la ventana se ensancha hacia la izquierda y el cambio de −20 ns, que era seguro, pasa a ser una violación. Cuanto más lento el flip-flop, más exigente.
  6. Subí la lógica a 45 ns: el período mínimo pasa de 45 a 80 ns y la frecuencia máxima baja de 22 a 12,5 MHz. Es el camino crítico.
  7. En el panel 2, enviá 100 transiciones con T = 50 ns: alrededor del 36 % cae en la ventana. Reducí T a 30 ns y repetí: la fracción sube hasta cerca del 60 %.
  8. Compará P(indefinida) para una y dos etapas con T = 50 ns y mirá cómo la segunda es astronómicamente menor. Bajá T hasta 45 ns: la primera pasa a 1 (sin tiempo de resolución) mientras la segunda todavía vale unos 2 × 10⁻⁹. Si seguís bajando, la segunda también deja de servir.
Desafío: encontrar el período mínimo para que una sola etapa sea «segura»

Con τ = 0,5 ns, una probabilidad de 10−12 exige tr ≈ 14 ns de tiempo de resolución. Con tclk→Q = 20, tlógica = 10 y tsu = 15, eso requiere un período de unos 59 ns (menos de 17 MHz). Hacelo con el deslizador de período y mirá cuándo P(1 etapa) baja de 10−12. Con dos etapas, el mismo resultado se logra con períodos mucho menores.

10 · Método de trabajo

Cómo verificar los tiempos de un diseño

  1. Reunir los números: tsu, th, tclk→Q (mínimo y máximo) y retardos de las compuertas, en las condiciones reales de tensión y temperatura.
  2. Listar los caminos entre cada par de flip-flops conectados, con su lógica de mayor y menor retardo.
  3. Calcular la holgura de preparación de cada camino con máximos y el skew; el menor valor define el camino crítico y el período mínimo.
  4. Calcular la holgura de mantenimiento con mínimos; si es negativa, agregar retardo al dato o reducir el skew.
  5. Identificar las entradas externas: toda señal que no nazca de un flip-flop del mismo reloj es asíncrona y necesita sincronizador.
  6. Sincronizar bit por bit solo señales de un bit; para buses, usar Gray, handshake o FIFO.
  7. Dejar un margen razonable (por ejemplo, 20 a 30 %) en la frecuencia, para absorber jitter y variaciones.
  8. Probar en los extremos: temperatura alta y baja, tensión mínima, ejemplares distintos.

En la mesa, un analizador lógico con disparo en el flanco del reloj permite medir cuándo cambian los datos respecto de él. La señal cuya transición queda más cerca de la ventana es la que va a fallar primero cuando se suba la temperatura o la frecuencia.

11 · Comprensión

Confusiones frecuentes

«Un flip-flop adicional elimina la metastabilidad»

La reduce exponencialmente, no la elimina. Con dos etapas, el MTBF pasa a ser de millones de años en condiciones normales; a frecuencias muy altas o con muchos datos se necesitan tres.

«La metastabilidad es un defecto de ciertos chips»

Es una propiedad física de todo biestable al que se le presenta una señal que cambia dentro de la ventana. Algunos dispositivos tienen una τ menor (se resuelven más rápido), pero ninguno es inmune.

«Bajando la frecuencia se arreglan todas las violaciones»

Se arreglan las de preparación. Las de mantenimiento ocurren en el mismo flanco y no dependen del período: se arreglan con más retardo en el camino o menos skew.

«Los retardos de la hoja de datos son siempre los máximos»

Las hojas dan un mínimo y un máximo (y a veces solo uno típico). La preparación se verifica con el máximo; el mantenimiento, con el mínimo. Usar el valor equivocado deja violaciones ocultas.

«Un bus de 8 bits se sincroniza con ocho sincronizadores de dos flip-flops»

Cada bit se resuelve en su propio ciclo y el destino puede ver una combinación inexistente. Los buses se pasan con código Gray (si cambia un bit por vez), con un protocolo de aviso o con una FIFO.

«El detector de flancos arregla el rebote»

Genera un pulso por cada flanco, y cada rebote es un flanco. El antirrebote (tema 7) va antes del sincronizador; el detector, al final.

«Si el circuito funciona en la mesa, cumple los tiempos»

Funciona en esas condiciones. Con más temperatura, otra tensión o otro lote de chips, las holguras cambian. Un margen de seguridad y el análisis de caminos son lo único que lo garantiza.

12 · Práctica guiada

Calculá antes de comprobar

1. Holgura de preparación

Un camino tiene tclk→Q,máx = 20 ns, lógica máxima de 8 ns, tsu = 15 ns y skew de 2 ns. Con un reloj de 25 MHz (T = 40 ns), ¿cuánto vale la holgura? ¿Cuál es la frecuencia máxima?

Ver solución razonada

Se necesitan 20 + 8 + 15 + 2 = 45 ns. Holgura = 40 − 45 = −5 ns: viola. El período mínimo es 45 ns, o sea una frecuencia máxima de 22,2 MHz. A 25 MHz no cumple; hay que bajar el reloj o reducir la lógica.

2. Holgura de mantenimiento

Un registro de desplazamiento (sin lógica) tiene tclk→Q,mín = 8 ns, th = 5 ns y el reloj llega al destino 6 ns después que al origen. ¿Se cumple? ¿Se arregla bajando la frecuencia?

Ver solución

Holgura = (8 + 0) − (5 + 6) = −3 ns: viola. No se arregla con la frecuencia, porque el dato nuevo llega demasiado pronto después del mismo flanco. Se arregla agregando al menos 3 ns de retardo en la línea de datos (un buffer o una compuerta) o reduciendo el skew.

3. Probabilidad de caer en la ventana

Una entrada asíncrona cambia en instantes uniformemente distribuidos. Con T = 40 ns, tsu = 12 ns y th = 2 ns, ¿qué fracción de los cambios cae en la ventana? ¿Y si se duplica la frecuencia del reloj?

Ver solución

(12 + 2) / 40 = 35 %. Al duplicar la frecuencia, T = 20 ns y la fracción pasa a 14 / 20 = 70 %. Ir más rápido hace más probable que un cambio asíncrono caiga en la ventana, y además deja menos tiempo de resolución.

4. El valor de una etapa más

Con τ = 0,5 ns, T = 50 ns, tclk→Q = 20 ns y tsu = 15 ns, el segundo flip-flop de un sincronizador agrega 15 ns de tiempo de resolución. ¿Por qué factor multiplica el MTBF?

Ver solución razonada

El MTBF crece como etr/τ: e15/0,5 = e30 ≈ 1 × 1013 veces. Por eso una etapa de más cambia el MTBF de segundos a millones de años.

5. La cadena de un botón

Un pulsador debe incrementar un contador de eventos una vez por pulsación, con el reloj del sistema a 1 MHz. Dibujá la cadena de bloques y explicá para qué sirve cada uno.

Ver solución

Antirrebote (latch con conmutador o RC con Schmitt): elimina los saltos del contacto. Sincronizador de dos flip-flops: mete la señal al dominio del reloj sin metastabilidad. Detector de flancos (un flip-flop y una AND con negada): un pulso de un ciclo por pulsación. Contador con ese pulso como habilitación: suma 1 por cada pulsación, sin importar cuánto se mantenga apretado.

6. El bus incoherente

Un contador de 4 bits de otro reloj pasa de 0111 a 1000. Un circuito lo lee con cuatro sincronizadores independientes. ¿Qué valores puede leer? ¿Cómo se evita?

Ver solución razonada

Los cuatro bits cambian casi a la vez, y cada sincronizador puede capturar el viejo o el nuevo valor de su bit: se puede leer cualquier combinación entre 0000 y 1111 (por ejemplo, 1111 o 0000), que nunca fueron la cuenta. Se evita pasando el contador a código Gray (un solo bit cambia por paso, así que cualquier lectura es el valor viejo o el nuevo), o con un protocolo de aviso que sincroniza un único bit «dato válido».

13 · Síntesis

Ideas para recordar

  • Un flip-flop necesita D estable tsu antes y th después del flanco; fuera de esa ventana el resultado es el esperado, dentro es indefinido.
  • Preparación: T ≥ tclk→Q,máx + tlógica,máx + tsu + skew. Mantenimiento: tclk→Q,mín + tlógica,mín ≥ th + skew. La holgura es la diferencia.
  • El camino crítico fija la frecuencia máxima; el mantenimiento no depende del período.
  • El skew (reloj que llega a destiempo) y el jitter (flancos que tiemblan) restan margen.
  • La metastabilidad no se elimina, se hace improbable: P ≈ e−tr/τ y MTBF = etr/τ / (TW·fclk·fdato).
  • Toda entrada que no sea del reloj pasa por un sincronizador de dos flip-flops, sin lógica entre ellos, y se usa solo la salida del segundo.
  • Un botón necesita antirrebote, sincronizador y detector de flancos; los buses de varios bits se cruzan con Gray, handshake o FIFO.

¿Listo para el tema 12?

Antes de avanzar, calculá las dos holguras de un camino con tus propios números, explicá por qué el mantenimiento no se arregla con el reloj y dibujá un sincronizador de dos flip-flops indicando dónde puede ocurrir la metastabilidad. Si podés justificar las tres respuestas, ya podés pasar al taller de flip-flops reales.

En el próximo tema es la hora de la mesa de trabajo: el taller de flip-flops con el 74HC74, donde armamos captura, reset y un reloj manual sin rebotes.