Forum: FPGA, VHDL & Co. Frage zur Rundung bei integer in VHDL


von Frank (Gast)


Lesenswert?

Ich habe einen Wert, der aus einem Berechungsalgo kommt und im Format 
8.2 dargestellt wird, d.h. Wert von -127 bis 127 und 2 Nachkommastellen.

Ich will nun den Wert auf -31.0 bis 31.0 reduzieren,  wobei ich ja 4 
Stellen verwerfen muss. Wie kann ich das richtig runden?

Wenn ich wie üblich 0,5 addiere, verschiebt sich doch das Fenster, d.h. 
eine 27.5 wird auf 28 aber ein -27.5 auf -27 geschoben.

Wie macht man das?

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


Lesenswert?

Das ist kein VHDL-spezifisches Problem, sondern ein allgemein ein 
Problem bei der Division von vorzeichenbehafteten Zahlen:
Beitrag "Integer-Division durch Zweierpotenz - immer synthetisierbar?"

Frank schrieb:
> Wenn ich wie üblich 0,5 addiere, verschiebt sich doch das Fenster, d.h.
> eine 27.5 wird auf 28 aber ein -27.5 auf -27 geschoben.
Und das ist auch richtig so, wenn "aufgerundet" werden soll. Denn 
"aufgerundet" heißt: zu positiven Zahlen hin...

Es sei denn, du willst ein ganz anderes Rundungsverfahren:
http://de.wikipedia.org/wiki/Rundung

von Frank (Gast)


Lesenswert?

Also es ist so, daß die Werte, die gezeigt werden, z.B. Folgende sind

00000101.01 ->  9.25
00001110.10 -> 14.50
00011101.11 -> 29.75

Relevant sind die ersten 6 Stellen, also:

000001/0101 -> +1.2x  -> 1.0
000011/1010 -> +3.5x  -> 4.0
000111/0111 -> +7.2x  -> 7.0

Aber:

111110/1010 -> -1.2x  -> -1.0
111100/1101 -> -3.5x  -> -4.0
111000/1000 -> -7.2x  -> -7.0

Die Rundung würde nicht funktionieren. Muss ich dann eine 
Fallunterscheidung +/- machen?

von Frank B. (foobar)


Lesenswert?

Nein, eine Fallunterscheidung brauchst du nicht unbedingt, du könntest 
auch das Vorzeichen merken, dann Absolutbetrag ausrechnen, runden und 
das Vorzeichen wieder anbringen. Kann u.U. insgesamt einfacher als eine 
Fallunterscheidung sein, wenn deine Rundungsimplementierung kompliziert 
ist.

von Oli P. (Gast)


Lesenswert?

Vorzeichen merken ist aber doch eine Fallunterscheidung, oder?

von Frank B. (foobar)


Lesenswert?

Nein: Vorzeichen=signum(Wert), NeuerWert=Vorzeichen*round(abs(Wert)). 
Kommt aber immer drauf an, was man im FPGA für Rechenoperationen hat, 
daher ist zumindest am Ende eine Fallunterscheidung statt der 
Multiplikation wohl besser.

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.