mikrocontroller.net

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


Autor: clockdomain (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
clockdomain schrieb:
> Die Takte oder Moduel müssen synchronisiert werden.

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

Autor: Tobias B. (Firma: www.elpra.de) (ttobsen)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: clockdomain (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vancouver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: clockdomain (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss ich unbedingt ein Handshake bei den FIFOs machen?

Autor: Fitzebutze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.