El biestable D: memoria activada por flanco en el diseño digital
El biestable D captura su entrada D en un único flanco de reloj — el comportamiento de instantánea que necesita todo registro síncrono. Cubre temporización y metaestabilidad.
TL;DR: Un biestable D captura lo que haya en su entrada de datos (D) en el momento de un flanco de reloj activo y retiene ese valor hasta el siguiente flanco activo. Su ecuación característica es . A diferencia de un latch D, que es transparente mientras la habilitación está en alto, la ventana de captura del biestable D es efectivamente cero — lo que lo convierte en la base del diseño digital síncrono.
Las puertas combinacionales — AND, OR, NOT — calculan, pero no recuerdan. Para retener un estado se necesita un elemento de memoria. El sencillo latch D proporciona almacenamiento, pero con una falla crítica: la transparencia. Un latch D con su habilitación en alto se comporta como una ventana abierta: cualquier glitch en la entrada se propaga directamente a la salida.
Para sistemas robustos y predecibles necesitamos un componente que se comporte menos como una ventana y más como una cámara, capturando una instantánea perfecta de los datos en un único instante preciso. Ese componente es el D_FLIP_FLOP, la base del diseño síncrono moderno.

El D_FLIP_FLOP: una definición
Un D_FLIP_FLOP es un elemento de memoria síncrono de 1 bit. La “D” viene de “Data” (Datos), ya que su finalidad principal es capturar el valor presente en su línea de datos. A diferencia de su primo, el D_LATCH, que es sensible al nivel, el D_FLIP_FLOP opera bajo el mando estricto de la transición de una señal de reloj.
En el entorno de digisim.io encontrarás el D_FLIP_FLOP bajo la categoría Sequential Logic. Cuenta con cuatro terminales esenciales que debes dominar:
- D (Data): la entrada que contiene el valor del bit (0 o 1) que quieres almacenar.
- CLK (Clock): la señal de control. El biestable solo actúa cuando ve una transición específica —un flanco— en esta entrada.
- Q: la salida principal, que refleja el bit almacenado actualmente.
- (Q-bar): la salida invertida, que siempre es el opuesto lógico de Q.
La magia del D_FLIP_FLOP reside en su comportamiento activado por flanco, y comprender esta distinción frente a los dispositivos sensibles al nivel como el D_LATCH es crucial:
- Sensible al nivel (latch D): la salida sigue a la entrada durante toda la duración en que la habilitación está en alto. La “ventana de captura” es tan ancha como el pulso de habilitación. Cualquier glitch durante esa ventana se cuela.
- Activado por flanco (biestable D): la salida captura la entrada únicamente en la transición instantánea del reloj —un flanco de subida (bajo a alto) o de bajada (alto a bajo). La ventana de captura tiene anchura efectivamente cero. Entre flancos, la entrada se ignora por completo.
Esta distinción es el salto fundamental desde la lógica secuencial básica al diseño síncrono robusto. Un latch D es transparente; un biestable D es opaco salvo en un instante único y definido con precisión.
Prueba el comportamiento del D_FLIP_FLOP ahora
Tabla de verdad: capturando el instante
El comportamiento de un D_FLIP_FLOP activado por flanco positivo puede resumirse con una tabla de verdad simple pero poderosa. La flecha () significa el flanco de subida del reloj —el único momento que realmente importa en un sistema síncrono.
| CLK | D | Acción | |
|---|---|---|---|
| 0 | 0 | Captura el ‘0’ | |
| 1 | 1 | Captura el ‘1’ | |
| 0 | X | Q | Retiene el estado (estático) |
| 1 | X | Q | Retiene el estado (estático) |
| X | Q | Retiene el estado (flanco de bajada ignorado) |
La ‘X’ en la columna D es un símbolo de “no importa”. Significa que, mientras el CLOCK no esté en transición, la entrada D no tiene efecto sobre la salida Q. La salida simplemente mantiene el último valor capturado. Por eso lo llamamos “activado por flanco”. Si estás depurando un circuito y la salida no cambia cuando accionas un interruptor, revisa tu CLOCK. ¿Está pulsando? Si no, el D_FLIP_FLOP está haciendo exactamente lo que está diseñado para hacer: nada.
La lógica subyacente: la ecuación característica
Aunque podemos construir un D_FLIP_FLOP a partir de puertas —típicamente usando una configuración maestro-esclavo con dos componentes D_LATCH—, su comportamiento se describe de forma más elegante mediante su ecuación característica. Esta ecuación define el siguiente estado de la salida, denotado como , en función de la entrada actual, D.
Para un D_FLIP_FLOP, la ecuación es maravillosamente simple:
Esta ecuación se lee: “El valor de Q tras el siguiente flanco de reloj será cualquier valor que tenga D en ese flanco de reloj”.
El D_FLIP_FLOP es el “imitador” del mundo digital. No realiza lógica; solo recuerda. Pero encadenando estos imitadores creamos el registro de 4 bits, el registro de desplazamiento y, en última instancia, toda la jerarquía de memoria de una CPU.
Error común: el campo minado de la metaestabilidad
Un biestable parece un dispositivo digital perfecto, pero vive en un mundo analógico. Su promesa de capturar datos en un instante preciso viene con un contrato estricto, definido por dos parámetros de temporización: tiempo de setup y tiempo de hold.
- Tiempo de setup (): es el tiempo mínimo que la entrada D debe estar estable antes de que llegue el flanco de reloj activo. El biestable necesita ese tiempo para “ver” los datos y preparar las puertas internas para la captura.
- Tiempo de hold (): es el tiempo mínimo que la entrada D debe permanecer estable después de que haya pasado el flanco de reloj activo. La circuitería interna necesita ese tiempo para fijar el valor de forma fiable.
¿Qué pasa si se viola este contrato? Entras en el reino de la metaestabilidad.
Imagina una pelota perfectamente equilibrada en la cumbre de un tejado empinado. Quiere caer a la izquierda (0) o a la derecha (1), pero por un breve e impredecible momento, oscila en el medio. En un circuito digital, si la entrada D cambia dentro de la ventana crítica de setup y hold, la salida Q puede exhibir uno de varios modos de fallo:
- Voltaje intermedio: Q se asienta en un voltaje entre los umbrales válidos de HIGH y LOW. Las puertas aguas abajo pueden interpretarlo de forma distinta, leyendo algunas ‘0’ y otras ‘1’ a partir de la misma señal.
- Oscilación prolongada: el lazo de realimentación interno oscila entre estados antes de resolverse — pero el tiempo de resolución es probabilístico, no determinista.
- Resolución tardía: Q termina asentándose en un estado válido, pero el retardo excede el periodo de reloj, haciendo que la etapa siguiente muestree datos obsoletos o inválidos.
La contramedida estándar de la ingeniería para entradas asíncronas (señales sin relación temporal con el reloj del sistema) es el sincronizador de dos etapas: dos D_FLIP_FLOPs en serie, ambos cadenciados por el reloj del sistema. El primer biestable puede entrar en metaestabilidad, pero tiene un periodo de reloj completo para resolverse antes de que el segundo biestable muestree su salida. Esto reduce la probabilidad de que la metaestabilidad se propague a niveles astronómicamente bajos.
En un sistema complejo como una CPU moderna, un único evento metaestable sin resolver puede causar un fallo catastrófico. Por eso usamos el OSCILLOSCOPE_8CH en digisim.io para verificar relaciones temporales: garantizando que los datos estén estables mucho antes de que llegue el flanco de reloj.
Simulación interactiva: construyendo el D_FLIP_FLOP activado por flanco
Pasemos de la teoría al lienzo. Para entender de verdad la diferencia entre un latch sensible al nivel y un biestable activado por flanco, hay que verlos lado a lado.

Guía paso a paso de simulación
- Abre el espacio de trabajo: ve al editor de digisim.io.
- Coloca los componentes:
- Arrastra un D_FLIP_FLOP al lienzo.
- Añade un INPUT_SWITCH para la entrada D.
- Añade un componente CLOCK para la entrada CLK.
- Añade un OUTPUT_LIGHT a la salida Q.
- La prueba:
- Pon el INPUT_SWITCH en ‘1’. Observa que el OUTPUT_LIGHT permanece apagado.
- Alterna el CLOCK. En el momento en que el reloj pase de 0 a 1, la luz se enciende.
- Ahora pon el INPUT_SWITCH en ‘0’ mientras el reloj sigue en alto (1). ¡Observa que la luz sigue encendida! Esa es la diferencia clave con un D_LATCH. El biestable ya no es “transparente”. Capturó el ‘1’ en el flanco de subida y ahora ignora el hecho de que la entrada haya cambiado.
- Verificación con OSCILLOSCOPE:
- Conecta el canal 1 de un OSCILLOSCOPE al CLOCK.
- Conecta el canal 2 a la salida Q.
- Ejecuta la simulación y observa las formas de onda. Verás que la salida Q solo cambia en perfecta sincronización con el flanco de subida del reloj.
Abrir la plantilla activada por flanco
Aplicaciones reales: de registros a divisores de frecuencia
El D_FLIP_FLOP no es un mero ejercicio académico; es el bloque de construcción fundamental de todo dispositivo digital que hayas usado.
1. Registros de CPU y el ACCUMULATOR
Un procesador de 64 bits contiene numerosos registros. Un registro de 64 bits es esencialmente un arreglo de 64 componentes D_FLIP_FLOP que comparten una línea de CLOCK común. Cuando la CPU ejecuta una instrucción para “guardar” un resultado, coloca los datos en el DATA_BUS_8BIT (o su equivalente de 64 bits) y pulsa el reloj. En ese único instante síncrono, todo el valor queda capturado. Así es exactamente como funcionan el ACCUMULATOR y el INSTRUCTION_REGISTER en nuestras lecciones de arquitectura de CPU (lecciones 63-70).
2. Divisores de frecuencia
Si tomas un D_FLIP_FLOP y conectas su salida invertida () a su propia entrada D, creas un circuito de conmutación (toggle).
En cada flanco de subida del reloj, el biestable captura el opuesto de su estado actual. Si Q era 0, pasa a 1. Si era 1, pasa a 0. Como hacen falta dos pulsos de reloj para completar un ciclo completo (0 1 0) en la salida Q, la frecuencia de salida es exactamente la mitad de la frecuencia del reloj de entrada. Esa es la base de los relojes digitales y los generadores de baudios en la comunicación serie.
Explora la división de frecuencia
Por qué gana el diseño síncrono
Antes de que el D_FLIP_FLOP se convirtiera en estándar, los ingenieros lidiaban con diseños “asíncronos” en los que las señales atravesaban las puertas a distintas velocidades, provocando “glitches” o carreras (race conditions).
Al usar el D_FLIP_FLOP imponemos un latido global: el CLOCK. Permitimos que la lógica combinacional (las puertas AND y OR) sea caótica y tenga retardos de propagación (), siempre y cuando se asiente antes de que llegue el siguiente flanco de reloj. El D_FLIP_FLOP actúa como una barrera, impidiendo que ese caos se propague por el sistema. Crea un “puerto seguro” para los datos.
Por eso dedicamos tanto tiempo a la lógica secuencial en nuestro currículo (lecciones 41-62). Una vez que domines el D_FLIP_FLOP, comprendes cómo se gestiona el tiempo mismo dentro de una computadora.
Resumen y próximos pasos
Hemos cubierto mucho terreno. Hemos pasado del peligro “transparente” de los latches a la precisión de “instantánea” del D_FLIP_FLOP. Hemos visto la ecuación característica y nos hemos enfrentado a la realidad de la metaestabilidad y las restricciones de temporización.
Para los siguientes pasos en lógica secuencial, lee El biestable JK (que añade modos de toggle, set y reset) y luego Biestables SR vs. JK. Para la física de la temporización detrás del contrato que acabas de aprender, lee El reloj invisible.
Tu reto: intenta construir un registro de 4 bits. Usa cuatro componentes D_FLIP_FLOP, conecta todos sus pines CLK a un único CLOCK y almacena un nibble de 4 bits (como 1011) simultáneamente. Usa SimCast para grabar el circuito en acción: es la mejor manera de detectar problemas de temporización que el ojo desnudo pasa por alto.