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?
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
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?
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.
Vorzeichen merken ist aber doch eine Fallunterscheidung, oder?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.