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