Изучение VHDL

       

Изучение 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". Следовательно, вышеописанный генератор синхросерии - удобное средство для остановки симуляции по какому - то запрограммированному условию, которое вырабатывается тогда, когда симуляция с получением ожидаемых результатов завершена.

Содержание раздела