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:
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.
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.
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.
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:
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.
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).
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.
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.
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.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.
David Tweed
fiedel
David Tweed