www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Ansteuerung einer FIFO mit 2 Takten


Autor: Sludig (Gast)
Datum:

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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt nur beim Fifo Generator einstellen, daß Du 2 verschiedene Takte 
verwenden willst.
Oder wo liegt das genaue Problem?

Autor: Sludig (Gast)
Datum:

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

Autor: Falk (Gast)
Datum:

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

Autor: Sludig (Gast)
Datum:

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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich jedoch das WR_En erst mit dem Lesetakt setze

Das Write Enable muß auf der Schreibseite natürlich mit dem Schreibtakt 
gesetzt werden !!!

Autor: Klaus Falser (kfalser)
Datum:

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

Autor: Sludig (Gast)
Datum:

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

Autor: Bene (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: Bene (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: Bene (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lesen und Schreiben sind bei einem asynchronen FIFO 2 völlig getrennte 
Sachen, geht also gleichzeitig.

Autor: Falk Brunner (falk)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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