¿Cómo garantiza el sincronizador 2-ff una sincronización adecuada?

El uso de sincronizadores 2-ff ha sido un estándar para que una señal cruce los límites del reloj. Y hay muchos papeles/figuras que ilustran el mecanismo, como este:ingrese la descripción de la imagen aquí

Parece que bclk solo puede muestrear el pulso de adat una vez (en el segundo borde ascendente de bclk ), lo que provoca la metaestabilidad de salida en bq1_dat . ¿Cómo se puede muestrear bq1_dat "alto" en el siguiente borde de reloj activo?


Además de mi pregunta, me gustaría agregar lo que pienso para que una señal pase de manera segura a otro dominio de reloj (supongamos que 2-FF es suficiente para satisfacer el requisito de MTBF). Por favor corrígeme si hay algún error.

ingrese la descripción de la imagen aquí

pd: el estado metaestable no muestra una forma de onda "deambulante", sino un nivel que no es ni '1' ni '0'. La siguiente figura muestra un ejemplo de salida metaestable.ingrese la descripción de la imagen aquí

La figura original provino de las notas de la clase EE108A, Clase 13: Falla de metaestabilidad y sincronización (cómo cuando los buenos flip-flops se estropean) por WJ Dally.

Solo quiero decir que los diagramas que muestran la salida metaestable "deambulando" son extremadamente engañosos. Así no es como se ve la metaestabilidad en absoluto. Cuando un FF se vuelve metaestable, su salida pasa a un único voltaje intermedio específico (el valor depende de la tecnología de implementación) y permanece allí. Después de una cantidad de tiempo impredecible, el voltaje oscilará hacia arriba o hacia abajo, y también es impredecible hacia dónde va.
@Dave Tweed♦ Gracias por el comentario. En casi todos los documentos que he leído sobre metaestabilidad, vi las formas de onda "deambulando". Busqué y encontré una publicación ( si un flip flop tiene una violación de configuración y se vuelve metaestable, ¿está garantizado que se establecerá en el valor de entrada cuando termine de oscilar? ) que contiene un disparo desde el oscopio con estado metaestable capturado. En esa publicación se incluye un enlace a la referencia original de la figura.
Sí, eso ilustra perfectamente mi punto, y la presentación de Powerpoint de la que proviene tiene mucha información buena.

Respuestas (2)

La respuesta simple es que no lo hacen por su cuenta. El sincronizador no está allí para garantizar que los datos se transmitan, sino para garantizar que no termine con señales metaestables que alimentan muchas otras señales y causan problemas. El segundo FF, como muestra el diagrama, captura la primera salida metaestable de FF y evita que se propague más a través del diseño.

Hay varios tipos de señales, y la forma en que incluye sincronizadores depende de la señal de la que esté hablando. Pero veamos un par de tipos comunes:

  1. Señales de activación : o cualquier señal que sea básicamente un pulso que debe iniciar la ejecución de otra cosa. Estos generalmente no llevan datos, y todo lo que le interesa es que haya, digamos, un flanco ascendente para que algo comience a funcionar en otro dominio de reloj. Para que estos se crucen, necesitaría un sincronizador (esencialmente haciendo lo que se muestra en su diagrama), pero necesita un poco más.

    La opción más simple es extender el pulso; esencialmente, asegúrese de que el pulso de entrada sea más de 1 período de reloj del reloj de destino (debe ser más largo que 1 ciclo por al menos el mayor de los tiempos de configuración y espera para el registro de destino) . Por ejemplo, si va de un reloj de 20 MHz a un reloj de 15 MHz, se aseguraría de que su pulso sea de dos ciclos de reloj en la entrada, lo que garantizaría que se presente al reloj de destino y no se pierda. Esto también responde a su pregunta sobre cómo se garantiza que la señal se transmitirá. Si el pulso es más ancho que un período de reloj de destino, significa que si se vuelve metaestable en el primer borde del reloj y termina viéndose como un 0, entonces en el segundo borde del reloj definitivamente captará el pulso.

    Debido a que con este tipo de señal solo le interesa que el pulso haya llegado, no importa si la señal de salida termina con dos ciclos de reloj alto algunas veces y solo un ciclo el resto. Si necesita asegurarse de que es un pulso de un solo ciclo, puede crear una instancia de un circuito detector de borde simple.

  2. Buses de control - o posiblemente tipos de buses de datos. Podría decirse que estos son más difíciles porque si tiene un flujo de datos de varios bits que debe permanecer sincronizado. En este caso, lo que haría sería implementar algo llamado "apretón de manos". Básicamente, carga sus datos en el reloj de origen y los mantiene. Luego, envía una señal de solicitud (como en 1) a través de un sincronizador. Una vez que se transmite la señal de solicitud, sabe que el bus de datos también se estabilizará en el dominio de destino. A continuación, puede registrarlo en un banco registrador en el destino. Luego, el destino envía un pulso de reconocimiento nuevamente para informar a la fuente que puede cargar la siguiente palabra.

    Usaría este tipo de bus si necesitara enviar una palabra de control al reloj de destino para el cual necesita saber que ha llegado antes de enviar otro (por ejemplo, si está enviando un comando para hacer algo).

  3. Buses de datos : para datos en los que tiene una fuente que escupe datos continuamente o en ráfagas, podría decirse que es mejor usar un FIFO que sincronizadores. El FIFO utiliza una memoria de doble reloj para almacenar los datos, junto con contadores para realizar un seguimiento de la cantidad de datos que hay en el FIFO. Escribe los datos en el FIFO cuando hay espacio y luego incrementa la dirección de escritura. Luego, esta dirección generalmente se codifica en un esquema de "codificación gris" que garantiza que cada incremento en la dirección cause solo unabit en el bus de direcciones para cambiar (lo que significa que no necesita sincronizar varios bits). Luego, esta dirección se transfiere al dominio de destino (a través de una de sus cadenas sincronizadoras), donde se compara con la dirección de lectura. Si hay datos en el FIFO, se pueden leer de la memoria utilizando el puerto de reloj de destino. La dirección de lectura tiene un código Gray similar y se envía de regreso a la fuente a través de otro sincronizador para que el puerto de escritura pueda calcular si hay espacio en el FIFO.

  4. Señales de restablecimiento : por lo general, utilizan una versión modificada del sincronizador en lo que se conoce como "Afirmación asíncrona, Desactivación síncrona". En esta versión modificada, la entrada de datos al primer flip-flop está vinculada a GND y, en cambio, la señal de reinicio entrante está conectada a las señales asíncronas preestablecidas de cada flip-flop en el sincronizador. Esto da como resultado una señal de salida que es completamente asíncrona cuando sube, pero la cadena sincronizadora se asegura de que baja sincrónicamente con el reloj de destino cronometrando a través de ceros en la cadena de registro.

    Este tipo de sincronizador es terrible para los datos y el control, pero se adapta perfectamente a las señales de reinicio. Si toda la lógica de destino alimenta la salida de esta cadena a las entradas de restablecimiento asíncrono de cualquier registro en el dominio, entonces hay poca preocupación por la metaestabilidad en la afirmación (aunque sea asíncrono) ya que todos los registros son forzados a un estado conocido. Luego, cuando la señal de reinicio se anula en el dominio de origen, se anula sincrónicamente en el dominio de destino, lo que significa que todos los registros salen del reinicio en el mismo ciclo de reloj (en lugar de +/- 1 ciclo si fue una anulación asíncrona).


Como puede ver en lo anterior, es mucho más complejo cruzar el dominio del reloj que simplemente colocar un sincronizador de 2 flip-flop en la señal. El método exacto utilizado depende de la aplicación.

Además de la respuesta de Tom, me gusta agregar una referencia a PoC , que tiene implementaciones para estos casos. Los documentos del sincronizador están disponibles en RTD. Además de la teoría de encadenar 2 flip-flops para un sincronizador 2-FF básico, PoC proporciona implementaciones dedicadas ( sync_Bits) para Xilinx y Altera FPGA para mejorar el comportamiento de metaestabilidad. El sincronizador 2-FF se usa, por ejemplo, sync_Strobepara construir sincronizadores más complejos para pulsos.
Gracias por la elaborada introducción a las estrategias de sincronización. Esta imagen proviene de "Técnicas de verificación y diseño de cruce de dominio de reloj (CDC) usando systemverilog" de Clifford E. Cummings. Entiendo que para una señal de un bit, el ancho debe ser de al menos 1 ciclo de reloj + tiempo de configuración + tiempo de espera del lado receptor para que pase de manera segura. En esta imagen, este criterio no se cumple ya que el pulso de adat se muestrea con muestras de bclk solo una vez en su flanco descendente, lo que hace que bq1_dat sea metaestable.
... Como resultado, la lectura de bq1_dat en el siguiente flanco ascendente de bclk podría ser '0' o '1'. Entonces, la sincronización en la imagen parece no tener éxito. ¿Tengo razón?
@Paebbels Gracias por la referencia. Echaré un vistazo =)
Debe editar esto en su pregunta, no publicarlo como una respuesta, pero esencialmente, sí, puede o no obtener un 1 en la salida de ese ejemplo.

1) Usando su dibujo como ejemplo, aclk y bclk son asincrónicos entre sí. En otras palabras, tienen diferentes fuentes de reloj. Muestran adat como datos válidos pero sincronizados solo con aclk. Aquí es donde entra en juego el sincronizador bclk.

2) Este dibujo asume el peor de los casos, donde bq1_dat es una salida desordenada porque bq1 FF capturó solo una parte del final de los datos, creando un estado metaestable en el que la salida suele ser basura. Aquí está el truco. Bq2 tiene el mismo bclk que bq1, pero se necesitan 2 ciclos de reloj de bclk para que los datos pasen y aparezcan en bq2_dat.

3) El primer bclk capturó parte de los datos, lo que resultó en una salida desordenada, pero el segundo bclk es un ciclo de reloj más tarde, tiempo suficiente para que los datos ambiguos de bq1_dat se asienten en un estado alto o bajo. El desordenado pulso bq1_dat duró lo suficiente para que bq2 capturara un '1' lógico válido (nivel lógico alto) y lo pasara a bq2_dat como datos válidos y ahora sincronizados (nivel lógico alto).

4) Aguas abajo, cualquier reloj que use bclk tendrá datos sincronizados para trabajar. Tenga en cuenta que solo el primer bclk FF tuvo que lidiar con un estado metaestable . La salida podría haber sido lógicamente baja si adat hubiera sido solo pico o nano segundos demasiado tarde. Recuerde que estos flip-flops muestrean la entrada de datos solo en el flanco ascendente del reloj. Se ignora lo que sucede antes o después del flanco ascendente.

Sin embargo, tenga en cuenta que el retraso bclk solo proporciona una medida probabilística de seguridad, y la cantidad exacta depende tanto de la tecnología FF como del período bclk. En algunos casos de alta fidelidad, se pueden requerir 3 o incluso más etapas para reducir la tasa de error a niveles aceptables.
@QuéRoughBeast. Sé que en el peor de los casos se necesitan muchas etapas de sincronización, además de filtrado digital. Obviamente mi respuesta fue demasiado simple.
@ Sparky256 Lo que me desconcierta es 3) en tu comentario. ¿Cómo puede bq2 capturar un '1' cuando bq1_dat está en estado metaestable?
@fiedel, dos cosas contribuyen a que bq2 pueda capturar una entrada limpia (al menos). Primero, el estado metaestable debe persistir durante un ciclo de reloj completo. En segundo lugar, es poco probable (u optimizado para evitar) que el valor metaestable (pseudo-riel medio) de bq1 esté en la ventana que también haría que bq2 sea metaestable, pero es principalmente el primero de estos. Digamos que la tecnología da como resultado un 5% de posibilidades de que la metaestabilidad persista el tiempo suficiente. una etapa de sincronización 3-FF reduciría esto a 0.25% porque ambas celdas tienen que fallar. Desordenado es en la práctica una desviación exponencial bien definida del estado casi estable.
@SeanHoulihane. Gracias por la explicación. El término 'flanco ascendente' confunde a algunos porque la ventana de aceptación de datos (metaestable o estable) está en el punto medio del flanco ascendente, y dura solo unos pocos pico o nanosegundos. Solo en ese instante los datos de entrada están en un '1' o '0' lógico, ya sea metaestable o estable, dependiendo de su nivel de voltaje en comparación con el umbral del IC para 1 o 0 lógico.