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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mans A. (mansmaak)


Angehängte Dateien:

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


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


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


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


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


Bewertung
0 lesenswert
nicht lesenswert
Ok super! Hab’s verstanden!

von S. R. (svenska)


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

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.