Hallo, Ich muss an ein bestehendes Modul welches ein BRAM Interface hat anbinden und darüber Register beschreiben und lesen. Problematisch wird es dadurch, dass das von mir erstellte Modul mit 160MHz und das bereits bestehende Modul mit 250MHz laufen muss. Das BRAM Interface bietet leider auch keine Möglichkeit den Master zu bremsen(Handshake) und liefert im Falle eines Schreibvorgangs somit jeden Takt valide Daten. Nun bin ich etwas ratlos wie man ein bidirektionales CDC in diesem Fall gestalten kann und über jeden Tipp dankbar. Xilinx BRAM-Controller: https://www.xilinx.com/support/documentation/ip_documentation/axi_bram_ctrl/v4_0/pg078-axi-bram-ctrl.pdf
So allgemein ist es schwierig, da prinzipiell das eine Interface zu schnell scheint. Wenn es ein Datenstrom wäre, könnte man die Datenbreite verdoppeln um damit die Datenrate zu halbieren. Oder ein FIFO wäre noch eine Möglichkeit, falls es auch wieder leerlaufen kann. Wäre eines von beiden machbar?
Wenn dein Modul die Daten konstant schneller liefert als der BRAM sie verarbeiten kann (oder umgekehrt), hast du verloren. Ansonsten legst du einen hinreichend großen FIFO in den Pfad, der das Handshaking übernimmt.
Was verstehst Du denn im Umfeld von FPGAs unter "CDC"? Ich kenne den Begriff in 3 Ausführungen und keiner will mir passen. Zu der Frage mit dem Zugriff über FIFOs: Ja, das geht am Einfachsten, birgt aber das Problem der Datenkonsistenz. Was geschrieben wird, ist erstmal noch nicht im RAM und kann so bald nicht gelesen werden. Dann: Du machst Dein BRAM-IF hoffentlich nicht über das langsame AXI-Gedöhns? Wie sieht denn Dein timing des Zugriffs aus?
CDC ist hier clock domain crossing. Sowas geht halt dann über FIFOs, ist doch überall so. Da braucht man halt ein paar Handshake Signale, damit man weiß wann die Daten valide sind. Ist ja zum Beispiel am MIG auch nicht anders. Und Axi Streaming ist auch nicht langsam, ist doch nur ein simples FIFO Interface.
Gebonnt! Nur "ein paar Handshake"-Signale erfordern eben auch eine Abtastung durch die langsame domain und da geht das Tempo dann pauschal mal auf unter 80MHz runter. Angesichts der 250MHz an der Quelle wird es irgendwas mit 62,5MHz, wenn man alles mit der Quelle raussynched.
Weltbester FPGA-Pongo schrieb im Beitrag #4777299: > Nur "ein paar Handshake"-Signale erfordern eben auch eine > Abtastung durch die langsame domain und da geht das Tempo dann pauschal > mal auf unter 80MHz runter. Mit direktem Handshake zwischen Quelle und Abnehmer ist das so. Aber wenn man das FIFO in beiden Taktdomänen arbeiten lässt und mit almost-full bzw. almost-empty Flags arbeitet, dann kann die langsamere Seite ihre volle Bandbreite ausspielen (in diesem Fall also die 160MByte/s). Kostet halt ein bisschen Latenz (weil dazu mehrere Bytes im FIFO vorrätig sein müssen), und dass die schnellere Seite nicht ihre volle Bandbreite nutzen kann (weil die langsamere Seite die Daten nicht schnell genug abholen kann) wurde ja schon mehrfach beschrieben.
Danke für die zahlreichen Hinweise. Ich konnte schlussendlich die Datenbreite verdoppeln und mir den Overhead der FIFOs sparen.
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.