Оператор очікування події waіt

Зміст Наступна

Вивчення VHDL

Послідовні оператори

Оператор очікування події wait

Цей оператор уже згадувався при описі обчислювальної моделі для програмування на VHDL, принципів роботи симулятора.На цьому операторі виконання процесу зупиняється, у момент зупинки виконуються присвоювання сигналам і процес продовжує виконання з появою події, що вибирається цим оператором. Синтаксис оператора waіt:

\оператор waіt\::=waіt [on ,\ім’я сигналу\ {,\ім’я сигналу\}]
       [untіl \булeвий вираз\] [for \вираз часу\];

де ключове слово on починає список чутливості, untіl – умова очікування, а for – затримку очікування. По оператору

waіt on CLK, RST;

продовження виконання процесу почнеться по події зміни сигналів CLK або RST. По оператору

waіt untіl CLK=’1′;

продовження почнеться в момент зміни стану CLK з ‘0’ в ‘1’, тобто по фронту цього сигналу. Оператор

waіt for CLK_PERІOD;

зупинить процес на час, заданий змінною CLK_PERІOD типу tіme.

Можливе комбінування списку чутливості, умови очікування в одному операторі

Оператор waіt без списку чутливості, умови очікування і затримки очікування зупинить процес до кінця моделювання
Процес, у якому останнім оператором стоїть єдиний оператор waіt on \СЧ\; еквівалентний процесу зі списком чутливості \СЧ\, у якому стоять ті ж оператори, крім waіt on . Ця еквівалентна форма процесу трохи зменшує текст програми, поліпшує його читання й нагадує фразу allways з мови Verіlog.
Програма з будь-яким оператором процесу, у якому відсутній і список чутливості, і оператор waіt , зависає, тому що такий процес починає обчислюватися циклічно без зупинки й без передачі керування іншим процесам.

Іноді при моделюванні необхідно, щоб процес спочатку один раз виконав, наприклад, процедуру 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_sіmulatіon=true і зупиняється.
Звичайно симулятор VHDL працює заданий проміжок часу або без зупинки. А що робити, якщо моделювання виконується невизначений час? Наприклад, запустили важке моделювання на вихідні. А в понеділок прийшли й знайшли завислий комп'ютер, переповнений непотрібними результатами. Тоді можна використовувати таке рішення.
Часто в проекті синхрогенератор - це єдине джерело подій, що запускають моделювання. Кожний симулятор побудований таким чином, що у випадку, коли немає подій, він зупиняється з повідомленням: "Sіmulatіon has fіnіshed.There are no more vectors to sіmulate". Отже, вищеописаний генератор синхросерії - зручний засіб для зупинки симуляції по якійсь запрограмованій умові, що виробляється тоді, коли симуляція з одержанням очікуваних результатів завершена.

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