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

So verwenden Sie „Warten auf“ und „Warten bis“ in VHDL

Im vorherigen Tutorial haben wir die Hauptunterschiede zwischen Signalen und Variablen kennengelernt. Wir haben gelernt, dass Signale einen größeren Anwendungsbereich haben als Variablen, die nur innerhalb eines Prozesses zugänglich sind. Wie können wir also Signale für die Kommunikation zwischen mehreren Prozessen verwenden?

Wir haben bereits gelernt, wait; zu verwenden um unendlich zu warten, und wait for eine bestimmte Zeit zu warten. Es gibt zwei weitere Arten von Wait-Anweisungen in VHDL.

Dieser Blogpost ist Teil der Reihe Basic VHDL Tutorials.

Die Wait On-Anweisung hält den Prozess an, bis sich eines der angegebenen Signale ändert:
wait on <signal_name1>, <signal_name2> ...;

Die Wait Until-Anweisung wird angehalten, bis ein Ereignis dazu führt, dass die Bedingung wahr wird:
wait until <condition>;

Tatsächlich können Wait On, Wait Until und Wait For kombiniert werden:
wait on <signal_name1> until <condition> for <time_value>;

Dieses Beispiel pausiert für 10 Nanosekunden oder bis signal1 Änderungen und signal2 ist gleich signal3 :
wait on signal1 until signal2 = signal3 for 10 ns;

Übung

In diesem Video-Tutorial lernen wir, wie man die Wait On- und Wait Until-Anweisungen für die Kommunikation zwischen Prozessen in VHDL verwendet:

Der endgültige Code, den wir in diesem Tutorial erstellt haben:

entity T07_WaitOnUntilTb is
end entity;

architecture sim of T07_WaitOnUntilTb 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

        wait on CountUp, CountDown;
        report "CountUp=" & integer'image(CountUp) &
            " CountDown=" & integer'image(CountDown);

    end process;

    process is
    begin

        wait until CountUp = CountDown;
        report "Jackpot!";

    end process;


end architecture;

Die Ausgabe an die Simulatorkonsole, wenn wir in ModelSim die Run-Taste gedrückt haben:

VSIM 2> run
# ** Note: CountUp=1 CountDown=9
#    Time: 0 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=2 CountDown=8
#    Time: 10 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=3 CountDown=7
#    Time: 20 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=4 CountDown=6
#    Time: 30 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=5 CountDown=5
#    Time: 40 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: Jackpot!
#    Time: 40 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=6 CountDown=4
#    Time: 50 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=7 CountDown=3
#    Time: 60 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=8 CountDown=2
#    Time: 70 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=9 CountDown=1
#    Time: 80 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=10 CountDown=0
#    Time: 90 ns  Iteration: 1  Instance: /t07_waitonuntiltb
# ** Note: CountUp=11 CountDown=-1
#    Time: 100 ns  Iteration: 1  Instance: /t07_waitonuntiltb

Analyse

Der erste Prozess erhöht den CountUp Zähler und dekrementiert den CountDown Zähler. Sie werden gleichzeitig aktualisiert. Obwohl die Signalzuweisungen der beiden Signale dabei auf unterschiedlichen Zeilen liegen, werden zugewiesene Signalwerte erst wirksam, wenn das Programm auf eine Wait-Anweisung trifft. Der Prozess führt diesen Vorgang zu Beginn der Simulation und dann alle 10 Nanosekunden durch.

Die erste Zeile des zweiten Prozesses ist wait on CountUp, CountDown; . Das Programm wartet an dieser Zeile, bis sich eines oder beide Signale ändern. Wie wir dem Ausdruck entnehmen können, geschieht dies bei 0 ns Simulationszeit, wenn die Zähler zum ersten Mal geändert werden, und jedes Mal, wenn sie sich danach ändern.

Die erste Zeile des dritten Prozesses ist wait until CountUp = CountDown; . Das Programm wacht jedes Mal auf, wenn sich eines der beiden Signale ändert, genau wie beim ersten Prozess. Aber es wird nur fortgesetzt, wenn der Ausdruck zu true ausgewertet wird , sonst schläft es wieder ein. Wie wir dem Ausdruck entnehmen können, „Jackpot!“ wird nur einmal gedruckt, bei 40 ns, wenn beide Zähler den gleichen Wert haben.

Imbiss

Weiter zum nächsten Tutorial »


VHDL

  1. So verwenden Sie eine Prozedur in einem Prozess in VHDL
  2. So verwenden Sie eine unreine Funktion in VHDL
  3. So verwenden Sie eine Funktion in VHDL
  4. So verwenden Sie eine Prozedur in VHDL
  5. So verwenden Sie Konstanten und generische Karten in VHDL
  6. So verwenden Sie die Port Map-Instanziierung in VHDL
  7. So verwenden Sie eine Case-When-Anweisung in VHDL
  8. So installieren Sie kostenlos einen VHDL-Simulator und -Editor
  9. PIC18-Mikrocontroller:Was er ist und wie er verwendet wird
  10. Was ist ein Referenzdesignator und wie verwenden wir ihn in der Montage?