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
casestatusis
3
whenfall1=>data<=(others=>'0');
4
status<=fall2;
5
whenfall2=>data<=x"ff0000ff";-- data
6
status<=fall3;
7
whenfall3=>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?
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.
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".
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.
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
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.
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.
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.
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
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 VHDLkein
"break"...