Cross-Clock-Domain-Datenbus

Ich habe vor einiger Zeit eine Frage zum Crossing Clock Domains gestellt .

Eine der "Regeln" besteht darin, Mehrbitsignale niemals Bit für Bit zu synchronisieren, da zwischen einzelnen Bits zeitliche Störungen auftreten.

Ich habe jetzt ein Design, bei dem ich ein Multibit-Signal von einer 27-MHz-Domäne in eine 54-MHz-Taktdomäne überqueren muss.

Ich habe keine FIFOs mehr in meinem FPGA, gibt es also eine Möglichkeit, dies zu tun, ohne ein asynchrones FIFO zu verwenden?

Ist es möglich, das Multibit-Signal zu synchronisieren und eine zeitliche Einschränkung festzulegen, sodass ich zumindest einen Fehler erhalte, wenn das Timing nicht eingehalten wird?

Sind die 27-MHz- und 54-MHz-Takte in irgendeiner Weise über einen Teiler oder eine PLL miteinander verbunden? Wenn dies der Fall ist, handelt es sich nicht wirklich um eine vollständig asynchrone Domänenüberquerung, und es gelten andere (einfachere) Regeln.
Die 27- und 54-MHz-Takte sind unabhängig voneinander.

Antworten (2)

Wenn der Durchsatz der Datenübertragungen gering ist, können Sie einen einfachen Handshake verwenden, um die Überquerung der Taktdomäne durchzuführen:

CDC-Diagramm

Ihre Startseite platziert die Daten in einem Register und invertiert ein einzelnes Bit-Flag. Das Flag wird in Ihren Latch-Taktbereich synchronisiert und die Inversion wird erkannt, was anzeigt, dass neue Daten in den Latch-Taktbereich neu zu registrieren sind.

Die Latch-Clock-Domäne invertiert ein weiteres Bestätigungsbit, das dann zurück in die Launch-Clock-Domäne synchronisiert wird, wodurch die Launch-Seite informiert wird, dass sie ein weiteres Datenwort senden kann.

Auf der Single-Bit-Synchronizer-Kette müssen Sie noch die notwendigen Vorkehrungen treffen (mindestens 2 Register dicht beieinander). Sie werden möglicherweise auch feststellen, dass eine größere Anzahl erforderlich ist, da der falsche Pfad es dem Monteur ermöglicht, die beiden Mehrbitregister physisch weit voneinander entfernt zu platzieren. Möglicherweise müssen Sie eine Verzögerungsbeschränkung verwenden, um die Platzierung zu begrenzen ( set_max_delayauf Altera oder define_path_delayauf Xilinx).

Offensichtlich ist die Rate, mit der Sie Wörter übertragen können, viel geringer als bei Verwendung eines Doppeltakt-FIFO. Sie sagen, Sie haben "keine FIFOs mehr" übrig, aber denken Sie daran, dass sowohl Altera als auch Xilinx kleine FIFOs unterstützen, die aus speziellen Logikblöcken bestehen (MLABs im Altera-Jargon oder SLICEMs im Xilinx-Sprachgebrauch).

Wenn die beiden Takte vom selben DCM ohne Phasenverschiebung generiert werden, funktioniert es möglicherweise, wenn Sie den langsameren Takt als clk_en-Signal verwenden, nur weil fast_clock = 2 * slow_clock.