www.mikrocontroller.net

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


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorzeichen merken ist aber doch eine Fallunterscheidung, oder?

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.