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