Forum: FPGA, VHDL & Co. signed und unsigned fixed-point multiplizieren?


von Robert (Gast)


Lesenswert?

Hallo,

ich arbeite das erste mal mit signed-Vektoren in VHDL und müsste eine 
Multiplikation durchführen, zwischen einem 16-bit Signed Vector (also 
-32768 bis +32768) und möchte einen faktor zwischen 0.0 bis 3.0 
reinmultiplizieren (also nur positiver faktor, dafür aber 
Nachkommastellen).


Allerdings fehlt mir im Moment das Vorstellungsvermögen dafür etwas.
Könnt ihr mir bitte auf die Sprünge helfen?

Danke :-)

von Vancouver (Gast)


Lesenswert?

Dazu kannst Du das VHDL Fixed-Point Package verwenden, siehe hier:

http://www.codelooker.com/dfilec/0381fixedpointpackage/Fixed_ug.pdf

von Robert (Gast)


Lesenswert?

Habe die Library schon gesehen, wollte es aber vermeiden diese zu 
nutzen.

WÜrde es gerne selber verstehen.

Ich multipliziere z.B. zwei signed-Vektoren mit 16 bit -> kommt ein 32 
bit Ergebnis raus.


Nehmen wir mal an, Vektor A ist +750 (signed 16 bit).
Vektor B ist soll z.B. 2.5 darstellen (würde dafür auch einen signed 16 
bit Vektor nehmen).
Das heißt Bit(15) ist das Sign-Bit, Bit 14:13 geben Zahlenbereich von 
0..3 an.. Der Rest ist dann Fraktional also Bit 12:0 ... Heißt also ich 
muss die 2.5*(2^13) nehmen. Macht also 20480.

Nach der Multiplikation von den zwei signed 16-bit vektoren von +750 und 
+20480 habe ich 15360000. Anschließend mache ich ein arithemtisches 
Rechtsshift von 13 Bits mit Shift_Right. Dann komme ich ja erstmal 
korrekterweise auf 1875.
Allerdings habe ich dann einen 19-Bit Vektor.

Bit(19) ist das Sign-Bit.

Wenn ich dann aber wieder einen 16 Bit Vector haben will (gehen wir mal 
davon aus, dass nach der Multiplikation die 32768 nicht überschritten 
werden würde), muss ich dann mit resize() wieder zu 16 Bit machen. 
Korrekt?

von Vancouver (Gast)


Lesenswert?

Im Prinzip richtig, aber durch den Rechts-Shift verlierst du natürlich 
alle Nachkommastellen. Wenn Du die nicht brauchst - ok, aber du solltest 
noch das erste Nachkommabit auf den ganzzahligen Anteil draufaddieren um 
den Rundungsfehler klein zu halten.
Du darfst die 2.5 vorher natürlich nicht explizit mit 2^13 
multiplizieren. Sie ist bereits mit 2^13 multipliziert durch die 
1:2:13-Darstellung im 16-Bit-Vektor.


Zum Lernen das Ganze mal zu Fuß zu machen, ist ok. In einem richtigen 
Design solltest du die FP-Library benutzen, sonst wird das ganze sehr 
fehleranfällig und der Code kaum lesbar.

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.