Forum: FPGA, VHDL & Co. VHDL 95% LUTs, wieso so viele?


von Waldemar M. (waldi3141)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen :)

Ich habe das Digilent ARTY Board.
Mein Design benötigt zu viele LUTs.

Was habe ich gemacht:

Ein type array im package erstellt 340 mal 24Bit -> Bild 1

Nun bekommen ich Daten von einem I2S Interface , 4 Kanäle, immer 24Bit 
werte,
die speichere ich im Array im TopModul -> Bild 2

Das validsignal signalisiert, dass neue Daten anliegen und hat die 
Frequnez 96kHz.
Wenn ein Array gefüllt ist, übergebe ich an das Array, welches an 
Ethernet geht.

Dort(anderes Modul) wird das empfangene Array "immer 4 bit" mittels Case 
anweisung (25Mhz getriggert)verschickt -> Bild 3

Hab den Synthese-Report mal angehängt.


Habe auch mal Testweise das Array mit a 24 einsen und nullen gefüllt -> 
Bild 4, und interessanterweise braucht er da nur 13% der LUTs :S

Könnte mir ein schlauer Kopf Tipps geben woran das liegen könnte :) ?

von St. D. (st_d)


Lesenswert?

Im FPGA gibt es viele RAM Blöcke. Die muss man verwenden (explizit durch 
Xilinx core wie z.B. fifo generator oder implizit*), damit deine 
wertvolle LUTs nicht nur als Speicherzellen gebraucht werden!

* http://www.lothar-miller.de/s9y/categories/20-RAMFIFO

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


Lesenswert?

Waldemar M. schrieb:
> Mein Design benötigt zu viele LUTs.
> Was habe ich gemacht:
Du hast etwas nicht gemacht: das Array so beschrieben und angesteuert, 
dass es in ein RAM passt. Deshalb wird jede Speicherzelle auf einzelne 
Flipflops abgebildet.
Und in deinem 3.png sieht man einen Teil eines riesigen 
Megamonstermultiplexers. Der kostet dann auch noch einige LUTs zur 
Decodierung.

> Habe auch mal Testweise das Array mit a 24 einsen und nullen gefüllt ->
> Bild 4, und interessanterweise braucht er da nur 13% der LUTs :S
> Könnte mir ein schlauer Kopf Tipps geben woran das liegen könnte :) ?
Statische Daten --> heftigste Optimierung.

Fazit: um ein kompaktes und schnelles Design zu bekommen musst du die 
Komponenten deines Zielsystems kennen und vorteilhaft einsetzen... ;-)

> 4.PNG
VHDL-Code bitte als *.vhdl Datei anhängen.

: Bearbeitet durch Moderator
von Waldemar M. (waldi3141)


Angehängte Dateien:

Lesenswert?

@ St. D
> implizit
ich wollte es ja erst mal implizit versuchen, indem ich ein eigenes 
Array definiere. Die Leseadresse habe ich meines Wissens nach auch immer 
getaktet.

@Lothar Miller
> ...das Array so beschrieben und angesteuert,
dass es in ein RAM passt.
Wie groß darf es denn maximal sein, dass es in ein RAM passt?

>Und in deinem 3.png sieht man einen Teil eines riesigen
Megamonstermultiplexers.
Ja das ist blöd gemacht, habe aber auch eine Schleife, die das anders 
löst. Zeile 2925

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


Lesenswert?

Waldemar M. schrieb:
> Die Leseadresse habe ich meines Wissens nach auch immer getaktet.
Das ist hier nicht das Problem...

> Wie groß darf es denn maximal sein, dass es in ein RAM passt?
Das kommt auf dein FPGA an und steht in dessen Datenblatt.
Die Größe ist aber erstmal egal. Du musst die Beschreibung so gestalten, 
dass der Synthesizer überhaupt ein RAM draus machen kann. Wie das geht 
steht im Handbuch zum Synthesizer.
Wenn du auf mehr als 1 Wort pro Taktzyklus in deinem Array zugreifst, 
kann es kein RAM werden. Sieh dir einfach mal an, was ein RAM an 
Adress-, Daten- und Steuerleitungen hat. Damit musst du und der 
Synthesizer auskommen.

> habe aber auch eine Schleife, die das anders löst.
Und trotzdem wieder einen Multiplexer draus macht.
BTW: weißt du, was eine Schleife in VHDL tut?

: Bearbeitet durch Moderator
von Waldemar M. (waldi3141)


Lesenswert?

Danke für die Antworten, bin Student und seit 4 Wochen in VHDL 
unterwegs, deshalb für jeden Tipp dankbar!!

@Lothar Miller
>BTW: weißt du, was eine Schleife in VHDL tut?
Wenn du das "for ... loop.." meinst , dann  ja . Hatte unüberlegt 
schleife gesagt -.-"

Soo, ich habe jetzt aus dem Riesen-Array , 4 kleinere a 85 mal 24 Bit 
gemacht,
-> LUT 11% FF 53%, sieht (meiner Meinung nach) erst mal besser aus.
Bestimmt keine schöne Lösung ...

Ach , und vielleicht sollte ich mir mal den Fifo generator anschauen :S

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


Lesenswert?

Waldemar M. schrieb:
> sieht (meiner Meinung nach) erst mal besser aus.
> Bestimmt keine schöne Lösung ...
Ja, mit dem Holzhammer am Symptom herumgebastelt. Die eigentliche 
Ursache belibt weiterhin, dass du die falsche Ressource im FPGA 
verwendest.

> Ach , und vielleicht sollte ich mir mal den Fifo generator anschauen :S
Kannst du dein Problem mit einem Fifo erschlagen? Das Design ist doch 
vollkommen synchron. Dann ginge es auch ganz simpel mit einem DPRAM und 
zwei Pointern...

: Bearbeitet durch Moderator
von Vanilla (Gast)


Lesenswert?

Waldemar M. schrieb:
> Wenn ein Array gefüllt ist, übergebe ich an das Array, welches an
> Ethernet geht

genau da liegt dein Problem:

Du übergibst in einem Takt 8160 Bit und das ist kein RAM: Dort könntest 
du eben nur 24 Bit (in deinem Beispiel) in einem Takt weiterreichen...

Und wenn Du das so beschreibst bekommst Du es so von deinem Synthesetool 
geliefert (wenns das Bauteil hergibt)...

Gruss Vanilla

von Waldemar M. (waldi3141)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,
ich habe jetzt ein BRAM ( da SRAM genannt ) nach diesem Beispiel bei mir 
eingebunden(unter RAM MODULE zu finden):
http://esd.cs.ucr.edu/labs/tutorial/

Ich danke jeglicher Einbringung :)
Wie gesagt, ich bin noch im jungen Lernprozess.

Ich speichere jetzt die 4 Kanäle, an denen mit 96KHz a 24bit ankommen, 
"gemultiplexed" im BRAM(340x24).

Wenn der RAM einmal vollgeschrieben ist, pack ich alles mit einem Zähler 
wieder in ein 340x24-Array und übergebe es dem 'Ethernet'.

Ich frage mich, ob ich nicht wieder ankommende 24 Bit werte verliere 
während ich geladenes Array weitergebe und verschicke :/

Momentaner Gebrauch an Resourcen:
LUT 13% , FF 20% , BRAM 2% (anstatt wie vorher 1%)

die 13% und 20%  kommen vom siehe oben Bild3-1.Post

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Waldemar M. schrieb:
> Ich frage mich, ob ich nicht wieder ankommende 24 Bit werte verliere
> während ich geladenes Array weitergebe und verschicke :/
Klar kann das passieren. Daher nimmt man zwei Speicher und schaltet im 
richtigen Moment um. Voraussetzung ist, das Dein auslesen über Ethernet 
schnell genung geht...

Duke

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.