So verwenden Sie bedingte Anweisungen in VHDL:If-Then-Elsif-Else
Im vorherigen Tutorial haben wir einen Bedingungsausdruck mit der Wait Until-Anweisung verwendet. Der Ausdruck sorgte dafür, dass der Prozess nur ausgelöst wurde, wenn die beiden Zählersignale gleich waren. Aber was wäre, wenn wir wollten, dass das Programm in einem Prozess verschiedene Aktionen basierend auf verschiedenen Eingaben ausführt?
Die If-Then-Elsif-Else-Anweisungen können verwendet werden, um Verzweigungen in unserem Programm zu erstellen. Abhängig vom Wert einer Variablen oder dem Ergebnis eines Ausdrucks kann das Programm unterschiedliche Wege einschlagen.
Dieser Blogpost ist Teil der Reihe Basic VHDL Tutorials.
Die grundlegende Syntax ist:
if <condition> then
elsif <condition> then
else
end if;
Die elsif
und else
sind optional und elsif
kann mehrfach verwendet werden. Die <condition>
kann ein boolescher true
sein oder false
, oder es kann ein Ausdruck sein, der zu true
ausgewertet wird oder false
.
Beispielausdruck, der true
ist wenn MyCounter
ist kleiner als 10:
MyCounter < 10
Vergleichsoperatoren:
= | gleich |
/= | nicht gleich |
< | weniger als |
<= | kleiner oder gleich |
> | größer als |
>= | größer oder gleich |
Logische Operatoren:
nicht ein | wahr, wenn ein ist falsch |
a und b | wahr, wenn ein und b sind wahr |
a oder b | wahr, wenn ein oder b sind wahr |
a und b | wahr, wenn ein oder b ist falsch |
a noch b | wahr, wenn ein und b sind falsch |
a oder b | wahr, wenn genau einer von einem oder b sind wahr |
a xnor b | wahr, wenn ein und b gleich sind |
Übung
In diesem Video-Tutorial lernen wir, wie man If-Then-Elsif-Else-Anweisungen in VHDL verwendet:
Der endgültige Code, den wir in diesem Tutorial erstellt haben:
entity T08_IfTb is end entity; architecture sim of T08_IfTb is signal CountUp : integer := 0; signal CountDown : integer := 10; begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; process is begin if CountUp > CountDown then report "CountUp is larger"; elsif CountUp < CountDown then report "CountDown is larger"; else report "They are equal"; end if; wait on CountUp, CountDown; end process; end architecture;
Die Ausgabe an die Simulatorkonsole, wenn wir in ModelSim die Run-Taste gedrückt haben:
VSIM 2> run # ** Note: CountDown is larger # Time: 0 ns Iteration: 0 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 0 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 10 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 20 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 30 ns Iteration: 1 Instance: /t08_iftb # ** Note: They are equal # Time: 40 ns Iteration: 1 Instance: /t08_iftb # ** Note: Countup is larger # Time: 50 ns Iteration: 1 Instance: /t08_iftb # ** Note: Countup is larger # Time: 60 ns Iteration: 1 Instance: /t08_iftb ...
Analyse
Wir haben CountDown
angegeben einen Anfangswert von 10 und CountUp
einen Wert von 0. Der erste Prozess ändert beide Zählerwerte zur exakt gleichen Zeit, alle 10 ns. In diesem Fall wird der zweite Prozess ausgelöst, da das Programm immer bei wait on CountUp, CountDown;
wartet Linie. Das Programm wird dort immer warten, weil die If-Then-Elsif-Else- und die Berichtsanweisungen null Simulationszeit verbrauchen.
Die If-Then-Elsif-Else-Anweisung veranlasst das Programm, einen der drei von uns erstellten Zweige zu nehmen. Die beiden ersten Zweige decken die Fälle ab, in denen die beiden Zähler unterschiedliche Werte haben. Wir hätten die einzelne else
weglassen können , und verwendet elsif CountUp = CountDown then
was das gleiche Ergebnis gehabt hätte. Aber es ist gute Designpraxis, alle Branches und den else
abzudecken Klausel deckt alle vorsätzlichen und unvorhergesehenen Fälle ab.
Wie wir aus dem Ausdruck sehen können, nimmt der zweite Prozess jedes Mal, wenn sich die Zähler ändern, einen der drei Zweige.
Imbiss
- If-Then kann allein oder in Kombination mit Elsif und Else verwendet werden.
- Ausdrücke können relationale und logische Vergleiche und mathematische Berechnungen enthalten
Weiter zum nächsten Tutorial »
VHDL
- Wie verwenden wir Molybdän?
- So erstellen Sie eine Liste von Zeichenfolgen in VHDL
- So stoppen Sie die Simulation in einer VHDL-Testbench
- So erstellen Sie einen PWM-Controller in VHDL
- So generieren Sie Zufallszahlen in VHDL
- So verwenden Sie eine Prozedur in einem Prozess in VHDL
- So verwenden Sie eine unreine Funktion in VHDL
- So verwenden Sie eine Funktion in VHDL
- So erstellen Sie einen endlichen Automaten in VHDL
- So verwenden Sie einen Cutter Grinder