Forum: FPGA, VHDL & Co. signed Typen bei MUL besser nutzen


von Rechenkönig (Gast)


Lesenswert?

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.

von D. I. (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Rechenkönig (Gast)


Lesenswert?

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

von Rechenkönig (Gast)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von J. S. (engineer) Benutzerseite


Lesenswert?

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