www.mikrocontroller.net

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


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

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';

Leider ist der Compiler da anderer Meinung und haut mir (für V2) ein
# ** 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?

Autor: Antti (Gast)
Datum:

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

Autor: Anfänger (Gast)
Datum:

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

Autor: D. I. (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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
  i_core.msb_first <= '1' when myTestData(row).msb_first = 1 else '0';
geht nicht innerhalb eines Prozesses.

Autor: Anfänger (Gast)
Datum:

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

Autor: Antti (Gast)
Datum:

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

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mal jemand sagen um welche sprache es hier geht?

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

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

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

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

Autor: berndl (Gast)
Datum:

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

Autor: Georg A. (Gast)
Datum:

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

Autor: Klaus Falser (kfalser)
Datum:

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

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.