Clock Domain Crossing: Ist es möglich, eine Architektur gleichzeitig von einer schnelleren zu einer langsameren Domäne und von einer langsameren zu einer schnelleren Domäne zu entwerfen?

Wenn ich ein Design habe, das Uhr liest und Uhr schreibt, und ich möchte, dass es für die folgenden Szenarien funktioniert:

  1. schnellerer Lesetakt und langsamerer Schreibtakt
  2. langsamerer Lesetakt und schnellerer Schreibtakt

Ist dies möglich, ohne die Architektur von einem Szenario zum anderen zu ändern?

Zum Beispiel: Ich habe einen einzelnen Impuls, der von einer Taktdomäne in eine andere übergeht. Ich möchte, dass es in beiden Szenarien erkannt wird.

PS: Ich habe noch nie an CDC gearbeitet. Habe gerade angefangen, es zu recherchieren.

Sie geben nicht an, ob Sie ein FPGA oder ein anderes Ziel verwenden. Da das Überqueren von Taktdomänen subtile Fehler verursachen kann, stellen viele Hersteller normalerweise vorgefertigte IP-Adressen bereit, die den Job richtig machen. Beispielsweise können Sie einen kleinen asynchronen FIFO-Kern verwenden.
Was muss an den verschiedenen Arten von Taktflanken passieren, welche Arten von Handshaking-Verzögerungen sind akzeptabel und wird irgendetwas "im Voraus" über Änderungen in den Takten bekannt sein?

Antworten (2)

Zunächst hängt es von der Architektur Ihres Designs ab. Betrachten Sie beispielsweise das Streamen von „data“ und „dataValid“ von einer Domäne zu einer anderen.

Wenn der Takt der Quellenschaltung langsamer als der Takt der Zielschaltung ist, kann und wird die Schaltung dest sehen, dass „dataValid“ für mehr Takte geltend gemacht wird, als die Quelle beabsichtigte. Wenn der Quelltakt schneller als der Zieltakt ist, kann die Zielschaltung übersehen, dass „dataValid“ insgesamt hoch ist, oder es für weniger Takte als bestätigt ansehen, als die Quelle beabsichtigte.

Die Liste der Problembereiche lässt sich fortsetzen, aber der Punkt ist, dass die Schaltung unter Berücksichtigung des Datenflusses, der Laufzeiten und des Handshakes zwischen den beiden Schaltungen entworfen werden muss. Es ist oft wichtig, es von Anfang an einzuplanen, aber manchmal kann es später mit weniger Problemen hinzugefügt werden. Dann gibt es all die Probleme beim Entwerfen von Metastabilität.

Es kann alles getan werden, alles kann perfekt gemacht werden, aber es erfordert Verständnis und Planung. Es ist keine triviale Aufgabe.

Ja, eine Methode besteht darin, "Blasen" (Leerlauf) in die schnellere Seite einzufügen, um die Gesamtzahl der Zyklen zwischen beiden Seiten gleich zu halten. Dies ist eine Art Pseudo-Synchronisationstechnik für FIFOs.

Normalerweise würde dies nur auf der schnelleren Seite erfolgen. Wenn sich die Uhren ändern können, was schneller ist, dann könnten Sie eine auf jeder Seite platzieren und diejenige deaktivieren, die auf der langsameren Seite ist.

Oder Sie könnten sich für eine asynchrone FIFO-Lösung entscheiden, die nichts Besonderes für die langsamere/schnellere Seite erfordert. Um mit Metastabilität fertig zu werden, werden normalerweise zwei FFs verwendet, um den Schreibzeiger zu speichern (reduziert die Wahrscheinlichkeit einer Metastabilität stark auf ein statistisch vernachlässigbares Niveau), was einen zusätzlichen Verzögerungszyklus zwischen Lesen/Schreiben ergibt. Dies erhöht die Latenz, hat aber keine Auswirkung auf den Durchsatz.

Bei der ersten Methode bin ich mir nicht sicher. Kannst du es bitte näher erläutern? Bin nie auf diese Methode gestoßen. Danke.
@ssgr: Angenommen, Sie haben ein Taktverhältnis von 3:4. Über einen Zeitraum hat die langsamere Seite 3 Zyklen, während die schnellere Seite 4 Zyklen hat. Wenn Sie also jeden 4. Zyklus auf der schnellen Seite für einen Zyklus alles deaktivieren (stillstehen), haben Sie auf beiden Seiten die gleiche Anzahl von Zyklen. Die Logiksteuerung, die dies bewerkstelligt, wird als "Blasengenerator" bezeichnet. google.com/patents/US8205111
Ein allgemeinerer Begriff für das, was der "Blasengenerator" tut, ist "Flusskontrolle". Flusskontrolle kann viele Formen annehmen, aber die Grundidee ist, dass es eine Art wechselseitigen Handshake zwischen einem Erzeuger und einem Verbraucher von Informationen gibt, der verhindert, dass die langsamere Seite von der schnelleren Seite überwältigt wird. Auch wenn die "Information" nur ein Impulsstrom ist, wird auf der Ausgangsseite eine Rückmeldung gegeben, dass ein Impuls erzeugt wurde, damit auf der Eingangsseite ein weiterer akzeptiert werden kann.
@DaveTweed: Aber wenn Sie das Papier lesen, ist der Blasengenerator nicht Teil der Handshaking-Schaltung (die mit der Anforderungs- / Bestätigungslogik ausgeführt wird), sondern wird durch die Verhältnisse der Uhren festgelegt und verwendet Koppelnavigation, um bestimmte Zyklen zu überspringen. Wie gesagt, das ist nur eine Methode.
Sie gehen jedoch davon aus, dass eine Uhr direkt von der anderen abgeleitet ist, sodass sie eine feste und einfache Frequenzbeziehung haben. Die Frage des OP ist allgemeiner, und im Allgemeinen müssen Sie davon ausgehen, dass sie effektiv asynchron und unkontrolliert sind, was den Bedarf an Feedback antreibt.
@DaveTweed: Hast du meine Antwort überhaupt gelesen oder schwätzst du nur? Sie haben das Beispielpapier, auf das ich verwiesen habe, falsch zusammengefasst und nach der Korrektur ein anderes Nicht-Problem ausgewählt, über das Sie pingelig sein können. Wie ich im zweiten Absatz sagte: "Oder Sie könnten eine asynchrone FIFO-Lösung verwenden". Ehrlich gesagt kommentieren Sie viele meiner Antworten und es fügt im Allgemeinen nie etwas hinzu, außer sich selbst zu spritzen.