Synchronisator met 2 flip-flops versus toggle-synchronisator versus handshake versus asynchrone FIFO: methoden voor clock domain crossing
Tussen asynchrone klokdomeinen zijn er altijd momenten waarop de ontvangende flip-flop zijn setup- of holdtijd niet haalt, dus signalen worden doorgegeven via schakelingen die zijn ontworpen in de veronderstelling dat metastabiliteit optreedt. De basis is de synchronisator, die een levelsignaal van 1 bit via twee flip-flops ontvangt. Een toggle-synchronisator brengt korte pulsen over, een handshake af en toe data van meerdere bits, en een asynchrone FIFO continue data in grote hoeveelheden. Ze delen allemaal één idee: alleen een signaal van 1 bit, of een Gray-code die per stap maar één bit verandert, wordt ooit gesynchroniseerd.
| Kenmerk | Synchronisator met 2 flip-flops | Toggle-synchronisator | Handshake | Asynchrone FIFO |
|---|---|---|---|---|
| Wat hij kan overbrengen | Een levelsignaal van 1 bit (een langzaam veranderend stuursignaal) | Een puls van 1 bit (een gebeurtenis) | Data van meerdere bits, woord voor woord, af en toe | Een stroom data van meerdere bits (continu, grote hoeveelheden) |
| Werking | Voert het signaal door twee flip-flops op de ontvangende klok, zodat eventuele metastabiliteit in de eerste trap tijd krijgt om op te lossen voordat de tweede trap het signaal overneemt | Zet elke puls aan de zendende kant om in een level dat omklapt, synchroniseert dat, en herstelt de puls aan de ontvangende kant met een XOR met een één trap vertraagde kopie | Houdt de data vast, voert req door een synchronisator, en stuurt ack via een synchronisator terug zodra de ontvanger de data heeft overgenomen | Schrijft in een dual-portgeheugen en synchroniseert Gray-gecodeerde pointers naar het andere domein om vol en leeg te bepalen |
| Signalen die worden gesynchroniseerd | Het signaal zelf | Het togglesignaal (1 bit) | req en ack (elk 1 bit); de data wordt niet gesynchroniseerd | Gray-gecodeerde pointers (per stap verandert maar 1 bit) |
| Doorvoer | Het signaal moet veel langzamer veranderen dan de periode van de ontvangende klok | Pulsen moeten verder uit elkaar liggen dan de paar ontvangende klokcycli die nodig zijn om elke verandering te detecteren | Traag: één overdracht met 4 fasen kost 8 of meer cycli over beide domeinen | Snel: elke cyclus kan één woord worden geschreven en gelezen |
| Typische latentie tot de ontvanger | Ongeveer 2 cycli van de ontvangende klok | Ongeveer 2 tot 3 cycli van de ontvangende klok | Ongeveer 2 cycli tot req aankomt; het volgende woord verzenden moet ook wachten tot ack terug is | Ongeveer 2 tot 3 cycli tot een geschreven woord aan de leeskant zichtbaar is |
| Belangrijkste valkuilen | Gebruikt op data van meerdere bits kunnen bits in verschillende cycli worden overgenomen en verschijnt een tussenwaarde; korte pulsen uit een sneller domein kunnen verloren gaan | Komen pulsen te dicht op elkaar, dan keert het togglesignaal terug naar zijn oude waarde en worden twee gebeurtenissen gemist | De data mag niet veranderen tot ack terugkomt | De diepte wordt bepaald uit de burstlengte en het verschil tussen schrijf- en leessnelheid, plus marge voor de synchronisatievertraging |
| Schakelingsgrootte | 2 flip-flops (soms 3 trappen bij snelle klokken) | Een paar flip-flops en een XOR | req/ack-synchronisatoren en toestandsmachines aan beide kanten | Geheugen, pointers met Gray-codeconversie, synchronisatoren en logica voor vol/leeg |
| Typische toepassingen | Stuursignalen zoals enables, asynchrone externe ingangen | Meldingen van voltooiing of interrupts die in een snel domein maar één cyclus duren | Waarden van configuratieregisters doorgeven | Dataoverdracht tussen bussen of interfaces die op verschillende klokken draaien |
De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.