mikrocontroller.net

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


Autor: Zero (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Midnight (Gast)
Datum:

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

Autor: Michael Sauron (Gast)
Datum:

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

Autor: Georg A. (Gast)
Datum:

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

Autor: Midnight (Gast)
Datum:

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

Autor: Duke Scarring (Gast)
Datum:

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

Autor: Midnight (Gast)
Datum:

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

Autor: Georg A. (Gast)
Datum:

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

Autor: Midnight (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Midnight (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe Werte von -10 bis +10. Damit habe ich eine ausreichende 
Genauigkeit.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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.