www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Umrechnung in IEEE754

Autor: Thomas Oberrauner (Gast)
Datum: 16.05.2008 15:34

Hallo liebes Forum,
ich habe im Rahmen eines VHDL Projektes die Aufgabe 2 32BIT Werte zu
teilen.
Da diese leicht unterschiedlich sind, werden Werte im Bereich von 1.XXX
und 0.9XXX. Dazu habe ich eine floating point unit initialisiert. Diese
arbeitet wunderbar. Ich bekomme das Ergebnis in der IEEE754 Notation und
kann damit wunderbar weiter arbeiten. Leider erwartet diese fpu auch
IEEE754 Werte.

Nun zu meiner Frage:
Mit der IEEE754 Darstellung habe ich einen Wertebereich von 3.4e38 bis
1.175e-38 abdecken. Daher sollte es möglich sein, z.B. die Dezimalzahl
4294967295.0 in das IEEE754 Format zu bekommen.

Die Formel z = Vorzeichen  Matisse  2^Exponent ist mir auch bekannt,
nur habe ich keine Idee wie ich das in VHDL umsetzen kann. Gibt es einen
Algorithmus? Ich würde dies gerne in einer Funktion abhandeln, wie
"to_float( std_logic_vector )"

Vielen Dank für Eure Hilfe,

Thomas
Autor: Günter -.. (guenter)
Datum: 17.05.2008 08:30

Thomas Oberrauner wrote:
> Hallo liebes Forum,
> ich habe im Rahmen eines VHDL Projektes die Aufgabe 2 32BIT Werte zu
> teilen.
> Da diese leicht unterschiedlich sind, werden Werte im Bereich von 1.XXX
> und 0.9XXX. Dazu habe ich eine floating point unit initialisiert. Diese
> arbeitet wunderbar. Ich bekomme das Ergebnis in der IEEE754 Notation und
> kann damit wunderbar weiter arbeiten. Leider erwartet diese fpu auch
> IEEE754 Werte.
>
> Nun zu meiner Frage:
> Mit der IEEE754 Darstellung habe ich einen Wertebereich von 3.4e38 bis
> 1.175e-38 abdecken. Daher sollte es möglich sein, z.B. die Dezimalzahl
> 4294967295.0 in das IEEE754 Format zu bekommen.

Du gibst hier den Wertebereich für die normalisierte Form des Single
Precision Format an. Das Format verwendet eine Mantisse von 23 bit +
implizierten Bit. Wenn du deine 32 Bit Zahl in das Format wandelst,
wirst du an Genauigkeit verlieren. Ist das akzeptabel?

>
> Die Formel z = Vorzeichen  Matisse  2^Exponent ist mir auch bekannt,
> nur habe ich keine Idee wie ich das in VHDL umsetzen kann. Gibt es einen
> Algorithmus? Ich würde dies gerne in einer Funktion abhandeln, wie
> "to_float( std_logic_vector )"

Bei der normalisierten Form ist das binäre Komma links vom msb der
Mantisse. Hinzu kommt das die Mantisse so normalisiert wird, damit das
Bit msb+1 immer gesetzt ist. Du musst also deine 32 bit Zahl so
verschieben, damit das höchst gesetzte Bit in deiner Zahl auf Bit
Position 24 in der Mantisse landet. Dann musst du den Exponent anpassen,
damit deine Zahl noch dem Wert entspricht den vorher die 32 Bit Zahl
hatte.

Nehmen wir mal als Beispiel die dezimale Zahl 5, binär b0101. Das binäre
Komma steht hier rechts von Bit 0.

Der erste Schritt ist, das Komma so zu verschieben und den Exponent
anzupassen, damit es rechts vom höchsten gesetzten Bit steht. Hier also
rechts von Bit 2. Damit muss der Exponent den Wert 2 haben.

Im nächsten Schritt muss dieses Bitmuster so nach links geschoben
werden, damit Bit 2 zum Bit 24, dem implizierten Bit, der Mantisse wird.

Das Beispiel zeigt aber auch, dass im Fall einer 32 Bit Zahl es
vorkommen kann, dass Bits abgeschnitten werden müssen um in die 23+1
Mantisse zu passen.

Gruß,

Günter
Autor: Thomas Oberrauner (Gast)
Datum: 17.05.2008 11:57

Hallo Günter,
vielen Dank für deine Hilfe.
Es ist so, ich habe eine Funktion in VHDL geschrieben, die den
Exponenten errechnet, das höchste Bit sucht...so wie du es beschrieben
hast und es auch bei wikipedia (http://de.wikipedia.org/wiki/IEEE_754)
beschrieben ist.
Das funktioniert bei kleinen Kommazahlen wie 18.4 ganz gut.
Mein Problem ist nur, ich habe einen 32Bit Hexwert, dieser muß
vorzeichenrichtig in eine IEEE754 konforme Darstellung gebracht werden.
Klar, es handelt sich nicht um eine Kommazahl. Leider benötigt meine
Floating Point Unit als Eingangswerte diese.

Was ich vorhabe:
Ich habe einen Timestamp. Es handelt sich dabei um einen 32Bit Wert.
Dieser wird von 0xFFFFFFFF zurück gezählt. Ich habe nun zB den Wert
0xFFFFE001 was im 10er System 4294959105 (Dezimal) entspricht. Diese
Zahl will ich nun in eine IEEE754 Zahl umwandeln.
Wenn ich mit diesem Rechner:
http://babbage.cs.qc.edu/IEEE-754/Decimal.html
4294959105 (Dezimal) eintippe spuckt er mir 0x4F7FFFE0 aus. Mit dieser
Zahl kann ich wunderbar weiterarbeiten. Klar verliere ich Genauigkeit.
Diese ist aber in diesem Fall nicht ausschlaggebend.

Mein Ziel ist es aus 0xFFFFFFFF -> DEC -> IEEE754 FP Zahl zu machen.

Ich hoffe es ist nicht zu verwirrend...

Grüße,
Thomas
Autor: Günter -.. (guenter)
Datum: 17.05.2008 13:11

Thomas Oberrauner wrote:
[...]
> Mein Problem ist nur, ich habe einen 32Bit Hexwert, dieser muß
> vorzeichenrichtig in eine IEEE754 konforme Darstellung gebracht werden.
> Klar, es handelt sich nicht um eine Kommazahl. Leider benötigt meine
> Floating Point Unit als Eingangswerte diese.

Das sollte eigentlich recht einfach sein. Da es sich um einen Timestamp
handelt, gehe ich davon aus das es sich um einen unsigned integer
handelt?

In dem Fall musst du dir keine Gedanken um das Vorzeichen machen und
kannst das Sign Bit immer auf 0 setzten.

>
> Was ich vorhabe:
> Ich habe einen Timestamp. Es handelt sich dabei um einen 32Bit Wert.
> Dieser wird von 0xFFFFFFFF zurück gezählt. Ich habe nun zB den Wert
> 0xFFFFE001 was im 10er System 4294959105 (Dezimal) entspricht. Diese
> Zahl will ich nun in eine IEEE754 Zahl umwandeln.

Wenn dein Wert 0xFFFFE001 ist, dann ist das Komma rechts von Bit 0. Wie
gesagt, für die Mantisse brauchst du es rechts vom höchsten Bit das
gesetzt ist. In deinem Fall ist das Bit 31. Also, der Exponent wird auf
den Wert gesetzt wie weit du das Komma hoch schieben musst. Von Bit 0
auf Bit 31 sind 31 mal schieben.

Dein Exponent hat also den Wert 31, du musst nur noch darauf achten das
der Exponent mit einen Bias behaftet ist, damit er nicht negative wird.
Für Single Precision ist der Wert 127. Also 127+31 ist dein Exponent.

Für die Mantisse musst du jetzt das höchste gesetzte Bit, hier Bit 31,
als impliziertes Bit nehmen. Das fällt also Weg. Damit wird deine
Mantisse Bit 30 ... Bit 7 von deinem unsigned interger Wert. Die Bits
6..0 kannst du Wegwerfen, kannst aber auch noch eine Rundung
durchführen. D.h. wenn Bit 6 gesetzt ist, dann addiere 1 zu Bit 7.

Den Umweg über Dezimal sehe ich jetzt nicht als notwendig an, außer um
es zu verstehen. Aber die Logik kennt kein Dezimal.

[...]
>
> Mein Ziel ist es aus 0xFFFFFFFF -> DEC -> IEEE754 FP Zahl zu machen.

Mit der obigen Beschreibung hast du 0xFFFFFFFF -> FP Zahl.
Autor: Thomas Oberrauner (Gast)
Datum: 18.05.2008 15:17

Hi Günter,
ich hab das eben nochmals mit dem IEEE754 Rechner verglichen....klasse.
Ich denke daraus kann ich eine VHDL Funktion machen und meine Timestamps
umrechnen.
Du hast recht, das VZ ist mir egal. Ich brauch nur den Timestamp A /
Timestamp B.
Da meine Timestamps von FFFF -> 0000 gehen werde ich dann auch keine
Probleme bei kleineren Zahlen haben. Es sind ja alles Integerzahlen.

Du hast mir sehr geholfen, das IEEE754 Format bei "größeren" Zahlen zu
verstehen.

Vielen Dank nochmals.

Grüße,
Thomas

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net