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

VHDL Wait-Statements meistern: Wait On, Wait Until und kombinierte Nutzung

Im vorherigen Tutorial untersuchten wir die Unterschiede zwischen Signalen und Variablen in VHDL – Signale haben einen größeren Geltungsbereich als Variablen, die auf einen einzelnen Prozess beschränkt sind. Die nächste logische Frage ist, wie man mehrere Prozesse mithilfe von Signalen koordiniert.

Neben dem bekannten wait; (endloser Halt) und wait for (zeitbasierter Halt) bietet VHDL zwei leistungsfähige Statements für ereignisgesteuerte Synchronisation: Wait On und Wait Until. Diese lassen sich auch mit wait for kombinieren, um komplexe Steuerungsflüsse zu erzeugen.

Wait On

Das wait on-Statement hält einen Prozess an, bis sich eines der aufgeführten Signale ändert.

wait on <signal_name1>, <signal_name2>, ...;

Wait Until

Das wait until-Statement pausiert die Ausführung, bis eine angegebene boolesche Bedingung wahr wird.

wait until <Bedingung>;

Kombination von Wait-Statements

Alle drei Konstrukte können zusammen verwendet werden, um feingranulare Timing-Verhalten zu erzeugen:

wait on <signal_name1> until <Bedingung> for <zeitwert>;

Beispiel: Die folgende Zeile hält für 10 ns an oder bis signal1 sich ändert und signal2 gleich signal3 ist:

wait on signal1 until signal2 = signal3 for 10 ns;

Praktisches Beispiel

Unten steht ein vollständiger Testbench, der zeigt, wie wait on und wait until für die Kommunikation zwischen Prozessen eingesetzt werden können.

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 Konsolenausgabe in ModelSim veranschaulicht die Ereignisfolge:

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 aktualisiert CountUp und CountDown gleichzeitig alle 10 ns. Da Signalzuweisungen erst nach einem wait-Statement wirksam werden, werden beide Zähler bei jedem Simulationsschritt gemeinsam aktualisiert.

Der zweite Prozess nutzt wait on CountUp, CountDown; und hält an, bis sich einer der Zähler ändert. Wie gezeigt, löst dies bei 0 ns (initiales Update) und anschließend bei jeder Signaländerung aus.

Der dritte Prozess verwendet wait until CountUp = CountDown;. Er wird bei jeder Signaländerung geweckt, setzt die Ausführung aber nur fort, wenn die Gleichheit gilt. Daher erscheint die Meldung „Jackpot!“ nur einmal – bei 40 ns, wenn beide Zähler 5 erreichen.

VHDL Wait-Statements meistern: Wait On, Wait Until und kombinierte Nutzung

Zusammenfassung

Weiter zum nächsten Tutorial für tiefere Einblicke in VHDL-Synchronisation.

VHDL

  1. In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen
  2. Impure Functions in VHDL nutzen: FSM-Lesbarkeit und Wartbarkeit steigern
  3. VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
  4. Prozeduren in VHDL: Wiederverwendbaren Code für einfachere Designs
  5. Konstanten und Generic Maps in VHDL für flexible Moduldesigns nutzen
  6. VHDL Port Map Instanziierung meistern: Praktischer Leitfaden
  7. Case-When Statement in VHDL meistern: Effizientes Multiplexer-Design
  8. Kostenloser VHDL-Simulator & Editor: Ein Leitfaden für Studierende
  9. PIC18 Mikrocontroller: Eigenschaften, Performance & Programmierung
  10. Referenzbezeichner verstehen: PCB-Bestückungsanschlüsse korrekt kennzeichnen