Изучение VHDL

       

Изучение VHDLОператор цикла.


Этот оператор несколько раз выполняет последовательность операторов. Его синтаксис:

\оператор цикла\::=[\метка\:][\схема итерации\]loop

       {\последовательный оператор\}

       {next[\метка\][when \условие\];}

       {exit[\метка\][when \условие\];}

end loop [\метка\];

\схема итерации\::=while \условие\  | for \переменная цикла \ in \диапазон\

Метка \метка\ необязательна, она отмечает начало цикла и используется для организации вложенных циклов или для указания в каком цикле начать новую итерацию по оператору next или из какого цикла выйти по оператору exit.

По первой схеме итераций цикл, ограниченный ключевыми словами loop и end loop будет выполняться, пока условие \условие\ не примет значение false. Причем, это условие проверяется до выполнения цикла и если оно равно false, то цикл не выполняется. В примере:



variable vec: bit_vector(1 to n);

variable or_vec:bit;

variable i:natural;

i:=1; 

or_vec:='0';

while i<=n loop

          or_vec:= or_vec or vec(i);

           i:=i+1;

end loop;

вычисляется переменная or_vec, равная функции ИЛИ от всех разрядов вектора vec длины n. Если n = 0, то цикл не вычисляется. Этот пример можно записать с помощью второй схемы итерации как:

variable vec: bit_vector(1 to n);

variable or_vec:bit;

       ….

     or_vec:='0';

for i in 1 to n loop

          or_vec:= or_vec or vec(i);

     end loop;

Здесь переменная цикла i последовательно принимает значения 1,2,… из диапазона 1 to n. Если необходим обратный порядок изменения переменной цикла: n, n-1,… то этот диапазон может быть задан как:  n downto 1 . Следует отметить, что переменную цикла не нужно объявлять, как другие переменные и ей нельзя выполнять присваивания.

Если необходимо завершить очередную итерацию до ее окончания, то применяют оператор next запуска следующей итерации. В примере

variable vec: bit_vector(1 to n);

variable numb:natural;

numb:=0;

for i in 1 to n loop

    next when vec(i)='0';

    numb:=numb+1;

end loop;

вычисляется число единиц в векторе vec.

При необходимости закончить оператор цикла до завершения всех итераций применяют оператор exit выхода из цикла. В примере

variable vec: bit_vector(1 to n);

variable numb:natural;

numb:=0;

for i in 1 to n loop

    exit when vec(i)='1';

    numb:=numb+1;

end loop;

благодаря оператору exit, находится номер самой левой единицы в векторе vec, т.е. реализована функция приоритетного шифратора. Сравните, насколько проще оказалось программирование этой схемы по сравнению с программированием стилем потоков данных (заметка "Hallo, World"), при том, что синтезатор синтезирует этот фрагмент программы достаточно эффективно.

Оператор loop часто применяется без схемы итерации, т.е. когда цикл может выполняться неопределенно большое число раз. Следующий пример с таким циклом илюстрирует модель счетчика синхроимпульсов CLK.

signal clk: bit;

signal numb:natural;

numb<=0;

loop

    wait until clk='1';

    numb<=numb+1;

end loop;



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