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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.