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:
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.
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 den Vorlesungsunterlagen zu EE108A, Vorlesung 13: Metastabilitäts- und Synchronisationsfehler (wie wenn gute Flip-Flops schlecht werden) von WJ Dally.
quelle
Antworten:
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:
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.
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).
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.
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.
quelle
sync_Bits
) für Xilinx- und Altera-FPGAs, um das Metastabilitätsverhalten zu verbessern. Der 2-FF-Synchronisierer wird beispielsweise verwendetsync_Strobe
, um komplexere Synchronisierer für Impulse zu erstellen.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.
quelle