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


von Heinz (Gast)


Angehängte Dateien:

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

von Gast (Gast)


Lesenswert?

1
 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

von Gast (Gast)


Lesenswert?

1
-- 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

von Gast (Gast)


Lesenswert?

1
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

von Heinz (Gast)


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.

von Heinz (Gast)


Lesenswert?

Des Rätsels Lösung:
1
             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?

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.