Liebe Kollegen!
Ich wollte gerade mein Programm synthetisieren und bekomme immer
folgendne Fehler:
line 81: Real operand is not supported in this context.
Ich verwende nur real Werte. Die Codezeile sieht so aus.
safe := (num*(1.0/denom));
Hat jemand eine Lösung?
Danke im Voraus für die Hilfe.
Z.E.R.O.
> Ich wollte gerade mein Programm synthetisieren
Mit welchem Synthesewerkzeug für welche Plattform?
> Ich verwende nur real Werte.
Lies mal nach, ob real Berechnungen von der Synthese unterstützt werden.
(Antwort: schon möglich)
> safe := (num*(1.0/denom));
Lies mal nach, ob eine real Division von der Synthese unterstützt wird.
(Antwort: sicher nicht)
> line 81: Real operand is not supported in this context.
Da steht es schon. Hier kannst du das nicht machen :-/
BTW:
> Ich verwende nur real Werte.
Das ist schlecht, nur sehr ausgewählte FPGAs haben eine FPU.
Ich verwende Xilinx ISE 10.1
Das ist der erste Real Fehler, den ich bekomme. Also baue ich darauf,
dass sie unterstützt werden.
Wenn ich bei der Division 1.0/denom schreibe funktioniert es. Nur wenn
ich das Ergebnis mit etwas multiplizieren will bekomme ich die
Fehlermeldung.
Ich weis, dass Real werte nicht das gelbe vom Ei sind aber leider
brauche ich die Dinger. Verwende sie das erste mal. Sonst benötige ich
max. einen Integer.
Ist schon klar, dass ich das nicht so machen kann. Die Frage ist was
kann ich machen?
LG
Z.E.R.O.
Na, wenn der Threadtitel "ERROR:Xst:1532" heisst, ist das Werkzeug
eigentlich offensichtlich ;)
Da ich aber noch nie real benutzt habe, kann ich zum eigentlichen
Problem nichts sagen. Funktionieren die beim xst wirklich oder geht das
nur, weil die Werte Konstanten sind?
Guten Morgen!
Der FPGA ist ein Spartan 3E
Geschrieben ist das Ganze in VHDL
Als Synthesewerkzeug Xilinx ISE 10.1
Vielleicht kann mir jemand einen Tip geben!?
DANKE
Z.E.R.O.
> Vielleicht kann mir jemand einen Tip geben!?
Der kam schon:
>> safe := (num*(1.0/denom));>Lies mal nach, ob eine real Division von der Synthese unterstützt wird.
Dann schau mal bitte in xst.pdf unter VHDL language support nach, was
XST wirklich kann.
Abgesehen davon, wäre ein Stück mehr Code sehr hilfreich. Welchen Typ
haben z.B. Deine Variablen und warum verwendest Du überhaupt Variablen?
Duke
Die Variablen sind vom Typ real. Ich verwende Variablen weil ich die
Werte innerhalb des Prozesses mehrmals verändere. Signale würden den
Wert ja erst am Ende des Prozesses annehmen.
Das mit dem 1.0/... habe ich schon getestet. Das geht allerdings kann
ich das Ergebnis dann nicht mit einem Real Wert multiplizieren.
Wie kommen den die Werte als real überhaupt her, insb. denom? Ich habe
den starken Verdacht, dass die Division auch überhaupt nur geht, weil
xst irgendeine Konstantenpropagierung erkennt und damit in der HW gar
keine Division machen muss.
Leider nein, ich gebe die Werte zwar nicht aus (kein I/O - geht ja
nicht) aber innerhalb der Entity verändern sie sich. Die Werte verlassen
nicht einmal die Entity deshalb habe ich gehofft, dass es irgendwie
funktioniert mit Real zu arbeiten.
Die Alternative wären Integer Werte aber die sind mir etwas zu ungenau.
Ev. multipliziere ich die Real mit 100, wandel sie in Integer um und
wenn ich mit der Rechnung fertig bin wieder durch 100 und zurück in
Real. Ist auch ungenau aber nicht mehr so schlimm. Der Rest des Modules
vergleicht im wesentlichen nur noch die Werte (Real) miteinander.
Z.E.R.O.
> Die Alternative wären Integer Werte aber die sind mir etwas zu ungenau.
Warum meinst du, dass real-Zahlen genauer wären?
Wenn du 10000.0 + 0.0001 rechnest, was kommt mit real wohl heraus?
Wenn du 1000000000.0 + 1.0 rechnest, was kommt dann raus?
Und jetzt nimmst du 1000000000 + 1 als 32 Bit integer, was gibt das?
Floats/Reals haben bei gleicher Wortbreite lediglich einen höheren
Dynamikbereich, denn die größte und die kleinste darstellbare Zahl ist
durch den Exponenten eklatant größer als bei Integern.
> Ich habe Werte von -10 bis +10.> Damit habe ich eine ausreichende Genauigkeit.
Du hast bei einer 32-bit Float-Zahl nur 23 Bit für die Mantisse.
Damit kannst du also knapp 7 Zehnerstellen genau auflösen.
Wenn du einen Float-Wert von 100000000,0 hast und 1,0 dazuaddierst, hast
du anschliessend immer noch 100000000,0 :-o
Bei einer 32-Bit Integer Zahl hast du 9,5 Zehnerstellen, eine Addition
von 100000000 + 1 wird also 100000001 ergeben. Das ist nach landläufiger
Interpretation genauer, weil der kleinere Teil der Addition nicht
einfach untergeht.
Wenn du also Zahlenwerte von z.B. 10.0000000 bis -10.0000000 darstellen
willst, ist eine Festkommaberechnung schneller und sinnvoller.
Kurz und gut:
Float(Real) ist nicht genauer als eine gleich breite Integer-Zahl.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.