Hallo, ich beschäftige mich momentan mit der Implementierung eines USB-Interfaces. Dabei habe ich vor allem das Problem, dass mein Systemtakt auf 80 Mhz läuft und der USB-Takt zur Datenübertragung mi 48 Mhz. Seit geraumer Zeit versuche ich nun schon ein Fifo mit zwei unterschiedlichen Takten anzusteuern. Dazu verwende ich das Fifo aus dem FIFO Generator v3.3 von Xilinx. Und genau bei dieser Ansteuerung habe ich meine Probleme, da die beiden Takte absolut asynchron zueinander sind. Hat jemand von euch schon ein Interface für zwei unterschiedliche Takte entwickelt oder kann mir den einen oder anderen Ansatzpunkt geben? Vielen Dank für jede Unterstützung!
Du mußt nur beim Fifo Generator einstellen, daß Du 2 verschiedene Takte verwenden willst. Oder wo liegt das genaue Problem?
Ja, das habe ich ja eben schon gemacht. Ich habe ein FIFO mit unabhängigen Lese-/Schreibtakt generiert. Mein Problem ist die Ansteuerung der WR_EN und RD_EN Signale, die ich mittels den Full- und EMPTY-Flags mache. Momentan arbeitet meine FIFO-Ansteuerung mit dem langsameren USB-Takt, da die Flags ja angelegt bleiben. Das Problem ist aber vor allem bei einem Reset, da die Full-Flags drei Schreibzyklen gesetzt bleiben und anschließend erst gelöscht werden. Dabei kann es bei mir laut Simulation vorkommen, dass ich den ersten Wert verliere, da dieser mit dem Schreibtakt sich ändert und auch ins FIFO geschrieben werden würde, ich jedoch das WR_En erst mit dem Lesetakt setze. Wäre es vielleicht ein Ansatz, dass ich die FIFO-Ansteuerung mit einem Takt mache, der über einen BUF-MUX entweder den Lese- oder Schreibtakt hat?
@ Sludig (Gast) >USB-Interfaces. Dabei habe ich vor allem das Problem, dass mein >Systemtakt auf 80 Mhz läuft und der USB-Takt zur Datenübertragung mi 48 >Mhz. Seit geraumer Zeit versuche ich nun schon ein Fifo mit zwei >unterschiedlichen Takten anzusteuern. Dazu verwende ich das Fifo aus dem Dazu braucht man einen asynchronen FIFO. Gint fix und fertig vom Xilinx Core Generator. >Momentan arbeitet meine FIFO-Ansteuerung mit dem langsameren USB-Takt, DAS ist falsch. Dein FIFO hat zwei getrennte Taktsystem (Clock domains) Die Eingangs/Schreibseite mit FULL Flag und die Ausgangs/Leseseite mit EMPTY Flag. Beide dürfen nur an die jeweiligen Taktsysteme gekoppelt werden, das ist dann vollkommen normales synchrones Design. Es dürfen NIEMALS über die Taktgrenze Daten oder Steuersignale direkt transferiert werden, das knallt. Dazu ist das FIFO da. >da die Flags ja angelegt bleiben. Das Problem ist aber vor allem bei >einem Reset, da die Full-Flags drei Schreibzyklen gesetzt bleiben und >anschließend erst gelöscht werden. Dabei kann es bei mir laut Simulation >vorkommen, dass ich den ersten Wert verliere, da dieser mit dem >Schreibtakt sich ändert und auch ins FIFO geschrieben werden würde, ich >jedoch das WR_En erst mit dem Lesetakt setze. Generiere zwei Reset-Signale, eins für das FIFO und dein verzögertes für deine Logik. >Wäre es vielleicht ein Ansatz, dass ich die FIFO-Ansteuerung mit einem >Takt mache, der über einen BUF-MUX entweder den Lese- oder Schreibtakt >hat? AHHHH!!! Bloss nicht! Siehe oben. MfG Falk
In meinem Test-Code versuche ich Zählerstände in mehrere kaskadierte FIFOs zu speichern, die ich dann via USB anschließend blcokweise auf einmal auslesen will. Beim Schreiben muss ich deshalb das Empty-Flag, das synchron zum Lesetakt ist, für das WR_EN abfragen, da erst dann wieder ein FIFO neu beschrieben wird. Mache ich das nicht, wird immer wieder sobald das FIFO leer ist, ein Zählerstand abgespeichert. Beim Auslesen funktioniert es andersherum. Ich überwache das Fullflag (sychr. zum Schreibtakt) und lasse dann mittels RD_EN der jeweiligen FIFOs reihenweise auslesen. Daher denke ich, dass ich die Ansteuerung für das RD_EN und WR_EN nicht jeweils in einen Process sychron zum Lese- bzw. Schreibtakt machen kann. Oder sitze ich grad auf meiner Leitung?
> ich jedoch das WR_En erst mit dem Lesetakt setze
Das Write Enable muß auf der Schreibseite natürlich mit dem Schreibtakt
gesetzt werden !!!
Du verwendest das FIFO nicht in der richtigen Art. In ein Fifo soll man so lange schreiben, bis es voll ist, und nicht nur wenn es leer ist, sonst bräuchte man ja kein FIFO. Das selbe beim Lesen. Solange etwas im FIFO ist, wird gelesen. Wenn Du sicher stellen mußt, daß mindestens eine bestimmt Anzahl von Daten im FIFO sind, dann kannst Du die programmierbaren Emtpy und Full flag verwenden. Klaus
Da hatte ich dann wohl eine falsche Denkweise. Ich werd dann die programmierbaren Full und Empty-Signale verwenden, wenn ich nicht das komplette Fifo lesen will. Danke für eure Antworten.
Hi! Ich habe gerade ein sehr ähnliches Problem: Ich arbeite auf einem Virtex4. Momentan ist es so, dass ich ein Signal mit 16MHz und 1 Bit Breite reinbekomme und es über eine RS232 Schnittstelle mit einer Baudrate von 115200 ausgebe. Mit dem CoreGenerator habe ich jetzt ein FIFO erzeugt. Eingang: 16MHz clock, 1 Bit. Ausgang: baudclock, 8 bit (zusätzlich geregelt über ein busy flag). Meine Frage: durch den deutlichen clock Unterschied müssten doch sehr viele Daten verloren gehen, oder? Nützt mir das FIFO dann überhaupt etwas? Kann ich das überhaupt sinnvoll lösen, mit dieser "Bottleneck" Baudrate? Die Baudrate habe ich mir aus 26MHz generiert, und viel schneller geht das damit nicht ...
Wieso sollte was verloren gehen? Du musst schon dem Sender jeweils sagen, dass der FIFO voll ist, dann geht auch nix verloren. Und wieso eigentlich einen FIFO als Schieberegister? Ist das nicht bissl Verschwendung? Klar, kann man machen....aber naja. Ich würd die Bits erst in ein Schieberegister einsammeln und dann per FIFO puffern. Aber da der Eingang sowieso langsamer ist als der Ausgang kann der FIFO ja theoretisch nie voll laufen. Du hast ja nur alle 8 Eingangstakte ein Wort am Ausgang stehen, also mit 2MHz. Wenn du das mit 26 MHz abholst, bist du ja auf jeden Fall schnell genug....egal ob nun Fifo als SR oder ein normales SR.
Oh, vielleicht hab ich ein Bisschen überladen formuliert: Ich hole viel langsamer am Ausgang des FIFOs ab, nämlich mit 115200 baud. Die Daten kommen ins FIFO mit 16MHz rein. Die 26MHz habe ich nur erwähnt, weil ich mir damit meine 115200Hz Clock erzeuge.
Achso. Naja, dafür gibts das Full-Flag. Du musst das Einschreiben natürlich stoppen, wenn der FIFO voll ist. Wenn das nicht möglich ist, hast du einen konzeptionellen Fehler. Ob FIFO oder nicht, die durchscnittliche Datenrate bestimmt der langsamste. Schneller als deine 115200 kriegst du die Daten nicht weg, ob mit oder ohne FIFO.
Jo, alles klar. Dann hab ich mir das doch richtig zusammengereimt :) Muss mal zusehen, dass ich die Baudrate etwas schneller bekomme. Noch zur Handhabung des FIFOs: Kann es Lesen und schreiben gleichzeitig, oder muss man das zusätzlich mit Logik überwachen?
Lesen und Schreiben sind bei einem asynchronen FIFO 2 völlig getrennte Sachen, geht also gleichzeitig.
@ Christian R. (supachris) >Lesen und Schreiben sind bei einem asynchronen FIFO 2 völlig getrennte >Sachen, geht also gleichzeitig. Das sind sie auch bei einem SYNCHRONEN FIFO! Sonst wär es ja reichlich sinnfrei. MfG Falk P S Jaja, ich weis, Altera hat mal ein cycle shared FIFO "erfunden" um die Unzulänglichkeiten ihrer BRAMs, die damals nur einen echten Port hatten, zu umschiffen. Dort konnte man abwechselnd nur lesen oder schreiben. Ist aber alles nur ein Workaround!
Falk Brunner schrieb: > @ Christian R. (supachris) > >>Lesen und Schreiben sind bei einem asynchronen FIFO 2 völlig getrennte >>Sachen, geht also gleichzeitig. > > Das sind sie auch bei einem SYNCHRONEN FIFO! Sonst wär es ja reichlich > sinnfrei. Sicher, ich meinte eher, dass man beim asynchronen FIFO das auch noch in 2 völlig getrennten Takt-Domänen machen kann. (Also zumindest was Xilinx unter synchron/asynchron FIFO versteht) Ist halt eh bissl widersprüchlich, synchrone Ansteuerung haben ja beide...naja.
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.