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.
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.
Achso ja, synthetisierbar sollte es schon sein ;)
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.
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.
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.
D.h. in Zahlen? 1000 FF / LUTs, 10.000, 50.000 ?
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 (...) ....
Nachrichtentechnikingenieur schrieb: > Für die Logarithmusfunktion gibt es den CORDIC Der müsste dann aber auch die E-funktion selber bereits hinbekommen.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.