11 votos

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

El uso de sincronizadores 2ff ha sido un estándar para que una señal cruce los límites del reloj. Y hay muchos documentos/figuras que ilustran el mecanismo, como este: enter image description here

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


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

enter image description here

ps: El estado metaestable no muestra una forma de onda "errante", sino un nivel que no es ni '1' ni '0'. La siguiente figura muestra un ejemplo de salida metaestable. enter image description here

La cifra original procede de Notas de clase para EE108A, Clase 13: Metastability and Synchronization Failure (ow When Good Flip-Flops go Bad) por W. J. Dally.

10voto

Tom Carpenter Puntos 7192

La respuesta sencilla es que no lo hacen por sí solos. El sincronizador no está ahí para asegurar que los datos se transmitan, sino para asegurar que no se produzcan señales metaestables que alimenten otras señales y causen problemas. El segundo FF, como muestra el diagrama, atrapa la salida del primer FF metaestable y evita que se propague por el diseño.

Hay varios tipos de señales, y la forma de incluir los sincronizadores depende de la señal de que se trate. 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 poner en marcha algo más. Generalmente no llevan datos, y todo lo que te interesa es que haya, por ejemplo, un flanco ascendente para iniciar algo en otro dominio de reloj. Para conseguir que se crucen, necesitarías un sincronizador (que esencialmente hace lo que se muestra en tu diagrama), pero necesitas un poco más.

    La opción más simple es extender el pulso - esencialmente se asegura que el pulso de entrada sea más de 1 periodos de reloj del reloj de destino (debe ser más largo que 1 ciclo por al menos el mayor de los tiempos de preparación y retención del registro de destino). Por ejemplo, si vas a pasar de un reloj de 20MHz a un reloj de 15MHz, te asegurarías de que tu pulso tiene dos ciclos de reloj en la entrada, lo que garantizaría que se presenta al reloj de destino y no se pierde. Esto también responde a tu pregunta en cuanto a cómo se garantiza que la señal atraviese. Si el pulso es más amplio que un período de reloj de destino significa que si va metaestable en el primer flanco de reloj y termina siendo visto como un 0, entonces en el segundo flanco de reloj definitivamente atrapará el pulso.

    Como con este tipo de señal sólo te interesa que el pulso haya llegado, no importa si la señal de salida termina con dos ciclos de reloj altos algunas veces y sólo un ciclo el resto. Si necesitas asegurarte de que es un pulso de un solo ciclo, puedes instanciar un simple circuito detector de bordes.

  2. Autobuses de control - o posiblemente tipos de buses de datos. Estos son posiblemente más difíciles porque si tienes un flujo de datos de varios bits que necesita permanecer sincronizado. En este caso lo que harías es implementar algo llamado "handshaking". Básicamente, cargas tus datos en el reloj de origen y los mantienes. Entonces envías una señal de petición (como en 1) a través de un sincronizador. Una vez que la señal de petición ha pasado, sabes que el bus de datos también se estabilizará en el dominio de destino. A continuación, puedes introducirla en un banco de registros en el destino. El destino envía entonces un pulso de confirmación para informar a la fuente de que puede cargar la siguiente palabra.

    Utilizarías este tipo de bus si necesitaras enviar una palabra de control al reloj de destino para la que necesitas saber que ha llegado allí antes de enviar otra (por ejemplo, si estás enviando una orden para hacer algo).

  3. Buses de datos - para los datos en los que se tiene una fuente que escupe datos de forma continua o en ráfagas, podría decirse que es mejor utilizar un FIFO que los sincronizadores. El FIFO utiliza una memoria de doble reloj para mantener los datos, junto con contadores para llevar la cuenta de cuántos datos hay en el FIFO. Los datos se escriben en el FIFO cuando hay espacio, y luego se incrementa la dirección de escritura. Esta dirección se suele codificar en un esquema de "codificación gris" que garantiza que cada incremento de la dirección sólo cause un bit en el bus de direcciones para cambiar (lo que significa que no es necesario sincronizar varios bits). Esta dirección se transfiere entonces al dominio de destino (a través de una de sus cadenas de sincronización), donde se compara con la dirección de lectura. Si hay datos en el FIFO, entonces se puede leer de la memoria utilizando el puerto de reloj de destino. La dirección de lectura se codifica de forma similar en Gray y se envía de vuelta al origen a través de otro sincronizador para que el puerto de escritura pueda calcular si hay espacio en el FIFO.

  4. Señales de reinicio - Estos suelen utilizar una versión modificada del sincronizador en lo que se conoce como "Asynchronous Assert, Synchronous Deassert". En esta versión modificada, la entrada de datos al primer flip-flop está ligada a GND, y en su lugar la señal de reset entrante está conectada a las señales de preajuste asíncronas de cada flip-flop en el sincronizador. Esto da como resultado una señal de salida que es totalmente asíncrona cuando se pone a nivel alto, pero la cadena del sincronizador se asegura de que se ponga a nivel bajo de forma síncrona con el reloj de destino mediante la sincronización a través de ceros en la cadena de registros.

    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 en las entradas de reset asíncronas de cualquier registro del dominio, entonces hay poca preocupación de metaestabilidad en la afirmación (aunque sea asíncrona) ya que todos los registros son forzados a un estado conocido. Entonces, cuando la señal de reinicio se desanima en el dominio de origen, se desanima de forma sincrónica 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 se desanima de forma asincrónica).


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

1voto

user21359 Puntos 133

1) Utilizando tu dibujo como ejemplo, aclk y bclk son asíncronos entre sí. En otras palabras, tienen diferentes fuentes de reloj. Están mostrando adat como datos válidos pero sincronizados sólo con aclk. Aquí es donde el sincronizador bclk entra en juego.

2) Este dibujo asume el peor de los casos, en el que bq1_dat es una salida desordenada porque el bq1 FF capturó sólo 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, resultando 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 establezcan en un estado alto o bajo. El pulso desordenado de bq1_dat duró lo suficiente para que bq2 capturara un '1' lógico válido (lógico alto), y lo pasara a bq2_dat como datos válidos y ahora sincronizados (lógico alto).

4) En sentido descendente, cualquier reloj que utilice bclk tendrá datos sincronizados con los que trabajar. Obsérvese que sólo el primer bclk FF tuvo que lidiar con un estado metaestable . La salida podría haber sido una lógica baja si adat se hubiera retrasado sólo pico o nano segundos. Recuerde que estos flip-flops muestrean la entrada de datos sólo en el flanco ascendente del reloj. Lo que ocurre antes o después del flanco de subida se ignora.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X