Wie stellt der 2-ff-Synchronisierer eine ordnungsgemäße Synchronisation sicher?

9

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

Es scheint, dass bclk den Impuls von adat nur einmal abtasten kann (an der zweiten ansteigenden Flanke von bclk ), was eine Ausgangsmetastabilität bei bq1_dat verursacht . Wie kann bq1_dat bei der nächsten aktiven Taktflanke "high" abgetastet werden?


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

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 den Vorlesungsunterlagen zu EE108A, Vorlesung 13: Metastabilitäts- und Synchronisationsfehler (wie wenn gute Flip-Flops schlecht werden) von WJ Dally.

Fiedel
quelle
4
Ich möchte nur sagen, dass die Diagramme, die die metastabile Ausgabe "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 Zeitspanne schwingt die Spannung entweder hoch oder niedrig, und der Weg ist ebenfalls unvorhersehbar.
Dave Tweed
@ Dave Tweed ♦ Danke für den Kommentar. In fast allen Dokumenten, die ich über Metastabilität gelesen habe, habe ich die "herumwandernden" Wellenformen gesehen. Ich habe mich umgesehen und einen Beitrag gefunden ( Wenn ein Flip-Flop eine Setup-Verletzung aufweist und metastabil wird, wird es garantiert auf den Eingabewert eingestellt, wenn es mit dem Oszillieren fertig ist? ), Der einen Schuss aus dem O-Scope mit erfasstem metastabilem Zustand enthält. In diesem Beitrag ist ein Link zur ursprünglichen Referenz der Abbildung enthalten.
Fiedel
Ja, das veranschaulicht meinen Standpunkt perfekt, und die Powerpoint-Präsentation, aus der er stammt, enthält viele gute Informationen.
Dave Tweed

Antworten:

8

Die einfache Antwort ist, dass sie nicht alleine sind. Der Synchronisierer ist nicht dazu da, um sicherzustellen, dass die Daten übertragen werden, aber um sicherzustellen, dass Sie keine metastabilen Signale erhalten, die viele andere Signale speisen und Probleme verursachen. Das zweite FF, wie das Diagramm zeigt, fängt den metastabilen ersten FF-Ausgang ab und verhindert, dass er sich weiter durch das Design ausbreitet.

Es gibt verschiedene Arten von Signalen, und wie Sie Synchronisierer einschließen, 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 zum Laufen bringen muss. Diese enthalten im Allgemeinen keine Daten, und alles, was Sie interessiert, ist, dass es beispielsweise eine steigende Flanke gibt, um etwas in einer anderen Taktdomäne in Gang zu setzen. Um diese zu überqueren, benötigen Sie einen Synchronisierer (im Wesentlichen das, was in Ihrem Diagramm gezeigt wird), aber Sie benötigen ein bisschen mehr.

    Die einfachste Möglichkeit besteht darin, den Impuls zu verlängern. Im Wesentlichen stellen Sie sicher, dass der Eingangsimpuls mehr als 1 Taktperioden des Zieltakts beträgt (er sollte länger als 1 Zyklus sein, mindestens um die größere der Einrichtungs- und Haltezeiten für das Zielregister). . Wenn Sie beispielsweise von einem 20-MHz-Takt zu einem 15-MHz-Takt wechseln, stellen Sie sicher, dass Ihr Impuls zwei Taktzyklen am Eingang beträgt, um sicherzustellen, dass er dem Zieltakt angezeigt 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 er den Impuls definitiv fängt, wenn er bei der ersten Taktflanke metastabil wird und als 0 angesehen wird.

    Da Sie bei dieser Art von Signal nur daran interessiert sind, dass der Impuls übertragen wurde, spielt es keine Rolle, ob das Ausgangssignal manchmal zwei Taktzyklen hoch und den Rest nur einen Zyklus hat. 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 Multi-Bit-Datenstrom haben, der synchronisiert bleiben muss. In diesem Fall würden Sie etwas implementieren, das als "Handshaking" bezeichnet wird. Grundsätzlich laden Sie Ihre Daten auf die Quellentaktung und halten sie. Dann senden Sie ein Anforderungssignal (wie in 1) über einen Synchronisierer. Sobald das Anforderungssignal vorbei ist, wissen Sie, dass der Datenbus auch in der Zieldomäne stabilisiert wird. Sie können es dann in eine Registerbank im Ziel 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üssen, für die Sie wissen müssen, dass es dort angekommen ist, bevor Sie einen anderen 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, ist es wahrscheinlich besser, einen FIFO zu verwenden als Synchronisierer. Das FIFO verwendet einen Dual-Clock-Speicher zum Speichern der Daten sowie Zähler, um zu verfolgen, wie viele Daten sich im FIFO befinden. Sie schreiben die Daten in den FIFO, wenn Platz vorhanden ist, und erhöhen dann die Schreibadresse. Diese Adresse wird dann typischerweise in ein "Gray Coding" -Schema codiert, das sicherstellt, dass jedes Adressinkrement nur eine verursachtBit im zu ändernden Adressbus (dh Sie müssen nicht mehrere Bits synchronisieren). Diese Adresse wird dann an die Zieldomäne (über eine Ihrer Synchronisierketten) übertragen, wo sie mit der gelesenen Adresse verglichen wird. Befinden sich Daten im FIFO, können diese über den Zieltaktport aus dem Speicher ausgelesen werden. Die Leseadresse ist ähnlich grau codiert und wird über einen anderen Synchronisierer an die Quelle zurückgesendet, damit der Schreibport berechnen kann, ob im FIFO Platz vorhanden ist.

  4. Signale zurücksetzen - Diese verwenden normalerweise eine modifizierte Version des Synchronisierers in "Asynchronous Assert, Synchronous Deassert". In dieser modifizierten Version ist der Dateneingang zum ersten Flipflop mit GND verbunden, und stattdessen wird das eingehende Rücksetzsignal mit asynchronen voreingestellten Signalen jedes Flipflops im Synchronisierer verbunden. Dies führt zu einem Ausgangssignal, das vollständig asynchron ist, wenn es hoch geht, aber die Synchronisierkette stellt sicher, dass es synchron mit dem Zieltakt niedrig geht, indem es durch Nullen in der Registerkette taktet.

    Diese Art von Synchronisierer ist für Daten und Steuerung schrecklich, aber perfekt zum Zurücksetzen von Signalen geeignet. Wenn die gesamte Ziellogik den Ausgang dieser Kette in die asynchronen Rücksetzeingänge eines Registers in der Domäne einspeist, besteht wenig Bedenken hinsichtlich der Metastabilität beim Aktivieren (obwohl es asynchron ist), da alle Register in einen bekannten Zustand gezwungen werden. Wenn dann das Rücksetzsignal in der Quelldomäne deaktiviert wird, wird es in der Zieldomäne synchron deaktiviert, was bedeutet, dass alle Register im selben Taktzyklus nicht mehr zurückgesetzt werden (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 kleben. Die genaue Methode hängt von der Anwendung ab.

Tom Carpenter
quelle
Zusätzlich zu Toms Antwort möchte ich einen Verweis auf PoC hinzufügen , das Implementierungen für diese Fälle enthält. Die Synchronisationsdokumente sind auf RTD verfügbar. Zusätzlich zur Theorie der Verkettung von 2 Flip-Flops für einen einfachen 2-FF-Synchronisierer bietet PoC dedizierte Implementierungen ( sync_Bits) für Xilinx- und Altera-FPGAs, um das Metastabilitätsverhalten zu verbessern. Der 2-FF-Synchronisierer wird beispielsweise verwendet sync_Strobe, um komplexere Synchronisierer für Impulse zu erstellen.
Paebbels
Vielen Dank für die ausführliche Einführung in Synchronisationsstrategien. Dieses Bild stammt von "Clock Domain Crossing (CDC) Design & Verifikationstechniken unter Verwendung von Systemverilog" von Clifford E. Cummings. Ich verstehe, dass für ein Ein-Bit-Signal die Breite mindestens 1 Taktzyklus + Rüstzeit + Haltezeit der Empfangsseite betragen muss, damit es sicher durchkommt. In diesem Bild ist dieses Kriterium nicht erfüllt, da der Adat-Impuls von bclk-Samples nur einmal an seiner fallenden Flanke abgetastet wird, wodurch bq1_dat metastabil wird.
Fiedel
... Infolgedessen könnte der Messwert von bq1_dat an der nächsten ansteigenden Flanke von bclk entweder '0' oder '1' sein. Die Synchronisation im Bild scheint also nicht erfolgreich zu sein. Habe ich recht?
Fiedel
@Paebbels Danke für den Hinweis. Werfen Sie einen Blick =)
Fiedel
Sie sollten dies in Ihrer Frage bearbeiten und nicht als Antwort veröffentlichen, aber im Wesentlichen können Sie in diesem Beispiel eine 1 an der Ausgabe erhalten oder nicht.
Tom Carpenter
1

1) Am Beispiel Ihrer Zeichnung sind aclk und bclk asynchron zueinander. Mit anderen Worten, sie haben unterschiedliche Taktquellen. Sie zeigen adat als gültige Daten an, sind jedoch 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 unordentliche Ausgabe ist, da der bq1 FF nur einen Teil des Datenendes abfängt und einen metastabilen Zustand erzeugt, 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, bis Daten durchlaufen und bei bq2_dat angezeigt werden.

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, damit sich mehrdeutige Daten von bq1_dat in einen hohen oder niedrigen Zustand versetzen. Der unordentliche bq1_dat-Impuls dauerte gerade lange genug, damit bq2 eine gültige logische '1' (logisch hoch) erfassen und als gültige und jetzt synchronisierte Daten (logisch hoch) an bq2_dat übergeben konnte.

4) Nachgeschaltet hat jede Uhr, die bclk verwendet, synchronisierte Daten, mit denen gearbeitet werden kann. Beachten Sie, dass nur der erste bclk FF mit einem metastabilen Zustand umgehen musste . Die Ausgabe hätte logisch niedrig sein können, wenn adat nur Pico oder Nano Sekunden zu spät gewesen wäre. Denken Sie daran, dass diese Flip-Flops den Dateneingang nur an der ansteigenden Flanke des Takts abtasten. Was vor oder nach der ansteigenden Flanke passiert, wird ignoriert.

Sparky256
quelle
Beachten Sie jedoch, dass die bclk-Verzögerung nur ein probabilistisches Maß für die Sicherheit darstellt und der genaue Betrag sowohl von der FF-Technologie als auch von der bclk-Periode abhängt. In einigen Hi-Rel-Fällen können 3 oder sogar mehr Stufen erforderlich sein, um die Fehlerrate auf ein akzeptables Maß zu senken.
WhatRoughBeast
@ WhatRoughBeast. Ich weiß, dass im schlimmsten Fall viele Synchronisierungsstufen sowie digitale Filterung erforderlich sind. Offensichtlich war meine Antwort zu einfach.
Sparky256
@ Sparky256 Was mich verwirrt ist 3) in deinem Kommentar. Wie kann bq2 eine '1' erfassen, wenn sich bq1_dat im metastabilen Zustand befindet?
Fiedel
@fiedel, zwei Dinge tragen dazu bei, dass bq2 (zumindest) eine saubere Eingabe erfassen kann. Zunächst muss der metastabile Zustand für einen vollständigen Taktzyklus bestehen bleiben. Zweitens könnte es unwahrscheinlich sein (oder optimiert werden, dass der metastabile Wert (Pseudo-Mid-Rail) von bq1 in dem Fenster liegt, 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. Messy ist in der Praxis eine genau definierte exponentielle Abweichung vom nahezu stabilen Zustand.
Sean Houlihane
@ SeanHoulihane. Danke für die Erklärung. Der Begriff "steigende Flanke" verwirrt einige, da sich das Fenster zum Akzeptieren von Daten (metastabil oder stabil) auf halber Strecke der steigenden Flanke befindet und nur einige Pico- oder Nanosekunden dauert. Nur zu diesem Zeitpunkt liegen die Eingangsdaten bei einer logischen '1' oder '0', unabhängig davon, ob sie metastabil oder stabil sind, abhängig von ihrem Spannungspegel im Vergleich zum Schwellenwert des IC für logisch 1 oder 0.
Sparky256