Forum: FPGA, VHDL & Co. ERROR:Xst:1532


von Zero (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Midnight (Gast)


Lesenswert?

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.

von Michael Sauron (Gast)


Lesenswert?

>Die Frage ist was
>kann ich machen?

Na zum beispiel mal die Frage von Lothar beantworten:
>Mit welchem Synthesewerkzeug für welche Plattform?

Sauron

von Georg A. (Gast)


Lesenswert?

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?

von Midnight (Gast)


Lesenswert?

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.

von Duke Scarring (Gast)


Lesenswert?

> 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

von Midnight (Gast)


Lesenswert?

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.

von Georg A. (Gast)


Lesenswert?

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.

von Midnight (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Midnight (Gast)


Lesenswert?

Ich habe Werte von -10 bis +10. Damit habe ich eine ausreichende 
Genauigkeit.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

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.