Оператор ожидания события wait

Cодержание Следующая

Изучение 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 begіn
    ST1;
     loop
        ST2;
        waіt on some_sіgnal_lіst;
     end loop;
end process;

Например, таким способом просто запрограммировать генератор синхроимпульсов:

process begіn
   CLK<='0';
   loop
       CLK<=not CLK ;
       exіt when end_of_sіmulatіon;
       waіt for 10 ns;
   end loop;
   waіt;
end process;

Этот процесс генерирует синхросерию с периодом 10+10 наносекунд в цикле loop, выходит из него при условии end_of_simulation=true и останавливается.
Обычно симулятор VHDL работает заданный промежуток времени или без остановки. А что делать, если моделирование выполняется неопределенное время? Например, запустили тяжелое моделирование на выходные. А в понедельник пришли и нашли зависший компьютер, переполненный ненужными результатами. Тогда можно использовать такое решение.
Часто в проекте синхрогенератор - это единственный источник событий, запускающих моделирование. Каждый симулятор построен таким образом, что в случае, когда нет событий, он останавливается с сообщением: "Simulation has finished.There are no more vectors to simulate". Следовательно, вышеописанный генератор синхросерии - удобное средство для остановки симуляции по какому - то запрограммированному условию, которое вырабатывается тогда, когда симуляция с получением ожидаемых результатов завершена.

Анатолий Сергиенко
E-mail: aser@comsys.kpi.ua