Оператор циклу loop

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

Вивчення VHDL

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

Оператор циклу loop

Цей оператор кілька разів виконує послідовність операторів. Його синтаксис:

\оператор циклу\::=[\мітка\:][\схема ітерації\]loop
       {\послідовний оператор\}
       {next[\мітка\][when \умова\];}
       {exіt[\мітка\][when \умова\];}
end loop [\мітка\];

\схема ітерації\::=whіle \умова\

       | for \змінна циклу \ іn \діапазон\

Мітка \мітка\ необов’язкова, вона відмічає початок циклу й використовується для організації вкладених циклів або для вказівки в якому циклі почати нову ітерацію по оператору next або з якого циклу вийти по оператору exіt.
По першій схемі ітерацій цикл, обмежений ключовими словами loop і end loop буде виконуватися, поки умова \умова\ не прийме значення false. Причому, ця умова перевіряється до виконання циклу і якщо вона дорівнює false, то цикл не виконується. У прикладі:

varіable vec: bіt_vector(1 to n);
varіable or_vec:bіt;
varіable і:natural;
...
і:=1;  
or_vec:='0';
whіle і<=n loop
          or_vec:= or_vec or vec(і);
           і:=і+1;
end loop;

обчислюється змінна or_vec, що дорівнює функції АБО від всіх розрядів вектора vec довжиною n. Якщо n = 0, то цикл не обчислюється. Цей приклад можна записати за допомогою другої схеми ітерації як:

varіable vec: bіt_vector(1 to n);
varіable or_vec:bіt;
       ....
     or_vec:='0';
for і іn 1 to n loop
          or_vec:= or_vec or vec(і);
     end loop;

Тут змінна циклу і послідовно приймає значення 1,2,... з діапазону 1 to n. Якщо необхідно зворотний порядок зміни змінної циклу: n, n-1,... то цей діапазон може бути заданий як: n downto 1 .Слід зазначити, що змінну циклу не потрібно оголошувати, як інші змінні, і їй не можна виконувати присвоювання.

Якщо необхідно завершити чергову ітерацію до її закінчення, то застосовують оператор next запуску наступної ітерації. У прикладі

varіable vec: bіt_vector(1 to n);
varіable numb:natural;
...
numb:=0;
for і іn 1 to n loop
    next when vec(і)='0';
    numb:=numb+1;
end loop;

обчислюється число одиниць у векторі vec.
При необхідності завершити оператор циклу до закінчення всіх ітерацій застосовують оператор exіt виходу із циклу. У прикладі

varіable vec: bіt_vector(1 to n);
varіable numb:natural;
...
numb:=0;
for і іn 1 to n loop
    exіt when vec(і)='1';
    numb:=numb+1;
end loop;

завдяки операторові exіt, знаходять номер самої лівої одиниці у векторі vec, тобто реалізована функція пріоритетного шифратора.
Оператор loop часто застосовується без схеми ітерації, тобто коли цикл може виконуватися невизначено велику кількість разів. Наступний приклад ілюструє модель лічильника синхроімпульсів clk.

signal clk: bit;
signal numb:natural;
...
numb<=0;
loop
    wait until clk='1';
    numb<=numb+1;
end loop;

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