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:
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.
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.
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.
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:
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.
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).
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.
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.
sync_Bits
) para Xilinx y Altera FPGA para mejorar el comportamiento de metaestabilidad. El sincronizador 2-FF se usa, por ejemplo, sync_Strobe
para construir sincronizadores más complejos para pulsos.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.
david tweed
fidel
david tweed