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 :-)
Dazu kannst Du das VHDL Fixed-Point Package verwenden, siehe hier: http://www.codelooker.com/dfilec/0381fixedpointpackage/Fixed_ug.pdf
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.