Forum: FPGA, VHDL & Co. VHDL — if then if then if then


von Mans A. (mansmaak)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

und zwar habe ich ein Problem mit folgendem VHDL-Code! Mit dem Ausgang Y 
im Prozess! (siehe Anhang)
In einer if then-Anweisung bekommt y ständig einen neuen Wert, da die 
Anweisungen ja sequentiell abgearbeitet werden!
Wenn ich nun eine Wahrheitstabelle erstelle, dann kriegt zunächst jedes 
a=0 eine 1 zugewiesen! Dann wird die zweite Anweisung abgearbeitet! Wenn 
b=0, dann kriegt y den Wer 0 zugewiesen und die erste Anweisung wird 
überschrieben! Und das selbe mit dem Eingan c! Wenn ich die 
Wahrheitstabelle nun erstelle kriege ich folgendes Ergebnis(siehe 
Anhang, ypink)! Die richtige Lösung ist jedoch (Anhang ylila)!

Ich hoffe ihr könnt mir weiterhelfen!

Danke schon mal im Voraus

von Achim S. (Gast)


Lesenswert?

Mans A. schrieb:
> Wenn ich die
> Wahrheitstabelle nun erstelle kriege ich folgendes Ergebnis(siehe
> Anhang, ypink)! Die richtige Lösung ist jedoch (Anhang ylila)!

Es wäre etwas eindeutiger, wenn du die y-Spalte grün und rot gemacht 
hättest (die Unterscheidung zwischen pink und lila und die zuordnung zu 
deinen tatsächlichen Stiftfarben ist etwas problematisch). Die 
Ergebnisse der ersten Y-Spalte sind jedenfalls die korrekten, nicht die 
der zweiten y-Spalte.

Betrachte z.B. die Kombination a=1, b=0, c=1. In der zweiten Zeile des 
Prozesses wird y der Wert Z zugewiesen.

Da die folgende Abfrage (if a=0) nicht erfüllt ist kannst du den 
gesamten if-then Block bis zu zugehörigen endif überspringen (also die 
nächsten 5 Zeilen) - es gibt also keine weitere Zuweisung an y, die das 
Z überschreiben könnte.

von Burkhard K. (buks)


Lesenswert?

Achim S. schrieb:
> Da die folgende Abfrage (if a=0) nicht erfüllt ist kannst du den
> gesamten if-then Block bis zu zugehörigen endif überspringen

Anders ausgedrückt, Du könntest in der Wahrheitstabelle in den Reihen 3 
und 4 die Argumente "b" und "c" auch als "don't care" markieren, in der 
Reihe 2 das Argument "c" - und somit verdeutlichen, dass das zuvor vor 
dem (if a=0)-Block gesetzte "Z" gilt.

: Bearbeitet durch User
von Mans A. (mansmaak)


Lesenswert?

> Da die folgende Abfrage (if a=0) nicht erfüllt ist kannst du den
> gesamten if-then Block bis zu zugehörigen endif überspringen (also die
> nächsten 5 Zeilen) - es gibt also keine weitere Zuweisung an y, die das
> Z überschreiben könnte.

Also, wenn die erste Anweisung nicht korrekt ist, werden die anderen 
nicht durchgearbeitet?
In C# ist das jedoch anders, wenn die erste if Anweisung nicht stimmt, 
wird dann die nächste abgearbeitet!

von Achim S. (Gast)


Lesenswert?

Mans A. schrieb:
> In C# ist das jedoch anders, wenn die erste if Anweisung nicht stimmt,
> wird dann die nächste abgearbeitet!

Wenn das if in C# einen ganzen Anweisungsblock abdeckt (das Teil mit den 
geschweiften Klammern), dann stuert die if-Abfrage die Durchführung des 
gesamten Blocks.

In VHDL gilt das if-then bis zum zugehörigen end if (oder bis zu einem 
zugehörigen elsif oder else sofern vorhanden).

von mansmaak (Gast)


Lesenswert?

Ok super! Hab’s verstanden!

von S. R. (svenska)


Lesenswert?

Mans A. schrieb:
> In einer if then-Anweisung bekommt y ständig einen neuen
> Wert, da die Anweisungen ja sequentiell abgearbeitet werden!

Falsch. In VHDL werden die Signale erst am Ende des Prozesses 
zugewiesen, nicht zwischendurch.

Wird ein Signal im Prozess nicht zugewiesen, dann bleibt der alte Wert 
erhalten (die Synthese schenkt dir dann meist ein Latch).

Nachtrag: Wenn du die Einrückungen (zu jedem "if" gehört ein "end if") 
ordentlich machst, dann siehst du auch besser, wie alles zusammenhängt.

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