Forum: FPGA, VHDL & Co. VHDL E-Funktion oder Potenzfunktion zweier reeler zahlen


von Thomas (Gast)


Lesenswert?

Hallo, gibt es eine Möglichkeit in VHDL (oder Systemgenerator von 
XILINX) eine E-Funktion zu implementeieren? Der exponent sollte dabei 
reel sein, also nicht ganzzahlig. Eine Potenzfunktion wäre auch ok, man 
kann ja dann einfach e als Kosnstante der Basis eingeben.
als Exponent sollte zum Beispiel eine 16 Bit Zahl mit 4 Vorkomma und 12 
Nachkomma stellen möglich sein.

von PittyJ (Gast)


Lesenswert?

In der package math_real soll ein Funktion

exp(x) = e hoch x

sein.

Also ist das in VHDL wohl möglich.
Die Frage ist nur, ob das auch evtl auf einem FPGA erzeugbar ist. Aber 
die wurde hier ja nicht gestellt.

von Thomas (Gast)


Lesenswert?

Achso ja, synthetisierbar sollte es schon sein ;)

von D. I. (Gast)


Lesenswert?

Wie schnell soll das ganze denn sein oder wie aufwändig darfs werden?

Es gäbe mehrere Möglichkeiten. Z.B. durch eine Reihenentwicklung und 
Floating-Point Units. Steuern könnte man das ganze entweder mit einer 
FSM oder wenn Ressourcen keine Rolle spielen und hoher Durchsatz 
gefordert ist könnte man das ganze gepipelined aufbauen.

Ein paar mehr Details bräuchte man für die Entscheidung.

von D. I. (Gast)


Lesenswert?

Das könnte auch noch interessant sein:

http://www.quinapalus.com/efunc.html

mit fixed-point arithmetik. Den gegebenen C-Code könnte man dann in 
Hardware umsetzen.

von D. I. (Gast)


Lesenswert?


von Thomas (Gast)


Lesenswert?

Also Geschwindigkeit spielt keine große Rolle, das ganze wird auf einem 
Spartan3 DSP integriert. Dieser ist mit 100Mhz getaktet. Es reicht wenn 
die Werte mit 1khz ausgegeben werden.

Die Links schau ich mir mal an, danke.

von Thomas (Gast)


Lesenswert?

Achso wie aufwändig. Kann recht komplex sein. Der FPGA hat recht viele 
resourcen übrig.

von D. I. (Gast)


Lesenswert?

D.h. in Zahlen? 1000 FF / LUTs, 10.000, 50.000 ?

von Nachrichtentechnikingenieur (Gast)


Lesenswert?

WArum brichst Du die EXP nicht einfach auf einen 2hochX herunter?

Du musst doch nur den Exponenten modifizieren und auf die andere Basis 
abbilden, dann bleibt dir eine Multiplikation

EXPe (434.7) = EXPe (434) * EXPe (0.7)

EXPe (X) = EXP2 (X * ln2(x))

Für die Logarithmusfunktion gibt es den CORDIC und die EXP zur Basis 2 
geht übers Schieben, wobei die Zahl der Schiebungen ausgerechnet werden 
sollte, stazz eine Schleife zu machen:

EXP (434) = EXP (256) * EXP (128) * EXP (...) * EXP (...) ....

von Harald (Gast)


Lesenswert?

Nachrichtentechnikingenieur schrieb:
> Für die Logarithmusfunktion gibt es den CORDIC
Der müsste dann aber auch die E-funktion selber bereits hinbekommen.

von Robert.K. (Gast)


Lesenswert?

Bei Xilinx gibt es im CORDIC 4.0

• Vector rotation (polar to rectangular)
• Vector translation (rectangular to polar)
• Sin and Cos
• Sinh and Cosh
• Atan and Atanh
• Square root

aber keine Logarithmus oder E-Funktion!

Bei Altera existieren hingegen Wurzel, Exponent und 
Logarithmusfunktionen (das meiste FP) - aber kein CORDIC.

Frage 1: Geht das überhaupt im CORDIC?
Frage 2: Wie? Kann man LN gfs durch ATANH o.ä. abbilden?
Frage 3: Warum hat Altera das drin und Xilnix nicht?
Frage 4: Warum hat Altera keinen CORDIC? Lizenzproblem?

von J. S. (engineer) Benutzerseite


Lesenswert?

D. I. schrieb:

> Das könnte auch noch interessant sein:
> http://www.quinapalus.com/efunc.html
> mit fixed-point arithmetik.
> Den gegebenen C-Code könnte man dann in Hardware umsetzen.
Ein interessanter Ansatz, ja. Kannte ich noch gar nicht. Er ist aber zur 
Umsetzung in Hardware nicht so wirklich geeignet, weil er 2.fach 
verschachtelt ist:

Einmal die Suche nach dem idealen Teiler und dann die 
Subtraktion/Multiplikation. Ich überschaue es ehrlich gesagt ad hoc 
nicht 100%, aber mein Gefühl sagt mir, dass es vom Tempo auf mindestens 
3 Taktzyklen und eher mehr hinausläuft, einen Rechenschritt zu 
vollziehen.
Wenn man grossen Zahlen verarbeiten möchte, braucht man auch grosse 
Tabellen, weil sonst entweder lange abgezogen werden muss oder dividiert 
werden muss, um die Zahl der Subtraktionen zu errechnen. Am Ende läuft 
es auch nur auf eine Näherung hinaus, die man u.U. lange fortsetzen 
muss, um zu einem genauen Ergebnis zu gelangen. Bei Taschenrechnern mit 
Sparhardware und viel Zeit ist das sicher ein gutes Verfahren, aber für 
FPGAs sicher nicht, weil dort Tempo gefragt ist. (Ohne Tempoanforderugen 
wäre kein FPGA im Einsatz, sondern ein DSP). Wenn man genug Zeit hat und 
das FPGa liegt dennoch schon vor und soll benutzt werden, würde ich es 
mit einer FSM nachbauen oder einem SoftCore zu fressen geben.

Eine schnelle FPGA Implementierung eines Algos muss generell Gebrauch 
von der Tatsache machen, dass zumindest für die Zahl der typisch zur 
Verfügung stehenden Bits, jeweils genug Multiplier zur Verfügung stehen, 
um einen kompletten Vektor in einem Takt abzufertigen. Beim Spartan 6 
sind das z.B. 18x25 Bit. Ferner muss man den Vorteil nutzen, dass 
Teilergebnisse parallel überall zur Verfügung stehen und ohne 
Rechenaufwand in eine andere Zeitebene geschleppt werden können, während 
die eigentliche Architektur weiter agiert (anders als bei der MCU). 
Ferner hat das FPGA den Vorteil, dass Schiebeoperationen, die durchs 
Umdrahten realisiert sind, oftmals gar keine Zeit kosten, weil sie im 
selben Takt passieren.

Die Lösung kann also IMHO hier nur auf ein zyklischen Schieben von 
Einsen mit fortgesetzter Multiplikation hiauslaufen.



Nachrichtentechnikingenieur schrieb:


> Warum brichst Du die EXP nicht einfach auf einen 2hochX herunter?
So ungefährt geht es, ja. Wobei:


> Du musst doch nur den Exponenten modifizieren und auf die andere Basis
> abbilden, dann bleibt dir eine Multiplikation


Es ist eine fortgesetzte Multiplikation, die sich mit etwas Trickserei 
auch parallelisieren lässt, allerdings muss die Umrechung auf die 
gewünschte Bezugsbasis VOR der Multiplikation erfolgen.


> EXPe (X) = EXP2 (X * ln2(x))
Tippfehler- nehme ich an, gemeint ist sicher:

EXPe (x) = EXP2 (X * ld(e)), denn ld(e) ist der (vorher auszurechnende) 
konstante Korrekturfaktor.

Ich empfehle potenziellen Nachbauern, den sequenziellen Algo zu nehmen 
und maximal 4 Stufen parallel zu recheen, weil eine volle 
Parallelisierung nur mit enormem Flächenaufwand zu machen ist und zudem 
jeweils pipeline-FFs hinter den sequenzellen Multiplizierern 
erforderlich sind, die das Teilergebnis jeweils in den nächsten Takt 
verfrachten, was am Ende zu fast derselben Latenz führt.

von J. S. (engineer) Benutzerseite


Lesenswert?

Robert.K. schrieb:

> Frage 1: Geht das überhaupt im CORDIC?
Ja, es geht im Cordic, wobei ich das wenn, dann über den System 
Generator gemacht hatte. Dort ist ein wrapper für den Xilinx Cordic 
implementiert. Ich habe das für eine FFT Ausgabe eingebaut und bin 
sicher, dass man dort den "ln" einstellen konnte. Warum der im CoreGen 
nicht drin ist, bleibt das Geheimnis von Xilinx.

> Frage 2: Wie?
Bleibt auch das Geheimnis der Firma Xilinx. Gfs nutzen sie selber einen 
Wrapper, siehe hier:

> Kann man LN gfs durch ATANH o.ä. abbilden?
Ich denke, dass sie es so machen, ja. Die Formel lief mir gerade die 
Tage über den Weg und lautet sowas wie: LOG(X) = ATANH ((x-1)/(x+1)). 
Wurde im Xilinx Forum diskutiert.

> Frage 3: Warum hat Altera das drin und Xilnix nicht?
Bleibt auch das Geheimnis der Firma Xilinx. Die verkaufen ja auch IP, in 
den Bezahlgalerien wirst Du sicher was finden.

> Frage 4: Warum hat Altera keinen CORDIC?
Bleibt wiederum das Geheimnis der Firma Altera :-)  Du kannst aber einen 
CORDIC selber implementieren oder die das auf OC ansehen.

>Lizenzproblem?
Ich hatte selbst sowas schon vermutet, gfs hat Xilinx einige Patente auf 
die Implementierung bestimmter Alsgorithmen in VHDL/Verilog und 
umgekehrt Altera auch. Keine Ahnung. Bei Altera wundert mich, dass sie 
einige mathematische Funktionen in der FP-Gruppe haben, aber für Integer 
fast nichts, obwohl das besonders effektiv ist, wenn man es selber 
berechnet.

Hochinteressant ist z.B. dass Altera einige Zeit einen Wurzel-Core für 
Integer mit im Gepäck hatte, der dann irgendwann mal rausgeflogen ist. 
Da gab es nur noch den für FP. Ich hatte seinerzeit bei Altera angefragt 
und bekam keine erschöpfende Antwort. Ich habe dann in anderem 
Zusamenhang für Xilinx mal eine Wurzelfunktion benötigt, weil die CORDIC 
zu langsam war. Per google code search hatte ich eine Wurzelfunktion 
gefunden und stellte mit Erstaunen fest, dass es Code von Altera ist. 
Den habe ich implementiert und zu meinem neuerlichen Estaunen 
festgestellt, dass er eine Macke zu haben scheint. Ich habe das dann 
korrigiert und im Altera Forum gemeldet - allerdings ohne Resonanz.

Inzwischen scheint der wieder drin zu sein, denn in der aktuellen 
Quartus-Version gibt es wieder einen Wurzel-Core und zwar zusätzlich zu 
dem für FP! Wozu das und warum, kann ich nicht beantworten.

Ich habe mir inzwischen sowohl Wurzel und Logarithmus, als auch 
E-Funktion für Basis 10, e und 2 selber gebaut und setze sie ein, wenn 
ich in Integer arbeite.

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.