Wie stellt der 2-ff-Synchronizer eine ordnungsgemäße Synchronisierung sicher?

Die Verwendung von 2-ff-Synchronisierern war ein Standard für ein Signal, um Taktgrenzen zu überschreiten. Und es gibt viele Papiere / Abbildungen, die den Mechanismus veranschaulichen, wie zum Beispiel diese:Geben Sie hier die Bildbeschreibung ein

Es scheint, dass bclk den Impuls von adat nur einmal abtasten kann (bei der zweiten ansteigenden Flanke von bclk ), was zu einer Ausgangsmetastabilität auf bq1_dat führt . Wie kann bq1_dat bei der nächsten aktiven Taktflanke "hoch" abgetastet werden?


Zusätzlich zu meiner Frage möchte ich hinzufügen, was ich denke, damit ein Signal sicher in eine andere Taktdomäne übertragen werden kann (angenommen, 2-FF reicht aus, um die MTBF-Anforderung zu erfüllen). Bitte korrigieren Sie mich, wenn Fehler auftreten.

Geben Sie hier die Bildbeschreibung ein

ps: Der metastabile Zustand zeigt keine "herumwandernde" Wellenform an, sondern einen Pegel, der weder "1" noch "0" ist. Die folgende Abbildung zeigt ein Beispiel für eine metastabile Ausgabe.Geben Sie hier die Bildbeschreibung ein

Die ursprüngliche Abbildung stammt aus Vorlesungsnotizen für EE108A, Vorlesung 13: Metastabilität und Synchronisationsfehler (ow, wenn gute Flip-Flops schlecht werden) von WJ Dally.

Ich möchte nur sagen, dass die Diagramme, die den metastabilen Ausgang "herumwandern" zeigen, äußerst irreführend sind. So sieht Metastabilität überhaupt nicht aus. Wenn ein FF metastabil wird, geht sein Ausgang auf eine einzelne, spezifische Zwischenspannung (der Wert hängt von der Implementierungstechnologie ab) und bleibt dort. Nach einer unvorhersehbaren Zeit schwingt die Spannung dann entweder hoch oder niedrig, und in welche Richtung sie geht, ist ebenfalls unvorhersehbar.
@Dave Tweed♦ Vielen Dank für den Kommentar. In fast allen Dokumenten, die ich über Metastabilität gelesen habe, sah ich die "herumwandernden" Wellenformen. Ich habe mich umgesehen und einen Beitrag gefunden ( Wenn ein Flip-Flop eine Setup-Verletzung hat und metastabil wird, wird es garantiert auf den Eingangswert einschwingen, wenn es mit dem Oszillieren fertig ist? ), der einen Schuss vom O-Scope mit erfasstem metastabilem Zustand enthält. Ein Link zur ursprünglichen Referenz der Abbildung ist in diesem Beitrag enthalten.
Ja, das veranschaulicht meinen Standpunkt perfekt, und die Powerpoint-Präsentation, aus der er stammt, enthält viele gute Informationen.

Antworten (2)

Die einfache Antwort ist, dass sie es nicht alleine tun. Der Synchronisierer soll nicht sicherstellen, dass die Daten übertragen werden, sondern dafür sorgen, dass Sie nicht mit metastabilen Signalen enden, die viele andere Signale speisen und Probleme verursachen. Wie das Diagramm zeigt, fängt der zweite FF den Ausgang des metastabilen ersten FF ab und verhindert, dass er sich weiter durch das Design ausbreitet.

Es gibt verschiedene Arten von Signalen, und wie Sie Synchronisierer einbeziehen, hängt davon ab, über welches Signal Sie sprechen. Aber schauen wir uns ein paar gängige Typen an:

  1. Triggersignale - oder jedes Signal, das im Grunde ein Impuls ist, der etwas anderes starten muss. Diese tragen im Allgemeinen keine Daten, und alles, was Sie interessiert, ist, dass es beispielsweise eine steigende Flanke gibt, um etwas in einem anderen Taktbereich zu starten. Um diese zum Überkreuzen zu bringen, benötigen Sie einen Synchronisierer (der im Wesentlichen das tut, was in Ihrem Diagramm gezeigt wird), aber Sie brauchen ein bisschen mehr.

    Die einfachste Option besteht darin, den Impuls zu verlängern - im Wesentlichen stellen Sie sicher, dass der Eingangsimpuls mehr als 1 Taktperiode des Zieltakts beträgt (er sollte mindestens um die größere der Setup- und Haltezeiten für das Zielregister länger als 1 Zyklus sein). . Wenn Sie beispielsweise von einem 20-MHz-Takt auf einen 15-MHz-Takt wechseln, stellen Sie sicher, dass Ihr Impuls am Eingang zwei Taktzyklen beträgt, wodurch sichergestellt wird, dass er dem Zieltakt zugeführt wird und nicht verloren geht. Dies beantwortet auch Ihre Frage, wie das Signal garantiert übertragen wird. Wenn der Impuls breiter als eine Zieltaktperiode ist, bedeutet dies, dass, wenn er bei der ersten Taktflanke metastabil wird und am Ende als 0 gesehen wird, er bei der zweiten Taktflanke definitiv den Impuls erfasst.

    Da Sie bei dieser Art von Signal nur daran interessiert sind, ob der Impuls angekommen ist, spielt es keine Rolle, ob das Ausgangssignal zeitweise mit zwei Taktzyklen hoch und den Rest nur mit einem Zyklus endet. Wenn Sie sicherstellen müssen, dass es sich um einen Einzelzyklusimpuls handelt, können Sie eine einfache Flankendetektorschaltung instanziieren.

  2. Steuerbusse - oder möglicherweise Arten von Datenbussen. Diese sind wohl schwieriger, denn wenn Sie einen Multibit-Datenstrom haben, der synchronisiert bleiben muss. In diesem Fall würden Sie etwas namens "Handshaking" implementieren. Sie laden Ihre Daten im Grunde auf die Quelluhr und halten sie. Dann senden Sie ein Anforderungssignal (wie in 1) über einen Synchronisierer. Sobald das Anforderungssignal anliegt, wissen Sie, dass der Datenbus auch in der Zieldomäne stabilisiert wird. Sie können es dann in eine Registerbank am Zielort stempeln. Das Ziel sendet dann erneut einen Bestätigungsimpuls zurück, um die Quelle darüber zu informieren, dass es das nächste Wort laden kann.

    Sie würden diese Art von Bus verwenden, wenn Sie ein Steuerwort an die Zieluhr senden müssten, für das Sie wissen müssen, dass es dort angekommen ist, bevor Sie ein anderes senden (z. B. wenn Sie einen Befehl senden, um etwas zu tun).

  3. Datenbusse - für Daten, bei denen Sie eine Quelle haben, die Daten kontinuierlich oder in Bursts ausspuckt, sind Sie wohl besser dran, einen FIFO als Synchronisierer zu verwenden. Der FIFO verwendet einen Dual-Clock-Speicher, um die Daten zusammen mit Zählern zu halten, um zu verfolgen, wie viele Daten sich im FIFO befinden. Sie schreiben die Daten in den FIFO, wenn Platz vorhanden ist, und inkrementieren dann die Schreibadresse. Diese Adresse wird dann typischerweise in ein "Gray Coding"-Schema codiert, das sicherstellt, dass jede Erhöhung der Adresse nur eine bewirktBit im Adressbus zu ändern (was bedeutet, dass Sie nicht mehrere Bits synchronisieren müssen). Diese Adresse wird dann an die Zieldomäne (über eine Ihrer Synchronizer-Ketten) übertragen, wo sie mit der gelesenen Adresse verglichen wird. Wenn sich Daten im FIFO befinden, können sie dann unter Verwendung des Zieltaktports aus dem Speicher ausgelesen werden. Die Leseadresse wird in ähnlicher Weise Gray-codiert und über einen anderen Synchronisierer an die Quelle zurückgesendet, so dass der Schreibport berechnen kann, ob im FIFO Platz ist.

  4. Reset-Signale – diese verwenden typischerweise eine modifizierte Version des Synchronizers in dem, was als „Asynchronous Assert, Synchronous Deassert“ bekannt ist. In dieser modifizierten Version ist der Dateneingang des ersten Flip-Flops mit GND verbunden, und stattdessen ist das ankommende Rücksetzsignal mit asynchronen voreingestellten Signalen jedes Flip-Flops im Synchronisierer verbunden. Dies führt zu einem Ausgangssignal, das völlig asynchron ist, wenn es auf High geht, aber die Synchronizer-Kette stellt sicher, dass es synchron mit dem Zieltakt auf Low geht, indem es Nullen in der Registerkette durchtaktet.

    Diese Art von Synchronizer ist schrecklich für Daten und Steuerung, aber perfekt geeignet, um Signale zurückzusetzen. Wenn die gesamte Ziellogik den Ausgang dieser Kette in die asynchronen Reset-Eingänge eines beliebigen Registers in der Domäne einspeist, gibt es beim Assertion wenig Bedenken hinsichtlich der Metastabilität (obwohl es asynchron ist), da alle Register in einen bekannten Zustand gezwungen werden. Wenn das Rücksetzsignal dann im Quellbereich deaktiviert wird, wird es im Zielbereich synchron deaktiviert, was bedeutet, dass alle Register im selben Taktzyklus aus dem Reset kommen (anstatt +/- 1 Zyklus, wenn es asynchron deaktiviert wurde).


Wie Sie oben sehen können, ist es viel komplexer, eine Taktdomänenkreuzung durchzuführen, als nur einen 2-Flip-Flop-Synchronisierer auf das Signal zu stecken. Die genaue verwendete Methode hängt von der Anwendung ab.

Zusätzlich zu Toms Antwort füge ich gerne einen Verweis auf PoC hinzu , das Implementierungen für diese Fälle enthält. Die Synchronizer-Dokumentation ist auf RTD verfügbar. Zusätzlich zur Theorie der Verkettung von 2 Flip-Flops für einen einfachen 2-FF-Synchronizer bietet PoC dedizierte Implementierungen ( sync_Bits) für Xilinx- und Altera-FPGAs, um das Metastabilitätsverhalten zu verbessern. Der 2-FF-Synchronizer wird beispielsweise verwendet sync_Strobe, um komplexere Synchronizer für Pulse zu bauen.
Vielen Dank für die ausführliche Einführung in Synchronisationsstrategien. Dieses Bild stammt aus "Clock Domain Crossing (CDC) Design & Verification Techniques Using Systemverilog" von Clifford E. Cummings. Ich verstehe, dass für ein Ein-Bit-Signal die Breite mindestens 1 Taktzyklus + Setup-Zeit + Haltezeit der Empfangsseite betragen muss, damit es sicher durchkommt. In diesem Bild ist dieses Kriterium nicht erfüllt, da der Impuls von adat nur einmal an seiner abfallenden Flanke von bclk-Abtastwerten abgetastet wird, was dazu führt, dass bq1_dat metastabil ist.
... Folglich könnte der Messwert von bq1_dat bei der nächsten steigenden Flanke von bclk entweder '0' oder '1' sein. Die Synchronisation im Bild scheint also nicht erfolgreich zu sein. Habe ich recht?
@Paebbels Danke für den Hinweis. Werde mal schauen =)
Sie sollten dies in Ihre Frage bearbeiten und nicht als Antwort posten, aber im Wesentlichen können Sie in diesem Beispiel eine 1 an der Ausgabe erhalten oder nicht.

1) Am Beispiel Ihrer Zeichnung sind clk und bclk asynchron zueinander. Mit anderen Worten, sie haben unterschiedliche Taktquellen. Sie zeigen adat als gültige Daten an, sind aber nur mit aclk synchronisiert. Hier kommt der bclk-Synchronizer ins Spiel.

2) Diese Zeichnung geht von einem Worst-Case-Szenario aus, bei dem bq1_dat eine chaotische Ausgabe ist, da das bq1 FF nur einen Teil des Endes der Daten abgefangen hat, wodurch ein metastabiler Zustand erzeugt wird, bei dem die Ausgabe normalerweise Müll ist. Hier ist der Trick. Bq2 hat das gleiche bclk wie bq1, aber es dauert 2 Taktzyklen von bclk, damit Daten passieren und bei bq2_dat erscheinen.

3) Der erste bclk hat einen Teil der Daten erfasst, was zu einer unordentlichen Ausgabe führt, aber der zweite bclk ist einen Taktzyklus später, genug Zeit für mehrdeutige Daten von bq1_dat, um sich in einen hohen oder niedrigen Zustand zu begeben. Der chaotische bq1_dat-Impuls dauerte gerade lange genug, damit bq2 eine gültige logische '1' (logisch hoch) erfasst und als gültige und jetzt synchronisierte Daten (logisch hoch) an bq2_dat weiterleitet.

4) Downstream hat jede Uhr, die bclk verwendet, synchronisierte Daten, mit denen sie arbeiten kann. Beachten Sie, dass nur das erste bclk FF mit einem metastabilen Zustand fertig werden musste . Der Ausgang hätte ein logisches Low sein können, wenn adat nur Pico- oder Nanosekunden zu spät gewesen wäre. Denken Sie daran, dass diese Flip-Flops den Dateneingang nur an der steigenden Flanke des Takts abtasten. Was vor oder nach der steigenden Flanke passiert, wird ignoriert.

Beachten Sie jedoch, dass die bclk-Verzögerung nur ein probabilistisches Sicherheitsmaß darstellt und der genaue Betrag sowohl von der FF-Technologie als auch von der bclk-Periode abhängt. In einigen High-Rel-Fällen können 3 oder sogar mehr Stufen erforderlich sein, um die Fehlerrate auf ein akzeptables Niveau zu senken.
@WhatRoughBeast. Ich weiß, dass im schlimmsten Fall viele Sync-Stufen benötigt werden, plus digitale Filterung. Offensichtlich war meine Antwort zu einfach.
@ Sparky256 Was mich verwirrt, ist 3) in deinem Kommentar. Wie kann bq2 eine '1' erfassen, wenn sich bq1_dat in einem metastabilen Zustand befindet?
@fiedel, zwei Dinge tragen dazu bei, dass bq2 (zumindest) eine saubere Eingabe erfassen kann. Zuerst muss der metastabile Zustand für einen vollen Taktzyklus andauern. Zweitens könnte der metastabile (Pseudo-Mid-Rail) Wert von bq1 unwahrscheinlich (oder so optimiert sein, dass er vermieden wird) in dem Fenster liegen, das auch dazu führen würde, dass bq2 metastabil ist – aber es ist hauptsächlich der erste davon. Angenommen, die Technologie führt zu einer Wahrscheinlichkeit von 5 %, dass die Metastabilität lange genug anhält. eine 3-FF-Synchronisationsstufe würde dies auf 0,25 % reduzieren, da beide Zellen ausfallen müssen. Chaotisch ist in der Praxis eine wohldefinierte exponentielle Abweichung vom nahezu stabilen Zustand.
@SeanHoulihane. Danke für die Erklärung. Der Begriff „ansteigende Flanke“ verwirrt einige, da das Fenster zum Akzeptieren von Daten (metastabil oder stabil) auf halbem Weg der ansteigenden Flanke liegt und nur wenige Pico- oder Nanosekunden dauert. Nur in diesem Moment sind die Eingangsdaten auf einer logischen "1" oder "0", ob sie metastabil oder stabil sind, abhängig von ihrem Spannungspegel im Vergleich zum Schwellenwert des IC für logisch 1 oder 0.