Synchroniseur à 2 bascules vs synchroniseur toggle vs handshake vs FIFO asynchrone : méthodes de franchissement de domaine d’horloge

Entre des domaines d’horloge asynchrones, il y a toujours des instants où la bascule de réception ne peut pas respecter son temps de setup ou de hold : les signaux passent donc par des circuits conçus en supposant que la métastabilité se produira. Le circuit de base est le synchroniseur, qui reçoit un signal de niveau de 1 bit à travers deux bascules. Un synchroniseur toggle transporte des impulsions courtes, un handshake des données de plusieurs bits de temps en temps, et une FIFO asynchrone des données continues en grand volume. Tous partagent la même idée : on ne synchronise jamais qu’un signal de 1 bit, ou un code de Gray qui ne change que d’un bit par pas.

CritèreSynchroniseur à 2 basculesSynchroniseur toggleHandshakeFIFO asynchrone
Ce qu’il transporteUn signal de niveau de 1 bit (un signal de contrôle qui varie lentement)Une impulsion de 1 bit (un événement)Des données de plusieurs bits, un mot à la fois, de temps en tempsUn flux de données de plusieurs bits (continu, en grand volume)
FonctionnementFait passer le signal par deux bascules cadencées par l’horloge de réception, ce qui laisse à une éventuelle métastabilité du premier étage le temps de se résoudre avant que le second ne capture le signalTransforme chaque impulsion, côté émission, en un niveau qui bascule, le synchronise, puis restitue l’impulsion côté réception par un XOR avec une copie retardée d’un étageMaintient les données, fait passer req par un synchroniseur et, une fois les données capturées par le récepteur, renvoie ack par un synchroniseurÉcrit dans une mémoire double port et synchronise vers l’autre domaine des pointeurs codés en Gray pour décider de l’état plein ou vide
Signaux synchronisésLe signal lui-mêmeLe signal toggle (1 bit)req et ack (1 bit chacun) ; les données ne sont pas synchroniséesLes pointeurs codés en Gray (1 seul bit change par pas)
DébitLe signal doit varier beaucoup plus lentement que la période de l’horloge de réceptionLes impulsions doivent être espacées de plus que les quelques cycles de réception nécessaires pour détecter chaque changementLent : un transfert en 4 phases prend 8 cycles ou plus sur les deux domainesRapide : un mot peut être écrit et lu à chaque cycle
Latence typique jusqu’au récepteurEnviron 2 cycles de l’horloge de réceptionEnviron 2 à 3 cycles de l’horloge de réceptionEnviron 2 cycles pour que req arrive ; l’envoi du mot suivant doit aussi attendre le retour d’ackEnviron 2 à 3 cycles avant qu’un mot écrit soit visible côté lecture
Principaux piègesUtilisé sur des données de plusieurs bits, les bits peuvent être capturés à des cycles différents et une valeur intermédiaire apparaît ; des impulsions courtes venant d’un domaine plus rapide peuvent être perduesSi les impulsions sont trop rapprochées, le signal toggle revient à son ancienne valeur et deux événements sont manquésLes données ne doivent pas changer avant le retour d’ackLa profondeur se fixe à partir de la longueur des rafales et de l’écart entre débits d’écriture et de lecture, plus une marge pour le retard de synchronisation
Taille du circuit2 bascules (parfois 3 étages pour les horloges rapides)Quelques bascules et un XORSynchroniseurs req/ack et machines à états des deux côtésMémoire, pointeurs avec conversion en code de Gray, synchroniseurs et logique plein/vide
Usages typiquesSignaux de contrôle comme les signaux de validation (enable), entrées externes asynchronesNotifications de fin ou d’interruption qui ne durent qu’un cycle dans un domaine rapideTransmission des valeurs de registres de configurationTransfert de données entre bus ou interfaces cadencés par des horloges différentes

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Synchroniseur à 2 bascules
Pour un signal de niveau de 1 bit qui reste stable bien plus longtemps que la période de l’horloge de réception. C’est la brique de base de toutes les autres méthodes ; on utilise 3 étages si l’horloge est rapide ou si une MTBF plus longue est nécessaire.
Synchroniseur toggle
Lorsqu’une impulsion courte d’un domaine rapide doit atteindre un domaine plus lent sans être perdue, à condition que les impulsions successives soient espacées de plus de quelques cycles de réception.
Handshake
Lorsque des données de plusieurs bits, comme des valeurs de configuration, doivent être transmises de façon fiable de temps en temps. Il est sûr quel que soit le rapport des fréquences, mais chaque transfert prend de nombreux cycles.
FIFO asynchrone
Lorsque des données doivent être transmises en continu ou à haut débit. Elle absorbe les écarts de débit et les rafales, mais c’est le plus gros circuit des quatre.

Questions fréquentes

Pourquoi ne pas mettre un synchroniseur à 2 bascules sur chaque bit de données de plusieurs bits ?

Parce que, pour chaque bit, on ne sait pas si un changement est capturé à ce front ou au suivant. Par exemple, quand la valeur passe de 0111 à 1000, le récepteur peut voir 1111 ou 0000 pendant un cycle, avec seulement une partie des bits mise à jour. On garde plutôt les données elles-mêmes non synchronisées et stables, et l’on ne synchronise qu’un signal de contrôle de 1 bit (un handshake), ou bien on utilise une FIFO asynchrone. Pour des valeurs de compteur, une autre solution consiste à les convertir en code de Gray pour qu’un seul bit change à la fois.

Que change le passage d’un synchroniseur de 2 à 3 étages ?

Le temps disponible pour que la métastabilité se résolve augmente d’environ une période d’horloge, et le temps moyen entre défaillances (MTBF) croît exponentiellement. La MTBF vaut à peu près e^(t_r/τ) ÷ (T_0 × f_clk × f_data) ; avec τ = 20 ps, ajouter 1 ns à t_r multiplie la MTBF par e^50 (plus de 10 puissance 21). Le prix est un cycle de latence supplémentaire.

Pourquoi les pointeurs d’une FIFO asynchrone sont-ils convertis en code de Gray ?

Parce qu’un pointeur binaire peut changer plusieurs bits à la fois, par exemple de 0111 à 1000, et que synchroniser les bits séparément peut produire une valeur sans aucun rapport. En code de Gray, un seul bit change par pas : même si ce bit devient métastable et se résout dans un sens ou dans l’autre, le résultat est la valeur d’avant ou d’après le pas. Le récepteur voit seulement une valeur un peu ancienne, si bien que les décisions plein et vide penchent du côté sûr.

Comment choisit-on la profondeur d’une FIFO asynchrone ?

D’après la plus grande quantité qui s’accumule pendant une rafale d’écriture parce que la lecture ne suit pas. Avec une écriture à 100 MHz et une lecture à 80 MHz, une rafale de 100 mots écrite à raison d’un mot par cycle et lue à raison d’un mot par cycle, la profondeur vaut 100 × (1 − 80/100) = 20 mots. Les conceptions réelles ajoutent une marge pour le retard de synchronisation des pointeurs.

Vérifier vos connaissances

Lorsqu'on passe un synchroniseur à 2 bascules à 3 étages, comment évolue le temps moyen entre défaillances (MTBF) dues à la métastabilité ?

  1. ALe temps disponible pour la résolution de la métastabilité augmente d'environ une période, et le MTBF s'allonge de façon exponentielle
  2. BLe MTBF est multiplié par 1,5, proportionnellement au nombre d'étages
  3. CLa probabilité de métastabilité est déterminée côté entrée, donc le MTBF ne change pas
Afficher la réponse et l'explication

Réponse : A. Le temps disponible pour la résolution de la métastabilité augmente d'environ une période, et le MTBF s'allonge de façon exponentielle

Le MTBF d'un synchroniseur s'exprime approximativement par MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data). t_r est le temps disponible pour la résolution de la métastabilité, et τ et T_0 sont des constantes déterminées par les caractéristiques de la bascule. Ajouter un étage allonge t_r d'environ une période (plus précisément, une période moins le délai de sortie de la bascule et le temps de setup). Par exemple, avec τ = 20 ps, si t_r augmente de 1 ns, le MTBF est multiplié par e^50, soit plus de 10^21. La probabilité que le 1er étage devienne métastable ne change pas, mais la probabilité que l'état se résolve avant de se propager plus loin augmente fortement.

Chaque bit d'une donnée de 4 bits a été transmis vers un autre domaine d'horloge via son propre synchroniseur à 2 étages. Lorsque la donnée passe de 0111 à 1000, quel problème peut survenir ?

  1. ALes cycles de capture diffèrent d'un bit à l'autre, et l'on peut recevoir une valeur intermédiaire comme 1111 ou 0000
  2. BLe passage par les synchroniseurs aligne tous les bits sur le même cycle, donc aucun problème ne survient
  3. CLes 4 bits deviennent tous métastables et ne reviennent plus ni à 0 ni à 1
Afficher la réponse et l'explication

Réponse : A. Les cycles de capture diffèrent d'un bit à l'autre, et l'on peut recevoir une valeur intermédiaire comme 1111 ou 0000

Pour chaque bit, un synchroniseur à 2 étages ne permet pas de savoir si le changement sera capturé au front courant ou au suivant. Lors du passage de 0111 à 1000, les 4 bits changent, si bien que l'on peut recevoir pendant 1 cycle 1111, 0000, 0100 ou une autre valeur où seuls certains bits ont pris la nouvelle valeur. Si le récepteur utilise cette valeur, il dysfonctionne. La métastabilité se résout en 0 ou en 1 avec le temps. Pour une valeur de compteur, on la convertit en code de Gray afin qu'un seul bit change ; pour des données quelconques, on utilise un handshake ou une FIFO asynchrone.

En synchronisation par toggle (on transmet un signal de niveau qui s'inverse côté émetteur à chaque impulsion), quelle est la bonne méthode pour récupérer l'impulsion d'origine côté récepteur ?

  1. AUtiliser directement comme impulsion le signal toggle synchronisé
  2. BFaire le AND du signal toggle synchronisé et de l'horloge de réception pour obtenir une impulsion d'un cycle
  3. CFaire le XOR du signal toggle synchronisé et de ce même signal retardé d'un étage supplémentaire
Afficher la réponse et l'explication

Réponse : C. Faire le XOR du signal toggle synchronisé et de ce même signal retardé d'un étage supplémentaire

En synchronisation par toggle, on inverse la valeur d'une bascule côté émetteur à chaque impulsion, et l'événement est représenté par un changement de 0 à 1 ou de 1 à 0. S'agissant d'un signal de niveau, il ne disparaît pas, même si l'impulsion est plus courte que la période de réception. Côté récepteur, après une synchronisation sur 2 étages, le XOR avec la valeur retardée d'un étage de plus donne une impulsion d'un cycle qui ne vaut 1 qu'au cycle où un changement a eu lieu. Utiliser directement le signal toggle ferait manquer le 2e événement, lorsqu'il revient à 0. Une opération logique avec l'horloge est source de glitchs.

  1. Quel est l'inconvénient correct du transfert de données entre domaines d'horloge par handshake ?
  2. Dans une FIFO asynchrone, quelle est la raison correcte pour laquelle on convertit les pointeurs d'écriture et de lecture en code de Gray avant de les synchroniser vers l'autre domaine ?
  3. Dans une FIFO asynchrone dont le côté écriture est à 100 MHz et le côté lecture à 80 MHz, le côté écriture écrit des rafales de 100 mots à raison d'un mot par cycle, et le côté lecture lit un mot par cycle. Il y a suffisamment de temps de repos entre les rafales. Quelle est la profondeur minimale nécessaire pour éviter tout débordement (le retard dû à la synchronisation est ignoré) ?

Questions d'entraînement sur Analyse temporelle et CDC

Termes clés expliqués

Synchroniseur
Circuit qui aligne un signal asynchrone sur l'horloge de réception. Sa forme de base comprend deux bascules en série, ce qui augmente la probabilité que la métastabilité du premier étage se résorbe avant le front suivant.
Synchroniseur toggle
Méthode qui transforme chaque impulsion côté émetteur en inversion d'un signal de niveau, synchronise ce signal, puis restitue une impulsion côté récepteur par un XOR avec sa valeur un cycle plus tôt. Les impulsions plus courtes que la période d'horloge de réception ne sont pas perdues, mais elles doivent être espacées de plusieurs cycles de réception.
Protocole de poignée de main (handshake)
Méthode qui transfère des données de façon fiable par l'échange d'une requête (req) de l'émetteur et d'un acquittement (ack) du récepteur. Entre domaines d'horloge, seuls req et ack sont synchronisés pendant que les données sont maintenues stables, ce qui est sûr mais demande plusieurs cycles ou plus par transfert.
FIFO asynchrone
FIFO écrite et lue sur des horloges distinctes, utilisée pour transmettre des données multibits entre domaines d'horloge. Ses pointeurs sont convertis en code de Gray avant d'être synchronisés dans l'autre domaine pour déterminer les états plein (full) et vide (empty). Les pointeurs ont un bit de plus que l'adresse pour distinguer le rebouclage.
Domaine d'horloge
Ensemble de bascules pilotées par la même horloge, ou par des horloges ayant une relation de fréquence et de phase fixe. Transmettre un signal entre des domaines d'horloge asynchrones l'un par rapport à l'autre nécessite un synchroniseur.
Métastabilité
État où, en cas de violation des temps de setup ou de hold d'une bascule, la sortie reste un moment indéterminée entre 0 et 1. On y remédie en synchronisant les signaux asynchrones par deux bascules en série.
Code de Gray
Code dans lequel un seul bit change entre deux valeurs consécutives. Utilisé dans les codeurs rotatifs et pour transférer des valeurs de compteur entre domaines d'horloge, afin d'éviter les erreurs de lecture.
MTBF (temps moyen entre défaillances)
Intervalle moyen entre défaillances. Pour un synchroniseur, c'est le temps moyen entre deux événements métastables qui ne se résorbent pas et se propagent, donné par MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data). Ajouter des étages allonge le temps de résolution t_r et augmente le MTBF exponentiellement.

Comparatifs associés