Освоение операторов Wait в VHDL: Wait On, Wait Until и их комбинирование
В предыдущем уроке мы исследовали различия между сигналами и переменными в VHDL, подчеркивая, что сигналы имеют более широкую область видимости, чем переменные, ограниченные одним процессом. Следующий логический вопрос — как координировать несколько процессов с помощью сигналов.
Помимо знакомых wait; (бесконечная пауза) и wait for (пауза по времени), VHDL предлагает два мощных оператора для событийно-ориентированной синхронизации: Wait On и Wait Until. Их также можно комбинировать с wait for для создания сложных потоков управления.
Wait On
Оператор wait on приостанавливает процесс до изменения любого из перечисленных сигналов.
wait on <signal_name1>, <signal_name2>, ...;
Wait Until
Оператор wait until приостанавливает выполнение до тех пор, пока заданное булевское условие не станет истинным.
wait until <condition>;
Комбинирование операторов Wait
Все три конструкции могут использоваться вместе для создания тонких временных поведений:
wait on <signal_name1> until <condition> for <time_value>;
Например, следующая строка приостановится на 10 нс или до изменения signal1 и равенства signal2 и signal3:
wait on signal1 until signal2 = signal3 for 10 ns;
Практический пример
Ниже приведен полный тестбенч, демонстрирующий использование wait on и wait until для межпроцессного взаимодействия.
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;
Вывод консоли в ModelSim иллюстрирует последовательность событий:
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
Анализ
Первый процесс обновляет CountUp и CountDown одновременно каждые 10 нс. Поскольку присваивание сигналов вступает в силу только после оператора wait, оба счетчика обновляются вместе на каждом шаге симуляции.
Второй процесс использует wait on CountUp, CountDown;, приостанавливаясь до изменения любого счетчика. Как показано, это срабатывает в 0 нс (начальное обновление) и затем при каждом изменении любого сигнала.
Третий процесс использует wait until CountUp = CountDown;. Он просыпается при каждом изменении сигнала, но продолжает выполнение только когда условие истинно. Следовательно, сообщение «Jackpot!» появляется только один раз — в 40 нс, когда оба счетчика достигают 5.

Вывод
- Wait On приостанавливает до изменения любого указанного сигнала.
- Wait Until просыпается при изменении сигнала, но продолжает только если условие истинно.
- Все три конструкции —
wait on,wait untilиwait for— могут комбинироваться для детального управления.
Переходите к следующему уроку для глубокого погружения в синхронизацию VHDL.
VHDL
- Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
- Использование нечистых функций в VHDL: повышение читаемости и поддерживаемости FSM
- Освоение функций VHDL: практическое руководство по эффективному дизайну
- Использование процедур в VHDL: упростите свой дизайн с повторно используемым кодом
- Использование констант и generic map в VHDL для гибкого дизайна модулей
- Освоение инстанцирования port map в VHDL: практическое руководство
- Освоение оператора Case-When в VHDL: эффективный дизайн мультиплексора
- Бесплатный симулятор и редактор VHDL: руководство для студентов
- Микроконтроллеры PIC18: особенности, производительность и руководство по использованию
- Понимание референс-десигнаторов: как маркировать соединения сборки ПП