www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Gleitkommazahlen


Autor: Planlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß jemand, wie man in VHDL mit Gleitkommazahlen arbeiten kann?
Also ne lib, die floatingpoints und Rundungen zu Verfügung stellt?

Autor: JJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google fünfter eintrag:

http://www.vhdl.org/vhdl-200x/vhdl-200x-ft/package...


Ob es sinnvoll ist, ist ne andere Frage.

Gruß

Autor: Planlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, sinnvoll ist das nicht so richtig.
Bei einbinden bekomme ich folgendes Problem.
HDLParsers:3256 - ..../fixed_pkg_c.vhdl" Line 1025. Signatures on alias declarations are not supported

Autor: JJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mal einen Blick in die entsprechende Datei zu werfen?
Oder kundzutun in was du es einbinden willst?

Autor: Planlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
Compiling vhdl file ".../fixed_pkg_c.vhdl" in Library ieee_proposed.
ERROR:HDLParsers:3256 - ".../fixed_pkg_c.vhdl" Line 1025. Signatures on alias declarations are not supported
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

Autor: JJ (Gast)
Datum:

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

Autor: Planlos (Gast)
Datum:

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

Autor: JJ (Gast)
Datum:

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

Autor: Planlos (Gast)
Datum:

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

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von Xilinx gibt es konstenlos einen Gleitkomma-Core, den Du benutzen 
kannst:

http://www.xilinx.com/xlnx/xebiz/designResources/i...

Autor: JJ (Gast)
Datum:

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

Autor: Planlos (Gast)
Datum:

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

Autor: JJ (Gast)
Datum:

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

Autor: Planlos (Gast)
Datum:

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

Autor: Mike (Gast)
Datum:

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

Autor: JJ (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.