Forum: FPGA, VHDL & Co. FIFO in ISE benutzen


von Hans (Gast)


Lesenswert?

Hallo

Ich habe mit dem „IP CORE Generator & Architecture Wizard“, speziell mit 
dem „Fifo Generator 8.2“ der „ISE 13.2“ von Xilinx, einen FIFO für einen 
Spartan3 FPGA erzeugt. Der FIFO hat unabhängige lese und schreib Clocks 
eine eingangsbreite von 32Bit und am Ausgang 16Bit. Und einen Valid 
Ausgang, ansonsten wurde der Fifo mit Standard Einstellungen generiert.

1) Wie benutze ich den Fifo? Die Dokumentation ist nicht sonderlich 
hilfreich gewesen.

Bis jetzt hab ich die zwei Codeschnipsel aus dem „View HDL Instantiation 
Templet“ in den Kopf und Body meiner Architecture kopiert und mit 
Variablen verknüpft. Das Bit-File zum programmieren lässt sich auch 
fehlerfrei erzeugen und übertragen. Allerdings werden keine Daten in den 
FIFO übernommen. Der Ausgang FIFO Empty bleibt immer auf '1';

2) Muss in dem Projekt noch mehr geändert werden um den Fifo zu 
verwenden?

Ich hab mir das Beispiel-Projekt „wave_gen_vhd“, mit dem CharFIFO 
angeschaut, konnte daraus aber nicht auf meinen Fehler schließen.

3) Muss der im FIFO verwendete Speicher unabhängig über einen „IP CORE 
Generator & Architecture Wizard“ erzeugt werden?

4) Ist es mit minimalen VHDL Kenntnisse überhaupt möglich oder gibt es 
einfachere oder bessere Lösungen?

5) Kann jemand ein einfaches Beispielprojekt anbieten? Das nicht so 
überladen ist wie die Xilinx ISE Beispiele.

Danke

von Christian R. (supachris)


Lesenswert?

Du musst nur den Schreib- und den Lesetakt durchgehend laufen lassen. 
Bei jeder steigenden Flanke bei aktiviertem Write Enable wird das Wort 
am Eingang reingeschrieben und erscheint ein paar Takte später am 
Ausgang. Wenn voll, dann darfst du nicht schreiben, und wenn leer darfst 
du nicht lesen. Die Flags sind schon auf die jeweilige Taktdomäne 
synchronisiert.
Hast du denn eine Testbench? Welchen Simulator benutzt du? Ist dort das 
VHDL-File des FIFO korrekt eingebunden? Den Speicher im FIFO musst du 
nicht extra instanziieren, das macht ja der Core. Wird denn der BlockRAM 
überhaupt verwendet? Das siehst du ja in der Übersicht nach der Synthese 
schon. Schau dir die Warnungen an, vielleicht hast du was nicht belegt 
und der FIFO wurde einfach wegoptimiert. Oder hast du RST dauerhaft auf 
High?

von Hans (Gast)


Lesenswert?

Hallo,

liegt das Problem vielleicht daran ,dass ich nur einen externen Tackt 
von 30MHz verwende. Dieser wird zum schreiben auf 3MHz herunterteile und 
das auch nur wenn ein externer Pin High ist. Zum Lesen benutze ich die 
30MHz aber auch nur wenn bestimmte Bedingungen erfüllt sind.
„Reset“ hab ich natürlich auf LOW, „rw_en“ „rd_en“ auf HIGH. Ich werde 
mal ein neues Projekt nur mit einen Fifo und einem Zähler zum Testen 
aufbauen. Wird für FIFOs intern noch ein spezieller systemtackt 
benötigt?

Die Warnungen beziehen sich vorwiegend nicht auf den FIFO, nur die die 
auf die Verwendung eines BlackBox-Modul hinweist. Die übrigen Warnungen 
werden dadurch verursacht, dass ich zum Testen einen Zählerwert in FIFO 
schreib anstelle meiner Messwerte. Kann es sein, dass dadurch teile vom 
FIFO weg optimiert werden?

Momentan benutze ich noch keine Testbench, sondern arbeite nur mit einem 
Experimentierboard von ZTEX. Das Debuggen läuft bei mir bis jetzt nur 
übers Oszilloskop. Testbenchs habe ich bis jetzt nicht gebraucht. Gibt 
es einen gute kostenlose Testbenchs die man empfehlen kann?

In der Zusammenfassung vor dem FIFO Generieren steht:
“Block RAM resource(s) (18K BRAM): 2
BRAM in 32/36-bit wide configuration prevents the use of the associated 
dedicated multiplier. For more information, refer to the Multiplier 
Block RAM Routing Interaction selection in the Spartan-3 user guide.”

Danke für die Anregungen, langsam gehen mir doch die Ideen aus.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hans schrieb:
> Gibt es einen gute kostenlose Testbenchs die man empfehlen kann?
Die kannst nur du selber definieren, weil nur du selber deine Hardware 
"drumrum" kennst.

Hans schrieb:
> Dieser wird zum schreiben auf 3MHz herunterteile und
> das auch nur wenn ein externer Pin High ist.
Ein Gated Clock ist gern mal die Ursache für Probleme...
Wo teilst du den herunter? Im FPGA?
Wie synchron ist der externe Takt zum externen Enable?
Woher kommen diese Signale?

von Christian R. (supachris)


Lesenswert?

Das mit dem Clock ist Murks. Ich meine, im Datenblatt des FIFO Cores 
gelesen zu haben, dass der beide Clocks dauerhaft braucht. Dafür gibts 
die wr_en und rd_en Signale. Bau das mal um und schreib dir eine 
einfache Testbench um das ganze zu simulieren.

von Klaus F. (kfalser)


Lesenswert?

Hans schrieb:
> liegt das Problem vielleicht daran ,dass ich nur einen externen Tackt
> von 30MHz verwende. Dieser wird zum schreiben auf 3MHz herunterteile

Warum soll das notwendig sein?
Einen Takt herunterteilen macht nur Schwierigkeiten.
Lass das FIFO auf der Eingangsseite mit 30 MHz laufen, das schafft das 
schon!

von Klaus F. (kfalser)


Lesenswert?

Christian R. schrieb:
> Ich meine, im Datenblatt des FIFO Cores
> gelesen zu haben, dass der beide Clocks dauerhaft braucht.

Das kann ich bestätigen. Eingangs- und Ausgangclocks müssen dauernd 
laufen!

von Hans (Gast)


Lesenswert?

Hallo

der Fehler lag an der „variablen“ Taktung von "rw_ckl" und "rd_clk". Mit 
fest definirtem Read- and Write-Clock und den Enable-Eingängen zur 
Steuerung funktioniert der FIFO einwandfrei.
Liegt bei genauer Betrachtung auch nahe, dass ein Clock eine definierte 
Frequenz voraussetzt, und nicht über längere Zeit aussetzen darf. Ich 
hacke das als Anfängerfehler ab, ich bin halt noch neu auf dem Gebiet.

@ all:
Danke für die schnelle und gute Hilfestellung.

Grüße Hans

von Christian R. (supachris)


Lesenswert?

Naja, man kann das (spezielle bei den neuen FPGAs) schon machen, um 
Strom zu sparen. Allerdings sollte man dann ganz genau wissen, was man 
tut. Direkt nach dem Schreiben beispielsweise braucht ja der FIFO noch 
ein paar Takte, um die Flags zu aktualisieren und die Daten auf die 
andere Seite zuschaffen. Da muss der Takt natürlich noch anliegen.

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
Noch kein Account? Hier anmelden.