Forum: FPGA, VHDL & Co. Fixed-Point Kehrwert in VHDL


von Mampf F. (mampf) Benutzerseite


Lesenswert?

Grias eich :)

Ich müsste eine Kehrwertbildung in VHDL umsetzen und hatte mir folgendes 
dazu gedacht:

Die Zahl x kann kann ich ähnlich wie bei der Logarithmisierung in 
Mantisse und Exponent zerlegen:

1/x = 1/M * 1/2^E

1/2^E ist nur simples Bit-schieben. Für den Kehrwert der Mantisse kann 
ich eine LUT mit z.B. 8Bit verwenden. Ich benötige insgesamt keine 
Multiplikation und nur einen Tabellenzugriff.

Ist recht simpel und schnell umgesetzt.

Mene Frage lautet: Weshalb findet man größtenteils iterative 
Approximationsverfahren nach Newton-Raphson?

Ist dieses Verfahren soviel genauer? Oder möchte man sich die LUT 
sparen? Darür benötigt man Multiplikationen, die teurer als Blockram 
sind ...

Weiß da jemand etwas?

Viele Grüße,
Mampf

von Sigi (Gast)


Lesenswert?

Mampf F. schrieb:
> 1/2^E ist nur simples Bit-schieben. Für den Kehrwert der Mantisse kann
> ich eine LUT mit z.B. 8Bit verwenden. Ich benötige insgesamt keine
> Multiplikation und nur einen Tabellenzugriff.
>
> Ist recht simpel und schnell umgesetzt.

Hängt von der Genauigkeit/Anz.Stellen ab, LUTs sind
aber schon ab ein paar Bits zu "klein", besser sind
hier die internen RAMs.

Mampf F. schrieb:
> Mene Frage lautet: Weshalb findet man größtenteils iterative
> Approximationsverfahren nach Newton-Raphson?

.. ob das wirklich die häufigste Methode ist? Schau mal
nach Div-Radix2, Div-Radix-4 oder CORDIC, die werden
auch verwendet (statt A/B einfach 1/B).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mampf F. schrieb:
> Ist recht simpel und schnell umgesetzt
Und hat wegen der 8 Bit Tabelle gerade mal zweieinhalb signifikante 
Stellen...

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Sigi schrieb:
> .. ob das wirklich die häufigste Methode ist? Schau mal
> nach Div-Radix2, Div-Radix-4 oder CORDIC, die werden
> auch verwendet (statt A/B einfach 1/B).

Danke! Ich hatte wohl falsch gesucht und deshalb nichts sinnvolles 
gefunden :)

von Sigi (Gast)


Lesenswert?

Lothar M. schrieb:
> Und hat wegen der 8 Bit Tabelle gerade mal zweieinhalb signifikante
> Stellen...

Nicht unbedingt: der Ausgangswert kann ja wenige Stellen
haben aber das Resultat mit wesentlich höherer Genauigkeit
in der Tabelle abgespeichert werden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am 
nächsten Morgen mit einem bösen Kater wieder ein...

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am
> nächsten Morgen mit einem bösen Kater wieder ein...

Ich hab nur Werte von 0 bis 1 ... Mit der LUT-Version hatte ich in etwa 
eine Abweichung von <0,01 vom errechneten Wert her. Prozentual habe ich 
es nicht ausgerechnet ... Bei 1/0,001 bekam ich 991,irgendwas ... wären 
auch nur 0,9% :)

von Lars R. (lrs)


Lesenswert?

Mampf F. schrieb:
> Lothar M. schrieb:
>> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am
>> nächsten Morgen mit einem bösen Kater wieder ein...

8 Bit rein, 8 Bit raus.

> ... Mit der LUT-Version hatte ich in etwa
> eine Abweichung von <0,01 vom errechneten Wert her. Prozentual habe ich
> es nicht ausgerechnet ... Bei 1/0,001 bekam ich 991,irgendwas ... wären
> auch nur 0,9% :)

Wie kommst Du mit einer 8Bit-LUT auf "991,irgendwas"? Das geben doch die 
8Bit überhaupt nicht her! Vor allem ",irgendwas"!


Angenommen, die 1,0 bearbeitest Du als Sonderfall.
Angenommen, die 0 bearbeitest Du als Sonderfall.
Angenommen, Du kannst hinreichend oft shiften.
Somit gehst Du für die 8Bit-LUT immer aus von: (0,1)xxxxxxxx
                    Adressleitungen 8-Bit LUT:      76543210

Somit ist 0,001d: (0,1)00000110b *2**(-9)

Somit liegt das Ergebnis zwischen 1b/0,100000000b=10,0b und
1b/0,111111111b=1.00392d


Angenommen, "1b/0,100000000b=10,0b" bearbeitest Du als Sonderfall.

Somit steht im Ergebnis immer eine 1 vor dem Komma.
Somit steht in der LUT (1,)xxxxxxxx.

Somit steht für (0,1)00000110b in der LUT (1,)11110100

(1,)11110100b * 2**9 =1111101000b=1000d

Mhh...

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Lars R. schrieb:
> Wie kommst Du mit einer 8Bit-LUT auf "991,irgendwas"? Das geben doch die
> 8Bit überhaupt nicht her! Vor allem ",irgendwas"!

Oh sorry, das war missverständlich ... Die LUT ist für eine 8Bit 
Mantisse, d.h. die Tabelle hat 255 Werte, aber die Werte in der Tabelle 
haben 24Bit.

Lars R. schrieb:
> Somit steht für (0,1)00000110b in der LUT (1,)11110100

siehe:

Mampf F. schrieb:
> 1/x = 1/M * 1/2^E
>
> 1/2^E ist nur simples Bit-schieben. Für den Kehrwert der Mantisse kann
> ich eine LUT mit z.B. 8Bit verwenden. Ich benötige insgesamt keine
> Multiplikation und nur einen Tabellenzugriff.

Genau, ich suche die Mantisse vorher, dann ist die Genauigkeit höher.

Beim Logarithmisieren macht man es genauso :)

von Sigi (Gast)


Lesenswert?

Lars R. schrieb:
> Mampf F. schrieb:
>> Lothar M. schrieb:
>>> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am
>>> nächsten Morgen mit einem bösen Kater wieder ein...
>
> 8 Bit rein, 8 Bit raus.

Der Kehrwert wird z.B. oft verwendet, um anschliessend
mit ihm mehrfach zu multiplizieren. Hier bedeutet ein
Mehr an Stellen eine "besseres" Rundungsergebnis.
(schmeisst man hier Stellen weg, dann muss man sich
das Ergebnis halt Schönsaufen).

Mampf F. schrieb:
> Oh sorry, das war missverständlich ... Die LUT ist für eine 8Bit
> Mantisse, d.h. die Tabelle hat 255 Werte, aber die Werte in der Tabelle
> haben 24Bit.

Hört sich irgendwie nach FP12, FP16 (z.B. von GPUs verwendet) an.
Schau mal im Netz nach, da gibt's zahlreiche Ansätze für schnelles
Multipizieren und Dividieren.

von Lars R. (lrs)


Lesenswert?

Mampf F. schrieb:
> Lars R. schrieb:
>> Wie kommst Du mit einer 8Bit-LUT auf "991,irgendwas"? Das geben doch die
>> 8Bit überhaupt nicht her! Vor allem ",irgendwas"!
>
> Die LUT ist für eine 8Bit
> Mantisse, d.h. die Tabelle hat 255 Werte, aber die Werte in der Tabelle
> haben 24Bit.

Auf 991,x für 0,001d komme ich dennoch nicht.

> Oh sorry, das war missverständlich ...

Ich hatte für den Inhalt der LUT eben etwas angenommen.

von Lars R. (lrs)


Lesenswert?

Sigi schrieb:
> Lars R. schrieb:
>> Mampf F. schrieb:
>>> Lothar M. schrieb:
>>>> Das nennt sich umgangssprachlich "schönsaufen". Das holt einen am
>>>> nächsten Morgen mit einem bösen Kater wieder ein...
>>
>> 8 Bit rein, 8 Bit raus.
>
> Der Kehrwert wird z.B. oft verwendet, um anschliessend
> mit ihm mehrfach zu multiplizieren. Hier bedeutet ein
> Mehr an Stellen eine "besseres" Rundungsergebnis.
> (schmeisst man hier Stellen weg, dann muss man sich
> das Ergebnis halt Schönsaufen).

Was ist besser?

8 Bit rein, 16 (bzw 17) Bit raus, oder
9 Bit rein, 8 (bzw 9) Bit raus?

und 8x24 vs 9x12?

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.