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?
clockdomain schrieb: > Die Takte oder Moduel müssen synchronisiert werden. Nein, du musst die Daten z.B. über einen FIFO übertragen (mit Handshake)
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.
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.
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.
Muss ich unbedingt ein Handshake bei den FIFOs machen?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.