Forum: FPGA, VHDL & Co. Frage Case-When-Anweisung


von Jan B. (benzin)


Lesenswert?

Hi,

ich versuche gerade mir selbst etwas VHDL beizubringen, stehe aber etwas 
auf dem Schlauch. Es handelt sich eigentlich um eine recht simple Sache, 
aber weil ich nicht weiß wonach ich so richtig suchen soll, kann ich sie 
mir nicht ergooglen und ich weiß auch nicht so recht, wie ich das ohne 
Hardware ausprobieren soll.

Es geht um die case-when-Anweisung, in meinem Fall:
1
 
2
case status is
3
    when fall1 => data    <= (others => '0');
4
                  status <= fall2;
5
    when fall2 => data    <= x"ff0000ff"; -- data
6
                  status <= fall3;
7
    when fall3 => data    <= x"ffff0000"; -- data
8
                  status <= fall1;

Ich kenne es ja aus C und C++ so, dass es natürlich von oben nach unten 
abgearbeitet wird. Bei den beiden Sprachen benutze ich aber den 
"break;"-Befehl um die Fallunterscheidung zu verlassen.

Wie funktioniert das bei VHDL?
Wenn am Anfang status fall1 ist und dementsprechend status auf fall2 
setzt, wird danach der case-when-Block verlassen, oder springt er dann 
praktisch eine Zeile weiter und führt dann die when fall2 Anweisung aus?

von VHDL hotline (Gast)


Lesenswert?

Es kommt darauf an...

Wenn du das in einem getakteten Prozess schreibst, wird zur Taktflanke 
das case statement ausgewertet und verhält sich wie in C mit break 
statement.

Wenn du das in einem ungetakteten Prozess schreibst, wird status ständig 
neu ausgewertet und du hast eine kombinatorische Schleife beschrieben.

Ausprobieren ohne Hardware geht bei VHDL sehr einfach über eine 
Simulation.

von S. R. (svenska)


Lesenswert?

Jan B. schrieb:
> Wenn am Anfang status fall1 ist und dementsprechend status auf fall2
> setzt, wird danach der case-when-Block verlassen, oder springt er dann
> praktisch eine Zeile weiter und führt dann die when fall2 Anweisung aus?

Eine jede Zuweisung innerhalb eines Prozesses wird erst am Ende des 
Prozesses übernommen. Das heißt, dass "status==fall1" bis zum Ende des 
Prozesses gilt.

In VHDL sind die Fälle nicht "fall-through", es wird immer nur ein 
einziger Fall ausgeführt.

Du kannst dir die generierte Hardware so vorstellen:
1
data = 0x00000000, status = fall2 --\
2
data = 0xFF0000FF, status = fall3 ---+ data_neu, status_neu
3
data = 0xFFFF0000, status = fall1 --/|
4
                                     |
5
                                   status

Es werden also im Prinzip drei Blöcke erzeugt, die die neuen Daten 
erzeugen. Dann folgt ein Muxer/Umschalter, der anhand des aktuellen 
"status" den passenden auswählt. Wenn du dir das so vorstellst, sollte 
es auch offensichtlich sein, dass es hier kein "nacheinander" der 
Einzelfälle gibt. Es existieren alle gleichzeitig.

Nebensatz: Wenn es um einen Automaten geht, dann heißt es nicht 
"status", sondern "state" oder "Zustand".

Beitrag #5595829 wurde vom Autor gelöscht.
von user (Gast)


Lesenswert?

In VHDL ist immer ein implizites "break" drin, stell dir vor vor jedem 
"when" steht in der Zeile davor ein "break". Sowas wie das "durchfallen" 
wie in C gibt es in VHDL nicht.

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


Lesenswert?

S. R. schrieb:
> Eine jede Zuweisung......innerhalb eines Prozesses wird erst am Ende des
> Prozesses übernommen
...an ein Signal... ?

: Bearbeitet durch Moderator
von S. R. (svenska)


Lesenswert?

Lothar M. schrieb:
>> Eine jede Zuweisung......innerhalb eines Prozesses wird erst am Ende des
>> Prozesses übernommen
> ...an ein Signal... ?

Das ist natürlich vollkommen korrekt. :-D

von Stefan W. (Gast)


Lesenswert?

Jan B. schrieb:
> Wenn am Anfang status fall1 ist und dementsprechend status auf fall2
> setzt, wird danach der case-when-Block verlassen, oder springt er dann
> praktisch eine Zeile weiter und führt dann die when fall2 Anweisung aus?

Er verlässt den case-when-Block, bzw. springt hinter das "end case", 
welches du vergessen hast. Das "durchrutschen" ist eine Eigenart von C 
und gibt es soweit ich weiß in den meisten Programmiersprachen nicht.

Was VHDL Hotline schreibt, hat damit zunächst nichts zu tun, sondern da 
geht es um die Frage, wann der case-Block das nächste Mal ausgewertet 
wird.

von VHDL-Polizei (Gast)


Lesenswert?

Jan B. schrieb:
> Ich kenne es ja aus C und C++ so, dass es natürlich von oben nach unten
> abgearbeitet wird.
Das ist bei VHDL auch so. Was vorne steht, hat mehr Gewicht.

VHDL hotline schrieb im Beitrag #5595694:
> Ausprobieren ohne Hardware geht bei VHDL sehr einfach über eine
> Simulation.
Das wirst du kaum simulieren können, nehme ich an. Der Compiler sollte 
das anmeckern.

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


Lesenswert?

VHDL-Polizei schrieb im Beitrag #5599410:
> Das ist bei VHDL auch so. Was vorne steht, hat mehr Gewicht.
Bei einer "case-when" Abfrage prinzipiell nicht, denn die Fälle darin 
müssen exklusiv sein. Es ist ja nicht so, dass nur die erste davon 
abgearbeitet wird, wenn mehrere "when" Abfragen gleichzeitig gültig 
wären...

Jan B. schrieb:
> Ich kenne es ja aus C und C++ so, dass es natürlich von oben nach unten
> abgearbeitet wird. Bei den beiden Sprachen benutze ich aber den
> "break;"-Befehl um die Fallunterscheidung zu verlassen.
> Wie funktioniert das bei VHDL?
Das nächste "when" ist automatisch das "break" des vorigen "when". Man 
darf sich da nicht vom Verhalten anderer Programmiersprachen ablenken 
lassen.
Wenn man eine Fremdsprache lernt, nennt man solche "wiedererkannte" 
Begriffe oder Syntaxelemente "false friends". Bestell mal in Amerika 
eine Pepperoni-Pizza mit den Worten "I become a peperoni pizza". Da 
wartet der Kellner erst mal überrascht auf eine eigenartige Verwandlung, 
und wenn dieses Missverständnis aufgeklärt ist und die Pizza gebacken 
wird, ist hinterher weit und breit keine Peperoni auf der Pizza zu 
sehen.

von Musterbit (Gast)


Lesenswert?

Jan B. schrieb:
> ich versuche gerade mir selbst etwas VHDL beizubringen, stehe aber etwas
> auf dem Schlauch.

Jan B. schrieb:
> Ich kenne es ja aus C und C++ so, dass

...dann fang vielleicht besser mit Verilog an. Da wirst du dir leichter 
tun und schneller Fortschritte machen. Verilog ist C ähnlicher als VHDL

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


Lesenswert?

Musterbit schrieb:
> ...dann fang vielleicht besser mit Verilog an.
Ich habe schon drauf gewartet, bis der Erste kommt...

> Da wirst du dir leichter tun und schneller Fortschritte machen.
> Verilog ist C ähnlicher als VHDL
Aber Verilog ist eben genauso wie VHDL eine Beschreibungssprache und 
keine Programmiersprache. Die Denkweise ist damit völlig andes als 
bei C. Dass einige syntaktische Elemente ähnlich aussehen, liegt daran, 
dass die Elementare Operatoren denen von C ähneln.
Da ist es eigentlich ganz gut, wenn VHDL so anders ist. Dann verwechselt 
man C-Programmierung und VHDL-Hardwarebeschreibung nicht so einfach...

> Verilog ist C ähnlicher als VHDL
Und lustigerweise beim hier diskutierten "case" ja schon gleich gar 
nicht. Denn auch in Verilog gibt es genau wie bei VHDL kein 
"break"...

: Bearbeitet durch Moderator
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.