Forum: FPGA, VHDL & Co. Hoch irgendwas und float wie in VHDL


von Stefan H. (Gast)


Lesenswert?

Hallo,

ich wollte folgendes in VHDL lösen:

10^(-0,01546875*TMP)
wie kann ich das z.B. auf 32bit genau lösen?

also power of geht ja mit -->
10**irgendwas
aber mit der Floatzahl habe ich so meine Probleme!

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


Lesenswert?

Stefan H. schrieb:
> aber mit der Floatzahl habe ich so meine Probleme!
Welche Datentypen willst du denn da haben (Ergebnis und TMP)?
Soll das synthetisiert werden?
Was willst du machen?

von Stefan H. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Welche Datentypen willst du denn da haben (Ergebnis und TMP)?
> Soll das synthetisiert werden?
> Was willst du machen?

TMP und Ergebnis sind "signed(31 downto 0)"!
Ja wäre nicht schlecht, wenn's auch zu synthetisieren ginge!

-0.011546875 stellt eine Dämpfung dar, die in Abhängigkeit zu TMP größer 
oder kleiner sein soll (logarithmisch) TMP kann dabei Werte von 0 bis 
(2^11)-1 annehmen!
Ich möchte also den log-Wert in einen Faktor umrechnen!

von Stefan H. (Gast)


Lesenswert?

Stefan H. schrieb:
> TMP und Ergebnis sind "signed(31 downto 0)"!
> Ja wäre nicht schlecht, wenn's auch zu synthetisieren ginge!
>
> -0.011546875 stellt eine Dämpfung dar, die in Abhängigkeit zu TMP größer
> oder kleiner sein soll (logarithmisch) TMP kann dabei Werte von 0 bis
> (2^11)-1 annehmen!
> Ich möchte also den log-Wert in einen Faktor umrechnen!

Hmmh ok mir ist da die Idee gekommen... warum das nicht einfach
so lösen, wie es in VHDL als auf ner Hardware oftmals am einfachsten 
ist:

Vorberechnete Werte verwenden!

also
eine Liste mit 2^11 Werten
die Wertnr. (der Index) entspricht dann "TMP"
und die zugehörigen Werte werden vorher berechnet entweder von 
Synthese-Tool,
MatLab, SciLab oder Octave etc.

also eine LUT mit 2^11 Werten (hier jeder Wert mit 32 Bit aufgelöst!)
Wäre das ne gescheite Vorgehensweise?

von Lattice User (Gast)


Lesenswert?

Stefan H. schrieb:

>
> also eine LUT mit 2^11 Werten (hier jeder Wert mit 32 Bit aufgelöst!)
> Wäre das ne gescheite Vorgehensweise?

Ja, die einzig brauchbare. Braucht nur 4 Blockrams.

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


Lesenswert?

Stefan H. schrieb:
> also eine LUT mit 2^11 Werten (hier jeder Wert mit 32 Bit aufgelöst!)
Du kannst auch weniger Stützpunkte verwenden und dazwischen linear 
interpolieren. Das geht recht einfach: zwei Tabellenzugriffe, zwei 
Mutliplikationen und fertig...

von Stefan H. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Du kannst auch weniger Stützpunkte verwenden und dazwischen linear
> interpolieren. Das geht recht einfach: zwei Tabellenzugriffe, zwei
> Mutliplikationen und fertig...

Stimmt klingt gut, dann habe ich nur halb so viele Werte in der Tabelle 
und
nutze eh schon dafür "dedizierte" Hardware für die Multiplikation!

von Dumdi D. (dumdidum)


Lesenswert?

Stefan H. schrieb:

> Stimmt klingt gut, dann habe ich nur halb so viele Werte in der Tabelle

man kann auch etwas mehr interpolieren.

von Lattice User (Gast)


Lesenswert?

Stefan H. schrieb:

> Stimmt klingt gut, dann habe ich nur halb so viele Werte in der Tabelle
> und
> nutze eh schon dafür "dedizierte" Hardware für die Multiplikation!

Bei nur 2^11 Lohnt sich das meiner Ansicht nur wenn du knapp mit 
Blockrams bist.

von Ralf (Gast)


Lesenswert?

Lattice User schrieb:
> Bei nur 2^11 Lohnt sich das meiner Ansicht nur wenn du knapp mit
>
> Blockrams bist.
Wie wäre es mit einer Berenchung in Cordic oder Auslagerung in ein 
externes RAM?

von FPGA-Programmierer (Gast)


Lesenswert?

Ralf schrieb:
> Wie wäre es mit einer Berenchung in Cordic

Wiviel Stufen / Auflösung bräuchte ein Cordic für 32 Bit Endergebnis?

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.