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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mampf F. (mampf) Benutzerseite


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


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


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


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


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


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


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


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


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


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


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


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

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]
  • [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.