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.

KenmerkSynchronisator met 2 flip-flopsToggle-synchronisatorHandshakeAsynchrone FIFO
Wat hij kan overbrengenEen levelsignaal van 1 bit (een langzaam veranderend stuursignaal)Een puls van 1 bit (een gebeurtenis)Data van meerdere bits, woord voor woord, af en toeEen stroom data van meerdere bits (continu, grote hoeveelheden)
WerkingVoert 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 overneemtZet 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 kopieHoudt de data vast, voert req door een synchronisator, en stuurt ack via een synchronisator terug zodra de ontvanger de data heeft overgenomenSchrijft in een dual-portgeheugen en synchroniseert Gray-gecodeerde pointers naar het andere domein om vol en leeg te bepalen
Signalen die worden gesynchroniseerdHet signaal zelfHet togglesignaal (1 bit)req en ack (elk 1 bit); de data wordt niet gesynchroniseerdGray-gecodeerde pointers (per stap verandert maar 1 bit)
DoorvoerHet signaal moet veel langzamer veranderen dan de periode van de ontvangende klokPulsen moeten verder uit elkaar liggen dan de paar ontvangende klokcycli die nodig zijn om elke verandering te detecterenTraag: één overdracht met 4 fasen kost 8 of meer cycli over beide domeinenSnel: elke cyclus kan één woord worden geschreven en gelezen
Typische latentie tot de ontvangerOngeveer 2 cycli van de ontvangende klokOngeveer 2 tot 3 cycli van de ontvangende klokOngeveer 2 cycli tot req aankomt; het volgende woord verzenden moet ook wachten tot ack terug isOngeveer 2 tot 3 cycli tot een geschreven woord aan de leeskant zichtbaar is
Belangrijkste valkuilenGebruikt op data van meerdere bits kunnen bits in verschillende cycli worden overgenomen en verschijnt een tussenwaarde; korte pulsen uit een sneller domein kunnen verloren gaanKomen pulsen te dicht op elkaar, dan keert het togglesignaal terug naar zijn oude waarde en worden twee gebeurtenissen gemistDe data mag niet veranderen tot ack terugkomtDe diepte wordt bepaald uit de burstlengte en het verschil tussen schrijf- en leessnelheid, plus marge voor de synchronisatievertraging
Schakelingsgrootte2 flip-flops (soms 3 trappen bij snelle klokken)Een paar flip-flops en een XORreq/ack-synchronisatoren en toestandsmachines aan beide kantenGeheugen, pointers met Gray-codeconversie, synchronisatoren en logica voor vol/leeg
Typische toepassingenStuursignalen zoals enables, asynchrone externe ingangenMeldingen van voltooiing of interrupts die in een snel domein maar één cyclus durenWaarden van configuratieregisters doorgevenDataoverdracht tussen bussen of interfaces die op verschillende klokken draaien

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Synchronisator met 2 flip-flops
Voor een levelsignaal van 1 bit dat veel langer stabiel blijft dan de periode van de ontvangende klok. Hij is de bouwsteen van alle andere methoden; gebruik 3 trappen als de klok snel is of een langere MTBF nodig is.
Toggle-synchronisator
Wanneer een korte puls in een snel domein een trager domein moet bereiken zonder verloren te gaan, op voorwaarde dat opeenvolgende pulsen verder uit elkaar liggen dan een paar ontvangende cycli.
Handshake
Wanneer data van meerdere bits, zoals configuratiewaarden, af en toe betrouwbaar moet worden doorgegeven. Hij is veilig bij elke frequentieverhouding, maar elke overdracht kost veel cycli.
Asynchrone FIFO
Wanneer data continu of met hoge snelheid moet worden doorgegeven. Hij vangt snelheidsverschillen en bursts op, maar is de grootste schakeling van de vier.

Veelgestelde vragen

Waarom niet op elke bit van data van meerdere bits een synchronisator met 2 flip-flops zetten?

Omdat per bit onbepaald is of een verandering bij deze flank of bij de volgende wordt overgenomen. Verandert de waarde bijvoorbeeld van 0111 naar 1000, dan kan de ontvanger één cyclus lang 1111 of 0000 zien, met maar een deel van de bits bijgewerkt. Laat in plaats daarvan de data zelf ongesynchroniseerd en stabiel en synchroniseer alleen een stuursignaal van 1 bit (een handshake), of gebruik een asynchrone FIFO. Voor tellerwaarden is een andere mogelijkheid ze naar Gray-code om te zetten, zodat er telkens maar één bit verandert.

Wat verandert er als een synchronisator van 2 naar 3 trappen gaat?

De tijd die metastabiliteit heeft om op te lossen, neemt met ongeveer één klokperiode toe, en de gemiddelde tijd tussen storingen (MTBF) groeit exponentieel. De MTBF is ruwweg e^(t_r/τ) ÷ (T_0 × f_clk × f_data); met τ = 20 ps vermenigvuldigt 1 ns extra voor t_r de MTBF met e^50 (meer dan 10 tot de 21e macht). De prijs is één cyclus extra latentie.

Waarom worden de pointers van een asynchrone FIFO naar Gray-code omgezet?

Omdat een binaire pointer meerdere bits tegelijk kan veranderen, zoals van 0111 naar 1000, en het afzonderlijk synchroniseren van de bits een volledig ongerelateerde waarde kan opleveren. In Gray-code verandert per stap maar één bit, dus zelfs als die bit metastabiel wordt en naar een van beide kanten uitvalt, is het resultaat de waarde vóór of na de stap. De ontvanger ziet alleen een iets oudere waarde, dus de beslissingen over vol en leeg vallen naar de veilige kant uit.

Hoe wordt de diepte van een asynchrone FIFO gekozen?

Uit de grootste hoeveelheid die zich tijdens een schrijfburst opstapelt doordat het lezen niet kan bijhouden. Met een schrijfkant op 100 MHz en een leeskant op 80 MHz, een burst van 100 woorden die met één woord per cyclus wordt geschreven en met één woord per cyclus wordt gelezen, is de diepte 100 × (1 − 80/100) = 20 woorden. Echte ontwerpen voegen marge toe voor de synchronisatievertraging van de pointers.

Test uw begrip

Hoe verandert de gemiddelde tijd tussen storingen door metastabiliteit (MTBF) juist als een synchronisator met 2 flip-flops wordt uitgebreid tot 3 trappen?

  1. ADe tijd die beschikbaar is om de metastabiliteit te laten uitdoven neemt met ongeveer één periode toe, en de MTBF wordt exponentieel langer
  2. BDe MTBF wordt evenredig met het aantal trappen 1,5 keer zo groot
  3. CHoe makkelijk metastabiliteit optreedt, wordt aan de ingangskant bepaald, dus de MTBF verandert niet
Antwoord en toelichting tonen

Antwoord: A. De tijd die beschikbaar is om de metastabiliteit te laten uitdoven neemt met ongeveer één periode toe, en de MTBF wordt exponentieel langer

De MTBF van een synchronisator wordt bij benadering gegeven door MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data). Hierin is t_r de tijd die beschikbaar is om de metastabiliteit te laten uitdoven, en zijn τ en T_0 constanten die door de eigenschappen van de flip-flop worden bepaald. Een extra trap verlengt t_r met ongeveer één periode (precies: één periode min de uitgangsvertraging en de setuptijd van de flip-flop). Neemt t_r bijvoorbeeld bij τ = 20 ps met 1 ns toe, dan wordt de MTBF e^50 keer zo lang, oftewel meer dan 10^21 keer. De kans dat de eerste trap metastabiel wordt verandert niet, maar de kans dat de toestand uitdooft voordat hij verder doorloopt, neemt sterk toe.

Elke bit van 4-bit data krijgt een eigen synchronisator met 2 trappen en wordt zo naar een ander klokdomein doorgegeven. Welk probleem kan juist optreden als de data van 0111 naar 1000 verandert?

  1. ADe cyclus waarin wordt overgenomen verschilt per bit, waardoor tussenwaarden zoals 1111 of 0000 kunnen worden ontvangen
  2. BNa de synchronisator lopen alle bits in dezelfde cyclus gelijk, dus er ontstaat geen probleem
  3. CAlle 4 bits worden metastabiel en keren niet meer terug naar 0 of 1
Antwoord en toelichting tonen

Antwoord: A. De cyclus waarin wordt overgenomen verschilt per bit, waardoor tussenwaarden zoals 1111 of 0000 kunnen worden ontvangen

Bij een synchronisator met 2 trappen ligt per bit niet vast of de verandering op deze flank of op de volgende wordt overgenomen. Bij de verandering van 0111 naar 1000 veranderen alle 4 bits, dus kan gedurende 1 cyclus een waarde zoals 1111, 0000 of 0100 worden ontvangen waarin slechts een deel van de bits de nieuwe waarde heeft. Gebruikt de ontvanger die waarde, dan werkt hij fout. Metastabiliteit dooft na verloop van tijd uit tot 0 of 1. Bij tellerwaarden wordt omgezet naar Gray-code zodat maar één bit verandert; bij willekeurige data worden een handshake of een asynchrone FIFO gebruikt.

Wat is bij toggle-synchronisatie (een methode waarbij aan de verzendende kant een niveausignaal wordt gemaakt dat bij elke puls omklapt, en dat wordt doorgegeven) de juiste manier om aan de ontvangende kant de oorspronkelijke puls terug te winnen?

  1. AHet gesynchroniseerde togglesignaal direct als puls gebruiken
  2. BEen AND van het gesynchroniseerde togglesignaal en de ontvangende klok nemen om een puls van 1 cyclus breed te maken
  3. CEen XOR nemen van het gesynchroniseerde togglesignaal en hetzelfde signaal nog een trap vertraagd
Antwoord en toelichting tonen

Antwoord: C. Een XOR nemen van het gesynchroniseerde togglesignaal en hetzelfde signaal nog een trap vertraagd

Bij toggle-synchronisatie wordt aan de verzendende kant bij elke puls de waarde van een flip-flop omgekeerd, zodat een gebeurtenis wordt weergegeven als een verandering van 0 naar 1 of van 1 naar 0. Omdat het een niveausignaal is, gaat het ook bij pulsen korter dan de periode aan de ontvangende kant niet verloren. Aan de ontvangende kant wordt na synchronisatie met 2 trappen een XOR genomen met de waarde die nog een trap is vertraagd; dat levert een puls van 1 cyclus breed op die alleen 1 is in de cyclus waarin een verandering plaatsvond. Wordt het togglesignaal direct gebruikt, dan wordt de tweede gebeurtenis gemist wanneer het terugkeert naar 0. Logische bewerkingen met de klok veroorzaken glitches.

  1. Wat is juist een nadeel van dataoverdracht tussen klokdomeinen met een handshake?
  2. Wat is de juiste reden waarom in een asynchrone FIFO de schrijf- en leespointer naar Gray-code worden omgezet voordat ze naar het andere domein worden gesynchroniseerd?
  3. In een asynchrone FIFO met 100 MHz aan de schrijfkant en 80 MHz aan de leeskant schrijft de schrijfkant bursts van 100 woorden, elke cyclus 1 woord, en leest de leeskant elke cyclus 1 woord. Tussen de bursts is er voldoende rust. Wat is de minimale diepte om overlopen te voorkomen (vertraging door synchronisatie wordt genegeerd)?

Oefenvragen over Timinganalyse en CDC

Belangrijke termen uitgelegd

Synchronisator
Schakeling die een asynchroon signaal uitlijnt op de ontvangende klok. De basisvorm bestaat uit twee flipflops in serie, wat de kans vergroot dat metastabiliteit in de eerste trap is opgelost vóór de volgende flank.
Toggle-synchronisator
Schema dat elke puls aan de zendende kant omzet in een omklapping van een niveausignaal, dit synchroniseert en aan de ontvangende kant een puls terugwint door een XOR met de waarde van één cyclus eerder. Pulsen korter dan de ontvangende klokperiode gaan niet verloren, maar pulsen moeten enkele ontvangende cycli uit elkaar liggen.
Handshake
Schema dat data betrouwbaar overdraagt door een verzoek (req) van de zender en een bevestiging (ack) van de ontvanger uit te wisselen. Tussen klokdomeinen worden alleen req en ack gesynchroniseerd terwijl de data stabiel wordt gehouden; dat is veilig, maar kost enkele cycli of meer per overdracht.
Asynchrone FIFO
FIFO die op aparte klokken wordt beschreven en gelezen, gebruikt om meerbitsdata tussen klokdomeinen door te geven. De pointers worden naar Gray-code omgezet voordat ze in het andere domein worden gesynchroniseerd om vol (full) en leeg (empty) te bepalen. De pointers hebben één bit meer dan het adres om het rondlopen (wrap-around) te onderscheiden.
Klokdomein
Groep flipflops die door dezelfde klok worden aangestuurd, of door klokken met een vaste frequentie- en faserelatie. Een signaal doorgeven tussen klokdomeinen die onderling asynchroon zijn, vereist een synchronisator.
Metastabiliteit
Toestand waarin de uitgang van een flipflop enige tijd noch 0 noch 1 is, doordat de setup- of holdtijd niet is gehaald. Als maatregel worden asynchrone signalen met een tweetraps-flipflop gesynchroniseerd.
Gray-code
Code waarbij tussen aangrenzende waarden slechts één bit verandert. Wordt gebruikt om leesfouten te voorkomen bij roterende encoders en bij het doorgeven van tellerwaarden tussen verschillende klokdomeinen.
MTBF (gemiddelde tijd tussen storingen)
Gemiddelde tijd tussen storingen. Voor een synchronisator is het de gemiddelde tijd tussen metastabiele gebeurtenissen die niet worden opgelost en worden doorgegeven, gegeven door MTBF = e^(t_r/τ) ÷ (T_0 × f_clk × f_data). Extra trappen verlengen de oplostijd t_r en verhogen de MTBF exponentieel.

Verwante vergelijkingen