Forum: FPGA, VHDL & Co. verkürzte Schreibweise einer bedingten Zuweisung führt zu Fehler?


von Anfänger (Gast)


Lesenswert?

Hallo,

ich bin davon ausgegangen, dass folgende Varianten identisch wären:

V1:
1
         if myTestData(row).msb_first = 1 then
2
            i_core.msb_first <= '1';
3
         else
4
            i_core.msb_first <= '0';
5
         end if;

V2:
1
         i_core.msb_first <= '1' when myTestData(row).msb_first = 1 else '0';

Leider ist der Compiler da anderer Meinung und haut mir (für V2) ein
1
# ** Error: W:/Evalboard/stb.vhd(108): Illegal sequential statement.
um die Ohren.

Könnte mir bitte jemand erklären, wo der Fehler liegt, bzw. wann man die 
verkürzte Schreibweise einsetzen darf?

von Antti (Gast)


Lesenswert?

es sind nicht gleich, fur VHDL

fur ganz anfanger:

when - benutzt du fur SELECT in kombinatorik, ausserhalb eines processes
a = b ? c : d; // wenns C ware ? => when

if - benutzt du in einer process um F/F's zu erzeugen

das ist das ultimative basis, womit man eigentlich schon alles machen 
kann.

wenn du "when" und "if" irgendwie anders benutzen willst, geht auf dein 
risiko.. (eventuell dann nicht..)

Antti

von Anfänger (Gast)


Lesenswert?

Hallo Antti,

danke für die gute Erklärung!

> SELECT für Kombinatorik - ok.

Ich meine, ich würde mich mit meinen Codezeilen im kombinatorischen 
Bereich befinden. Offensichtlich scheint es noch Einschränkungen 
bezüglich der auszuwertenden Bedingung zu geben, also dem 'b' in Deinem 
Beispiel.

Kannst Du mir da vielleicht auch auf die Spur helfen?
Ist ein Arrayzugriff schon zuviel?

Oder wie kann ich mir das vorstellen? Bei Kombinatorik werden doch 
(statische) Zustände von FFs abgefragt und verglichen. Die Arraystelle 
ist ein Int-Wert in einem Array, welches eine Variable ist. Die 
Kombinatorik läuft in einem geschlossenen Loop, sodass die Variable 
nicht ungültig werden kann.

> wenn du "when" und "if" irgendwie anders benutzen willst

Davon kann keine Rede sein. Ich würde nur gerne verstehen, wann man was 
verwenden/einsetzen darf. Ich finde das WHEN-Gebilde bei einfachen 
Zuweisungen eleganter als ein IF. Genau wie den Ternär-Operator in C.

von D. I. (Gast)


Lesenswert?

Kombinatorik hat nichts mit FF's zu tun. Kombinatorik ist einfach ein 
Schaltnetz wo man vorne was reinsteckt und es (abgesehen von den 
Gatezeiten) Nullzeit dauert bis das Ergebnis hinten rauspurzelt also 
z.b. einfach eine logische Funktion

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


Lesenswert?

> Ich würde nur gerne verstehen, wann man was verwenden/einsetzen darf.
Innerhalb von Prozessen gibt es andere Syntaxelemente als für 
Concurrent-Zuweisungen. Das wird dein Problem sein. Leider erkennt man 
es nicht, weil das Drumrum (um die gepostete Code-Zeile) fehlt  :-/

Das hier
1
  i_core.msb_first <= '1' when myTestData(row).msb_first = 1 else '0';
geht nicht innerhalb eines Prozesses.

von Anfänger (Gast)


Lesenswert?

> Kombinatorik hat nichts mit FF's zu tun. Kombinatorik ist einfach ein
> Schaltnetz wo man vorne was reinsteckt und es (abgesehen von den
> Gatezeiten) Nullzeit dauert bis das Ergebnis hinten rauspurzelt also
> z.b. einfach eine logische Funktion

Hey, dann habe ich mal was verstanden :)
Genau so hatte ich es auch eingestuft.

> Das hier
1
i_core.msb_first <= '1' when myTestData(row).msb_first = 1 else '0';
> geht nicht innerhalb eines Prozesses.

Ok, das habe ich schon kapiert.
Wenn Du mir jetzt noch eine nachvollziehbare Begründung liefern 
könntest? Die fehlt mir noch zu meinem Glück/Verständnis

von Antti (Gast)


Lesenswert?

die begrundung ist in den Kopfen von den VHDL language authors...

den grund fur when/if zu begreifen, ist einfach so, man muss
es wissen...

Antti

von zwieblum (Gast)


Lesenswert?

kann mal jemand sagen um welche sprache es hier geht?

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


Lesenswert?

> Wenn Du mir jetzt noch eine nachvollziehbare Begründung liefern
> könntest? Die fehlt mir noch zu meinem Glück/Verständnis
Wie Antti schon sagte: dein Glück wird unvollstängig bleiben.

Es gab sicher mal einen überaus wichtigen, aber heute leider nicht mehr 
nachvollziehbaren Grund. Es ist einfach so. Und Generationen von 
VHDL-Anfängern sind (wie du) an dieser Schwelle gestolpert  ;-)

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


Lesenswert?

zwieblum schrieb:
> kann mal jemand sagen um welche sprache es hier geht?
Zweiter Post (von Antti), erste Zeile, da stehts: VHDL

von berndl (Gast)


Lesenswert?

V1:

         if myTestData(row).msb_first = 1 then
            i_core.msb_first <= '1';
         else
            i_core.msb_first <= '0';
         end if;

V2:

         i_core.msb_first <= '1' when myTestData(row).msb_first = 1 else 
'0';


Wie, als was, sind denn die Signale/Variablen deklariert? Also den 
gesamten Context, nicht nur ein Schnipsel...

von Georg A. (Gast)


Lesenswert?

Die Signale sind unwichtig. Der einzige Kontext, der als Info gefehlt 
hat, war dass es in einem Prozess stand. Naja, das übliche halt...

AFAIK soll doch aber in VHDL2008 das when im Prozess erlaubt werden, 
oder sowas in der Art. Bis das aber in den Tools ankommt, dauert es wohl 
noch so 1-2 Jahrzehnte ;)

von Klaus F. (kfalser)


Lesenswert?

Antti schrieb:
> die begrundung ist in den Kopfen von den VHDL language authors...
>
> den grund fur when/if zu begreifen, ist einfach so, man muss
> es wissen...
>
> Antti

Der Grund liegt wohl auch an der englischen Sprache.
"When" wird verwendet bei Aussagen, die sich über einen längeren 
Zeitraum beziehen, der genaue Zeitpunkt aber nicht festliegt -> when 
it's cloudy then it may rain.
Eine Aussage mit "If" bezieht sich auf den aktuellen Zeitpunkt -> if 
it's cloudy then you have to take your umbrella with you.

Deshalb wird when bei Statements verwendet, die "dauernd" laufen 
(concurrent) und if bei sequential Statements, wo die Entscheidung 
sozusagen im Moment getroffen wird.

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.