Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> VHDL

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

Weiter zum nächsten Tutorial »


VHDL

  1. Wie verwenden wir Molybdän?
  2. So erstellen Sie eine Liste von Zeichenfolgen in VHDL
  3. So stoppen Sie die Simulation in einer VHDL-Testbench
  4. So erstellen Sie einen PWM-Controller in VHDL
  5. So generieren Sie Zufallszahlen in VHDL
  6. So verwenden Sie eine Prozedur in einem Prozess in VHDL
  7. So verwenden Sie eine unreine Funktion in VHDL
  8. So verwenden Sie eine Funktion in VHDL
  9. So erstellen Sie einen endlichen Automaten in VHDL
  10. So verwenden Sie einen Cutter Grinder