Forum: FPGA, VHDL & Co. Umrechnung in IEEE754


von Thomas Oberrauner (Gast)


Lesenswert?

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

von Günter -. (guenter)


Lesenswert?

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

von Thomas Oberrauner (Gast)


Lesenswert?

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

von Günter -. (guenter)


Lesenswert?

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.

von Thomas Oberrauner (Gast)


Lesenswert?

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

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.