Forum: FPGA, VHDL & Co. Expression is not constant. ERROR.


von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

Hey,

ich bin gerade dabei eine Countdown file zu schreiben. Ich bekomme aber 
in Line 55 immer folgenden Fehler:

ERROR:HDLCompiler:411 - "/home/gu95din/Master1/IC_Design/Countdown.vhd" 
Line 55: Expression is not constant.

Kurzer Hintergrund: Das Signal hour und das Signal min werden durch die 
Countdownsteuerung verändert und sollen als String an die main-Datei 
zurückgegeben werden. Ich habe die Integer Signale hour und min eben 
getestet, ob sie ein oder zwei stellig sind, um immer ein jeweils 
zweistelliges Stringsignal am Ausgang zu bekommen.

Any ideas ?

von Georg A. (georga)


Lesenswert?

Der Fehler sitzt bei dem 'image(hour)? Kann nicht gehen, ist (weil hour 
sich eben während des Laufs ändern kann) eine dynamische Berechnung, was 
nur in der Simulation geht, aber nicht in der Synthese. Da musst du wohl 
oder übel selber eine Funktion/Entity schreiben, die das nach ASCII 
konvertiert.

Der ganze Code sieht mir auch danach aus, als würdest du sonst eher C 
programmieren ;)

von Tobi (Gast)


Lesenswert?

Okay, gibt Sinn. Danke dir. Dass heißt, bei statischen bzw. constanten 
Signalen würde das Attribut 'image gehen (oder besser gesagt, es 
funktioniert nur bei solchen?)?

Und ja, du hast schon recht. Bin noch Neuling in VHDL. Woran siehst du 
das denn ? Es ist doch eigentlich alles synchron oder nicht ?

von Tobi (Gast)


Lesenswert?

Georg A. schrieb:
> Der Fehler sitzt bei dem 'image(hour)? Kann nicht gehen, ist (weil hour
> sich eben während des Laufs ändern kann) eine dynamische Berechnung, was
> nur in der Simulation geht, aber nicht in der Synthese. Da musst du wohl
> oder übel selber eine Funktion/Entity schreiben, die das nach ASCII
> konvertiert.
>
> Der ganze Code sieht mir auch danach aus, als würdest du sonst eher C
> programmieren ;)


Noch was:
Ist es denn gar nicht möglich die Buchstaben als Character zu übergeben 
? Also denkst du, die beste Variante ist es, binäre Signale zu übergeben 
oder denkst du an eine Möglichkeit, mithilfe einer Funktion die Integer 
in Character umzuwandeln ? Also so ähnlich:

case INTEGERZAHL is
  when 0      => w <= '0';
  when 1      => w <= '1';
  when 2      => w <= '2';
...
end case;

von Georg A. (georga)


Lesenswert?

> Dass heißt, bei statischen bzw. constanten Signalen würde das Attribut
> 'image gehen (oder besser gesagt, es funktioniert nur bei solchen?)?

Die Synthese ist gegenüber der Simulation deutlich eingeschränkter. Das 
trifft insb. eingebaute Funktionen, deren Implementierung in HW entweder 
gar nicht absehbar oder sehr komplex werden könnte. Ein typisches 
Beispiel wäre eine while-Schleife mit variabler Abbruchbedingung (von 
Signalen abhängig). Wenn die innerhalb eines getakteten Prozesses steht, 
heisst das ja, dass die Schleife das Ergebnis in einem Takt liefern 
muss. Und das würde bedeuten, dass die HW für ALLE Schleifendurchläufe 
parallel synthetisiert werden müsste. Nur weiss man gar nicht, wieviele 
das sind...

Mit zur Synthesezeit konstanten Eingaben kann der Synthesizer das 
Ergebnis natürlich vorab ausrechnen.

> Woran siehst du das denn ?

zB. an der Nutzung von Strings. Wie sollen die den in HW dargestellt 
werden? 4*20*8Bit Ausgänge oder wie? Dann "if rising_edge(uni_enable)" 
im ungetakteten Prozess... Das geht gar nicht... Auch der Stil der 
gesamten Statemaschine (wenn sie überhaupt so geht...) ist arg 
gewöhnungsbedürftig.

Desweiteren ist die Methode, Zustandsfortschaltung und Berechnung des 
neuen Zustands in zwei (oder gar drei) getrennen Prozessen zu machen, 
zwar akademisch gern gesehen, hilft aber auch nicht unbedingt bei der 
Entwicklung.

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


Lesenswert?

Das, was da angehängt ist, taugt bestenfalls für die Simulation:
ein if rising_edge() mitten im kombinatorischen Prozess...  :-o

Dazu noch Zähler in der Kombinatorik, das gibt die mit der 
Zwei-Prozess-Schreibweise gern gemachten kombinatorischen Schleifen. 
Such einfach mal danach...

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.