Forum: FPGA, VHDL & Co. CDC übertragung von Daten zwischen zwei Modulen unterschiedlichen clocks


von clockdomain (Gast)


Lesenswert?

Hallo,

Ich möchte gern Daten zwischen zwei Modulen austauschen. Allerdings 
haben beide Module einen unterschiedlichen Takt. Das eine Modul hat 
einen Takt von 300 MHz, das andere 75 Mhz.

Was muss getan werden:
- Die Takte oder Moduel müssen synchronisiert werden. Das macht man 
durch einen Clocksynchronizer. Sehe ich das richtig, das so ein 
CLocksynchronizer in beide Richtungen angewandt werden muss?

Die Daten, muss ich diese auf gleiche weise synchronisieren wie beim 
Clock?
Oder genügt es einfach das Synchronisationssignal abzuwarten und dann 
den Daten mit den gegenüberliegenden clock in einem Register zu 
speichern?

von Schlumpf (Gast)


Lesenswert?

clockdomain schrieb:
> Die Takte oder Moduel müssen synchronisiert werden.

Nein, du musst die Daten z.B. über einen FIFO übertragen (mit Handshake)

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Schlumpf schrieb:
> Nein, du musst die Daten z.B. über einen FIFO übertragen (mit Handshake)

In diesem Fall kann es auch ohne funktionieren, sofern die 75 MHz aus 
der 300 MHz generiert werden und entsprechend zueinander eine feste 
Phase haben. Man beachte das 300 das kleinste gemeinsame Vielfache von 
300 und 75 ist!

Wenn die Frequenzen jedoch freilaufen, geht es nicht mehr ohne FIFO, 
zumindest nicht bei einem n-bit breitn Bus. Fuer 1-bit breite Daten gibt 
es noch diverse andere Techniken.

von clockdomain (Gast)


Lesenswert?

Ahh ok, mit FIFO also. Nun die beiden Clocks sind unabhängig von 
einander in der Erzeugung. Dei 300 MHz sind im FPGA selbst durch pll 
erzeugt und die 75 Mhz kommen von ausen.

von Vancouver (Gast)


Lesenswert?

Einen guten Einstieg, wenn auch etwas oberflächlich, gibts hier.

https://www.edn.com/electronics-blogs/day-in-the-life-of-a-chip-designer/4435339/Synchronizer-techniques-for-multi-clock-domain-SoCs


Insgesamt ist Domain Crossing ein etwas heikles Thema, in das man sich 
sorgfältig einarbeiten sollte. Sonst fiegt man leicht auf die Nase, wie 
es mir einst erging.

von clockdomain (Gast)


Lesenswert?

Muss ich unbedingt ein Handshake bei den FIFOs machen?

von Fitzebutze (Gast)


Lesenswert?

clockdomain schrieb:
> Muss ich unbedingt ein Handshake bei den FIFOs machen?

Nicht zwingend, du kannst im Prinzip alles mit Gray-Countern 
implementieren.
Einfacher ist es aber, vom Hersteller einen Dual-Clock-FIFO-Core zu 
instanzieren.
Es gibt leider eine Menge Referenzimplementierungen, die auf der einen 
Architektur funktionieren, auf der anderen sporadisch nicht mehr.
Ich habe damals in ein portables Design viel Zeit reinstecken müssen.

von Schlumpf (Gast)


Lesenswert?

clockdomain schrieb:
> Dei 300 MHz sind im FPGA selbst durch pll
> erzeugt und die 75 Mhz kommen von ausen.

Dann geht es nicht ohne "Hilfsmittel".

clockdomain schrieb:
> Muss ich unbedingt ein Handshake bei den FIFOs machen?

Das kommt drauf an..
Wenn deine Datenmenge begrenzt ist (also sagen wir z.B. 100 Byte pro 
Paket),
dann kannst du das FIFO so auslegen, dass sichergestellt ist, dass es 
weder leer läuft, noch überläuft. Dazu musst du es aber erst mal ein 
Stück weit "füllen", bis du auf der anderen Seite anfängst, zu lesen.
Tja und dann musst du der lesenden Seite ja irgendwie mitteilen, dass 
sie jetzt anfangen darf, zu lesen.
Diese Methode erzeugt natürlich eine gewisse Latenz.

Willst du aber nur hin und wieder ein Byte übertragen, dann könntest 
aber auch auf ein FIFO verzichten und nur die Daten in ein Register 
schreiben und dem Empfänger per Steuersignal mitteilen, dass ein Datum 
da wäre.

Was die optimale Methode ist, muss man von Fall zu Fall entscheiden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.