signed und unsigned fixed-point multiplizieren?

Gast #5496611
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 :-)
Gast #5497372
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?
Gast #5497485
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.