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 :) ?
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
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
@ 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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.