Weiß jemand, wie man in VHDL mit Gleitkommazahlen arbeiten kann? Also ne lib, die floatingpoints und Rundungen zu Verfügung stellt?
Google fünfter eintrag: http://www.vhdl.org/vhdl-200x/vhdl-200x-ft/packages/files.html Ob es sinnvoll ist, ist ne andere Frage. Gruß
Klar, sinnvoll ist das nicht so richtig. Bei einbinden bekomme ich folgendes Problem.
1 | HDLParsers:3256 - ..../fixed_pkg_c.vhdl" Line 1025. Signatures on alias declarations are not supported |
Wie wäre es mal einen Blick in die entsprechende Datei zu werfen? Oder kundzutun in was du es einbinden willst?
ja, sorry... ganz vergessen. Ich habe einen IP-Core im EDK (8.2) erstellt und möchte da drin jetzt was mit Gleitkommazahlen machen. Inzwischen habe ich aber andere Fehler:
1 | Compiling vhdl file ".../fixed_pkg_c.vhdl" in Library ieee_proposed. |
2 | ERROR:HDLParsers:3256 - ".../fixed_pkg_c.vhdl" Line 1025. Signatures on alias declarations are not supported |
3 | FATAL_ERROR:HDLParsers:vhptype.c:174:$Id: vhptype.c,v 1.8 2005/04/29 15:34:22 drm Exp $:200 - INTERNAL ERROR... while parsing ".../fixed_pkg_c.vhdl" line 1025. Contact your hot line. Process will terminate. To resolve this error, please consult the Answers Database and other online resources at http://support.xilinx.com. If you need further assistance, please open a Webcase by clicking on the "WebCase" link at http://support.xilinx.com |
Nu ma Butter bei die Fische! Was macht dein IP-Core? Hast du einen vorgefertigten genommen? Wenn ja, hast du mal drübernach gedacht das der ggf. überhaupt nicht mit Floatingpoint arbeiten kann da er für fixed konzipiert ist? Hast du dir mal Gedanken gemacht ob du überhaupt Float benötigst? Du lieferst ne Problemschilderung ab nach dem Motto: "Ich war gestern tanken, heute springt mein Auto nicht an!"
Okey, okey sorry... Eigentlich brauchte ich ja nur schnell einen Tip für eine Lib oder ähnliches. Mit dem EDK Ip-Core Wizzard habe ich mir eine Basisvariante zusammengestellt. Innerhalb dieser muss ich zwei Zahlen dividieren. Ich habe auch einen anderen Ansatz, will aber mal ein paar Siumulationen laufen lassen um die Geschwindigkeitsvorteile klar vor Augen zu haben. Wie es mir scheint, ist die oben genannte Lib nicht in der Lage, vernünftig mit den Xilinx Produkten zu arbeiten. http://www.eda-stds.org/fphdl/vhdl.html
Ok, mach ich noch einen versuch dich zu verstehen. Du hast dir mit nem Core-Generator einen Block erzeugt der die Funktion hat Zahlen zu dividieren. Dieser Block arbeitet mit FixedPoint-Arithmetik. Jetzt möchtest du einen Block haben der mit Fließpunktarithmetik arbeitet. Wenn ich mich recht erinnere kannst du einen solchen Block nicht einfach mit ner anderen Library betreiben. entweder du hast die Möglichkeit dir einen Fließpunktarithmetik-Divisionsblock im CoreGen zu erzeugen oder du musst dir einen basteln (von Hand). Was du aus dem oben genannten Link schliesst ist mir nicht ganz klar. Was ich mich gerade frage ist ob dir klar ist was das erzeugte Ergebnis deines IP-Core Wizard ist. Desweiteren solltest du dir klar machen das nicht unbedingt die Geschwindigkeit der springende Punkt ist, sonderndie Chipfläche. Ich wiederhole nochmal die Frage: Wozu brauchst du überhaupt Fließpunkt?
hmmmmm... na gut... irgendwie reden wir aneinander vorbei. Liegt wohl auch daran, dass ich immer die Hälfte vergesse sorry. Gut, also nochmal: Ich habe 2 Algorithmen. Der 1. mit einer Division, bei der ich auf ganze Zahlen runden muss, der 2. ohne sowas. Beide will ich Simulieren und die Geschwindigkeitsvorteile messen (falls es welche gibt) zu dem Link: Wenn man da etwas weiter klickt (hier http://www.eda-stds.org/fphdl/xilinx.html), dann sieht man, dass es anscheinend Probleme mit den Produkten von Xilinx, Altera, Modelsim... gibt.
Von Xilinx gibt es konstenlos einen Gleitkomma-Core, den Du benutzen kannst: http://www.xilinx.com/xlnx/xebiz/designResources/ip_product_details.jsp?iLanguageID=1&sGlobalNavPick=&sSecondaryNavPick=&key=FLOATING_PT
Was bei deinem Link an Informationen zu Xilinx steht hatte ich gelesen. Versuche bitte mal das was ich schreibe vernünftig zu lesen. Ich wollte nicht von dir wissen wo ich etwas bei diesem Link finde sondern zu welcher Erkenntnis er dich bringt. Ich lese dort das es Probleme mit einer Version 9.1 gibt. Aus deinem Post muss ich schliessen das du 8.2 verwendest. Weiterhin stehen dort Lösungen zu den Fehlermeldung. Und als letztes steht dort derHinweis das der übrigbleibende Fehler mit den loops in den Testcases des Autors zu tun hat und NICHT mit dem Package. Desweiteren solltest du mal irgendwie klar machen was du vorhast. Zum Beispiel ein Codebeispiel zu deinen Algorithmen liefern und nicht den Geheimniskrämer spielen. Und du schreibst das du eine Division machst deren Ergebnis du auf eine Ganzzahl rundest. Sind die Eingangswerte Fließpunkt? Selbst wenn erklärst du damit nicht den Einsatz von Fließpunktrechnung. Weiterhin empfehle ich dir Texte genau zu lesen und dir noch genauer darüber klar zu werden was du vorhast und wie du es vorhast. Letztendlich erfordert eine Programmierung in VHDL nicht nur das wissen was man vorhat sondern auch Klarheit darüber wie man es machen will. VHDL besteht nicht daraus das man sich schöne Blöcke zusammenträgt. Versteh mich bitte nicht falsch, ich möchte dir gerne noch weiterhelfen, aber wie gesagt eine Logikprogrammierung erfordert ein exaktes Verständnis dessen was die Logik bezwecken soll. Gruß
Danke Xenu, danke JJ! Ich denke nicht, dass es bei dem 8.2er weniger Fehler gibt, als bei dem 9.1. Davon mal abgesehen, habe ich es natürlich getestet.
1 | ERROR:HDLParsers:3256 - ".../fixed_pkg_c.vhdl" Line 1025. Signatures on alias declarations are not supported |
Inzwischen habe ich die alias-Definitionen mal auskommentiert. Jetzt läuft die Syntheseprüfung zwar ohne Fehler, aber mit Warnungen. Die Sachen einfach auszukommentieren, halte ich aber (ohne mir den Quelltext genau angesehen zu haben) für etwas problematisch. Wer weiß schon, was es sonst noch für Fehler nach sich zieht. Jetzt nochmal zu meinem Problem zurück. Einen Quellecode würde ich gerne liefern, gibt es aber noch nicht. Bisher alles theoritsches Konstrukt. Ich habe in etwas sowas zu berechnen: 500/111 = 4,5.... (also nur ganze Zahlen als Eingabewerte) Das Ergebnis muss ich dann wieder auf eine ganze Zahl runden. Ich brauche also eigentlich nichts anderes als eine Möglichkeit zu runden.
Ok, gut. Wenn du letztendlich nur die beiden Ganzzahlen teilen willst und ne Ganzzahl als ergebnis willst halte ich andere Herangehensweisen für sinniger. Was mir gerade einfällt (sehe mir nach das mir um 17.00 nicht mehr die besten Sachen einfallen, ich muss gleich erstmal nach hause simpsons schauen) wäre: Du subtrahierst won deinem Dividen den Divisor solange ab bis der Dividen (bzw. was noch von ihm übrig ist) kleiner ist als der Divisor. Zum Runden (ich nehme mal kaufmännisch an) shiftest du deinen Dividenden eine stelle nach rechts. Ist der Dividend nun kleiner als der Divisor dann rundest du auf, andernfalls rundest du ab. Gruß Jasper
;) okey, danke für den Tip! Ist ne gute Idee Simpsons zu gucken. Ne Spaß bei Seite. Klingt nicht unlogisch. Werde mal in ruhe drüber nachdenken und dann bescheid geben, ob es geklappt hat. Danke für deine unermüdlichen Versuche zu helfen!
@JJ: den Dividenden vom Divisor in einer Schleife abzuziehen klingt nicht sonderlich schnell ;) Ein besserer Weg wäre wohl folgender: - Dividend um ein Bit erweitern (=> mit 2 Multiplizieren) - Dividieren - das letzte Bit auswerten: wenn es 1 ist aufrunden ansonsten nicht - Bit wegwerfen (=> noch durch 2 Dividieren) Das geht natürlich nur wenn du mit .5 am Ende aufrunden kannst.
@Mike: Ich fand den Weg auch schon schlecht als ich ihn schrieb. Mir wollte nur partout nichts besseres einfallen zu der Zeit. Also wollte ich erstmal deutlich machen das an diesem Punkt nun wirklich keine Fliesspunktzahlen benötigt werden. Klingt auf jeden Fall besser der Weg! Gruß
Jedoch hat man eine Division in Mike seiner Formel. Wie lange die benötigt weiß man momentan ja auch noch nicht, deshalb ist die Lösung mit der Subtraktion schon ganz gut. Vielleicht sollte man sich auch nicht so viele Gedanken machen und einfach mal folgendes ausprobieren Ergebnis <= A / B; Vielleicht kann der compiler dies auch umsetzen. Wie er es macht z.B. Runden oder mit Multiplikationen was ich jetzt nicht aber vielleicht geht es ja. Ab besten man probiert es aus und versucht das Ergebnis als Zahlenwert darzustellen (z.B. auf einem 2 Zeiledisplay oder per RS232 an den PC senden) Grüsse Sebastian
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.