Изучение VHDLОператор ожидания события wait.
Этот оператор уже упоминаляся при описании вычислительной модели для программирования на VHDL, принципов работы симулятора. На этом операторе выполнение процесса останавливается, в момент остановки выполняются присваивания сигналам и процесс продолжает исполнение при появлении события, которое выбирается этим оператором. Синтаксис оператора wait:
\оператор wait\::=wait [on \имя сигнала\{,\имя сигнала\}]
[until \булевское выражение\] [for \выражение времени\];
где ключевое слово on начинает список чувствительности, until - условие ожидания, а for - задержку ожидания. По оператору
wait on CLK, RST;
продолжение выполнения процесса начнется по событию изменения сигналов CLK или RST. По оператору
wait until CLK='1';
продолжение начнется в момент изменения состояния CLK из '0' в '1', т.е. по фронту этого сигнала. Оператор
wait for CLK_PERIOD;
остановит процесс на время, заданное переменной CLK_PERIOD типа time.
Возможно комбинирование списка чувствительности, условия ожидания в одном операторе.
Оператор wait без списка чувствительности, условия ожидания и задержки ожидания остановит процесс до конца моделирования. Процесс, в котором последним оператором стоит единственный оператор wait on \СЧ\; эквивалентен процессу со списком чувствительности \СЧ\, в котором стоят те же операторы, кроме wait on . Эта эквивалентная форма процесса несколько уменьшает текст программы, улучшает его чтение и напоминает фразу allways из языкаVerilog. Программа с каким - либо оператором процесса, в котором отсутствует и список чувствительности, и оператор wait , зависает, так как такой процесс начинает вычисляться циклически без остановки и без передачи управления другим процессам.
Иногда при моделировании необходимо, чтобы процесс вначале один раз выполнил, например, процедуру ST1, а затем исполнялся периодически как обычно, допустим, выполнял процедуру ST2. Такой процесс можно запрограммировать следующим образом:
process begin
ST1;
loop
ST2;
wait on some_signal_list;
end loop;
end process;
Например, таким способом просто запрограммировать генератор синхроимпульсов:
process begin
CLK<='0';
loop
CLK<=not CLK ;
exit when end_of_simulation;
wait for 10 ns;
end loop;
wait;
end process;
Этот процесс генерирует синхросерию с периодом 10+10 наносекунд в цикле loop, выходит из него при условии end_of_simulation=true и останавливается.
Обычно симулятор VHDL работает заданный промежуток времени или без остановки. А что делать, если моделирование выполняется неопределенное время? Например, запустили тяжелое моделирование на выходные. А в понедельник пришли и нашли зависший компьютер, переполненный ненужными результатами. Тогда можно использовать такое решение.
Часто в проекте синхрогенератор - это единственный источник событий, запускающих моделирование. Каждый симулятор построен таким образом, что в случае, когда нет событий, то он останавливается с сообщением: "Simulation has finished. There are no more vectors to simulate". Следовательно, вышеописанный генератор синхросерии - удобное средство для остановки симуляции по какому - то запрограммированному условию, которое вырабатывается тогда, когда симуляция с получением ожидаемых результатов завершена.