Forum: FPGA, VHDL & Co. Gleitkommazahlen


von Planlos (Gast)


Lesenswert?

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

von JJ (Gast)


Lesenswert?

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ß

von Planlos (Gast)


Lesenswert?

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

von JJ (Gast)


Lesenswert?

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

von Planlos (Gast)


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:
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

von JJ (Gast)


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!"

von Planlos (Gast)


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

von JJ (Gast)


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?

von Planlos (Gast)


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.

von Xenu (Gast)


Lesenswert?


von JJ (Gast)


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ß

von Planlos (Gast)


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.
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.

von JJ (Gast)


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

von Planlos (Gast)


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!

von Mike (Gast)


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.

von JJ (Gast)


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ß

von Sebastian (Gast)


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

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.