¿Por qué el sincronizador doble por sí solo no es suficiente para la transferencia de varios bytes entre dos dominios de reloj?

Cuando se transfiere información de un bit entre dos dominios de reloj diferentes, usamos 2 flip-flops o sincronizadores dobles. Pero cuando transferimos señales de múltiples bits a través de dos dominios de reloj diferentes, ¿por qué los sincronizadores dobles por sí solos no son suficientes? ¿Por qué en este caso necesitamos señales especiales de apretón de manos/código gris, etc. junto con los flip-flops de doble sincronización que complican toda la configuración?

Múltiples bits implican una tasa de bits y, si esta tasa de bits no está suficientemente sincronizada (por algún medio), eventualmente habrá errores al recibir demasiados bits o perder bits.
Suponiendo que estamos hablando de buses: hay muchos recursos sobre el cruce de dominios de reloj, la metaestabilidad y sus implicaciones. Entonces, ¿hay algo específico con respecto a este tema y las explicaciones existentes que no está claro o simplemente le faltaron los términos de búsqueda correctos? Algunos recursos explican muy bien que incluso el sincronizador doble generalmente solo reduce las posibilidades de ser golpeado por una metaestabilidad, pero aún puede suceder. ¿O tal vez no está claro que cdc en realidad implica que no todas las señales que se cruzan se comportan de la misma manera/pueden mostrar diferentes características de retraso y estabilidad?

Respuestas (1)

Transferir un solo bit es simple. Tiene solo dos estados, y cuando ocurre una transición, solo puede estar en el estado anterior o en el nuevo estado. Por lo tanto, la ÚNICA preocupación es la metaestabilidad, y el sincronizador de dos flop normalmente es suficiente para solucionar este problema.

Sin embargo, un bus de múltiples bits tiene un problema adicional: al cruzar un límite de dominio de reloj, se puede percibir que diferentes bits cambian en diferentes bordes de reloj debido a pequeñas diferencias en los retrasos en la lógica y en el cableado. Algunos bits pueden volverse metaestables mientras que otros no, y pueden tardar diferentes cantidades de tiempo en resolverse. Ahora no tiene solo el estado anterior y el estado siguiente: puede tener cualquier cantidad de estados intermedios en los que solo algunos de los bits tienen sus nuevos valores, y algunos de los bits todavía tienen sus valores anteriores.

Este problema adicional de coherencia de datos es la razón por la que se requiere la lógica de protocolo de enlace adicional. Y es por eso que el FIFO asíncrono o de doble reloj es un componente clave en los sistemas digitales que involucran múltiples dominios de reloj: reúne todos los elementos necesarios en un paquete ordenado.

Esa es una buena explicación. Agregando a la respuesta de Dave, ahora, incluso después de usar el mecanismo FIFO para cargas útiles, el puntero (para la profundidad del FIFO) aún podría ser una señal de varios bits y el puntero de escritura (dominio del reloj de envío) debe sincronizarse para leer/recibir dominio del reloj Y aquí es donde el código Gray es útil donde cada transición (o incremento) está representada por un solo cambio de bit. De esta manera, el apretón de manos se puede reducir al problema de la sincronización (preocupación por la metaestabilidad y NO por la coherencia de los datos) un cambio de dos estados como se menciona en la primera parte de esta respuesta.
@RajeshS: Todo eso está integrado en el FIFO asíncrono de 2 relojes. Hay una discusión sobre el código Gray específicamente aquí .