verkürzte Schreibweise einer bedingten Zuweisung führt zu Fehler?

Gast #1384991
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?
Gast #1384997
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
Gast #1385023
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.
Moderator (Firma: Titel) Persönliche Seite #1385057
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.
Gast #1385094
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
Moderator (Firma: Titel) Persönliche Seite #1385109
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  ;-)
#1386164
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren