www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Wer versteht den Synthesizer?


Autor: Heinz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

für eine kleine Sprite-Engine möchte ich aus den Pixelkoordinaten die 
zugehörige Adresse im RAM berechnen. Auflösung soll 640 x 480 sein (der 
ein oder andere mag es sich schon gedacht haben ;))

Zum eigentlichen Problem: Der Synthesizer braucht mehr Resourcen, je 
schlauer ich versuche das ganze zu beschreiben. Den Multiplizierer kann 
man ja noch recht einfach loswerden und daraus 2 19-bit Addierer machen. 
Die unteren Lösungen resultieren auch schön brav in den beschriebenen 
16-bit bzw. 12-bit Addierern, brauchen allerdings mehr slices...

Die einzige Erklärung die mir plausibel erscheint ist, dass durch die 
vielen LSB 0en bei den 19-bit Addierern der Synthesizer sowieso schon 
optimiert bzw. es überhaupt erst kann.

Was meint Ihr?

Ciao

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 pix_addr <= (640 * pix_y) + pix_x; -- geht nicht, weil "640" zu "512" wird. siehe Definition von * in numeric_std!!

Ööööh ... das hört sich nach einem Fehler an ... Zur Not musst du das 
Zeugs halt in einen größeren Vektor konvertieren ... Geht aber sicher!

Grüße
Gast

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-- pix_addr <= ((to_unsigned(640, 10) * pix_y)) + pix_x; -- 10 slices, 19 luts, 1 mul

Ahso, eh so probiert ...

Warum knauserst du denn sooooo mit Slices und luts?

Effizienz bedeutet nicht nur mit wenig Resourcen wie möglich 
auszukommen, sondern auch wieviel Zeit man benötigt um etwas entwickelt 
zu haben. Glaub du machst dir für das, was da rauskommen soll, zuviel 
Arbeit ...

Grüße
Gast

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pix_addr <= pix_y & "000000000" + pix_y & "0000000" + pix_x;

6 slices, 14 luts.

kommt von:
y*640+x = y*(512+128)+x = y*512+y*128+x = y << 9 + y << 7 + x

Grüße
Gast

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem Fall mach ich mir mit Sicherheit zu viel Arbiet, das Ganze soll 
ja der persönlichen Weiterbildung dienen. Ich will das Zeug ja verstehen 
und daraus lernen und nicht nur hinschreiben können. Ich habe bisher 
gelernt,
- dass bei unsigned * natural gnadenlos nur auf die Breite des unsigned 
geachtet wird
- dass der synthesizer nur Multiplikationen mit 2**x als Addition 
darstellt, und keine Kombinationen davon
- dass 2 19-bit Addierer angeblich weniger Resourcen verrauchen, als 
wenn man einen davon durch einen 16-bit oder gar 12-bit Addierer ersetzt 
-> und genau das ist mir nicht ganz klar

Deinen Vorschlag hatte ich so natürlich auch schon dastehen. Leider 
funktioniert er nicht ganz, weil das carry-bit fehlt.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Des Rätsels Lösung:
             dummy := '0' & pix_y & "00" + pix_y;  pix_addr <= (dummy + pix_x(9 downto 7) & pix_x(6 downto 0)); --  7 slices, 14 luts 

Damit werden 2 12-bit Addierer draus -> 7 slices, 14 luts. Ich frage 
mich nur, warum der Synthesizer das nicht immer erkennt. Bei den beiden 
"19"-bit Addierern schafft er es offensichtlich. Gibt es dazu 
irgendwelche Regeln?

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.