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ère | Synchroniseur à 2 bascules | Synchroniseur toggle | Handshake | FIFO asynchrone |
|---|---|---|---|---|
| Ce qu’il transporte | Un 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 temps | Un flux de données de plusieurs bits (continu, en grand volume) |
| Fonctionnement | Fait 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 signal | Transforme 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 étage | Maintient 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és | Le signal lui-même | Le signal toggle (1 bit) | req et ack (1 bit chacun) ; les données ne sont pas synchronisées | Les pointeurs codés en Gray (1 seul bit change par pas) |
| Débit | Le signal doit varier beaucoup plus lentement que la période de l’horloge de réception | Les impulsions doivent être espacées de plus que les quelques cycles de réception nécessaires pour détecter chaque changement | Lent : un transfert en 4 phases prend 8 cycles ou plus sur les deux domaines | Rapide : un mot peut être écrit et lu à chaque cycle |
| Latence typique jusqu’au récepteur | Environ 2 cycles de l’horloge de réception | Environ 2 à 3 cycles de l’horloge de réception | Environ 2 cycles pour que req arrive ; l’envoi du mot suivant doit aussi attendre le retour d’ack | Environ 2 à 3 cycles avant qu’un mot écrit soit visible côté lecture |
| Principaux pièges | Utilisé 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 perdues | Si les impulsions sont trop rapprochées, le signal toggle revient à son ancienne valeur et deux événements sont manqués | Les données ne doivent pas changer avant le retour d’ack | La 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 circuit | 2 bascules (parfois 3 étages pour les horloges rapides) | Quelques bascules et un XOR | Synchroniseurs req/ack et machines à états des deux côtés | Mémoire, pointeurs avec conversion en code de Gray, synchroniseurs et logique plein/vide |
| Usages typiques | Signaux de contrôle comme les signaux de validation (enable), entrées externes asynchrones | Notifications de fin ou d’interruption qui ne durent qu’un cycle dans un domaine rapide | Transmission des valeurs de registres de configuration | Transfert 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.