Ich hätte zwei Fragen zu dem Thema signed/unsigned hinsichtlich der Multiplikation: Bei der MUL zweier Werte von (7 downto 0) vom Typ unsigned erhalte ich als Maximalergebnis 255*255 und damit weitgehend ausgelastete 16 Bit als Ergebnis. Bei der gleichen MUL vom Typ signed aber maximal (-128)*(-128) und damit einen weitgehend leeren 15 Bit Vektor und eines fürs Vorzeichen. 1) Wenn ich den Wertebereich auf -127 begrenze, könnte ich doch ein Bit sparen und die Dynamik der Rechung erhöhen, oder? Es geht mir um eine MUL im Bereich +/- 99%, die ich mit z.B. 127/64 (ca 1,9) oder 64/64 (1,0) oder auch 32/64 (ca 0,5) realisiere. Ich hätte gern ein Bit mehr, möchte also z.B. den Wert (8 Bit) mit dem Korrekturfaktor (9 Bit) belegen. In einem anderen Modul brauche ich zudem nur Faktor +/- 1,4 damit könnte man noch mal ein Bit weniger im Ergebnis haben, weil 1,4*1,4 < 2. Bzw ich kann den Korrekturfaktor mit 10 Bit codieren, ohne überzulaufen. 2) Kann ich die Wertebereichsbegrenzung in VHDL durch den range irgendwie automatisch berücksichtigen lassen, sodass die Vektorlängen bei der Synthese richtig geprüft werden? Bisher muss ich immer mit einem Zwischenergebnis rechnen und die nicht mehr beweglichen Bits ignorieren. Heinweis: Ich kann keine numeric lib verwenden, weil der Code teilweise mit altem Zeug automatisch erzeugt wird und ich die LIBs nicht ändern kann.
naja wenn du die multiplikationen auf hardware-muls abbildest kann dir das relativ wurst sein, da die 18x18 groß sind. Anders siehts aus wenn du die kombinatorisch aus LUTs aufbaust.
Rechenkönig schrieb: > 1) Wenn ich den Wertebereich auf -127 begrenze, könnte ich doch ein Bit > sparen und die Dynamik der Rechung erhöhen, oder? Wenn du den Wertebereich auf -127 begrenzt, dann hast du eine Konstante mit dem Wert -127.... ;-) Rechenkönig schrieb: > 2) Kann ich die Wertebereichsbegrenzung in VHDL durch den range > irgendwie automatisch berücksichtigen lassen, sodass die Vektorlängen > bei der Synthese richtig geprüft werden? Nein, denn du definierst z.B einen integer range -20 to 100 dann wird der trotzdem 8 Bit breit synthetisiert werden. Die Synthese ist so einfach gestrickt und erkennt nicht, dass der hier verwendete Zahlenbereich (123 Werte) locker in 7 Bits passen würde. Denn die vom Synthesizer verwendete Arithmetik verlässt sich aufs Zweierkomplement...
Es geht mir um die richtige und zugleich einfache Formulierung - vor allem auch für die Simulation. Hier ist nochmal ein Beispiel der Überlegung 1: Operator 1 Operator 2 Multiplikation 8 9 17 Signed Min 0 0 Max 255 511 130305 16,99 17,00 0 Unsigned Min -128 -256 32768 15,00000 16,00 !!! Max 127 255 32385 14,98304 15,00 -128 255 -32640 14,99435 15,00 127 -256 -32512 14,98868 15,00
Lothar Miller schrieb: > Die Synthese ist so > > einfach gestrickt und erkennt nicht, dass der hier verwendete > > Zahlenbereich (123 Werte) locker in 7 Bits passen würde ok, das hatte ich wegen des zeitgleichen postings überlesen ok, dachte ich mir schon. Wie sieht es mit den komplexereb Entwurfstools wie Matlab aus? Können die sowas?
Rechenkönig schrieb: > Wie sieht es mit den komplexereb Entwurfstools wie Matlab aus? Können > die sowas? Nein, denn du bräuchtest dazu ja auch eine asymmetrische Zahlendarstellung und eine entsprechende asymmetrische Algorithmik. Denn du änderst ja nicht die Bituster, sondern nur ihre Bedeutung. Mal angenommen, du willst Zahlen von -2 bis 5 darstellen. Im Zweierkomplement also so
1 | -2 -1 0 1 2 3 4 5 |
2 | 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 |
Ein ziemlicher Overhead für 8 Zahlen: 100% mehr hätten Platz... Dein tolles neues Zahlenformat packt die 8 "Zustände" in eine andere Bitreihenfolge, du brauchst damit nur noch 3 Bits:
1 | -2 -1 0 1 2 3 4 5 |
2 | 100 101 110 111 000 001 010 011 |
Klar hast du jetzt einen schön kompakten Zahlenraum, aber die Rechenregeln sind deutlich komplizierter als bei der Zweierkomplementdarstellung...
Rechenkönig schrieb: > Wie sieht es mit den komplexereb Entwurfstools wie Matlab aus? Können > die sowas Nicht wirklich. Bei MATLAB/Simulink z.B. muss man die Vektorbreiten selber setzen, statt sie sich ausrechnen lassen zu können. Er instanziiert dann einen entsprechend breiten Multiplier als Primitive und zwar genau mit den richtigen Vektorlängen. Was er dann später bei der Synthese draus macht, ist nochmal was anderes.
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.