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

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

Изучение VHDL

Последовательные операторы.

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

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

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

\схема итерации\::=while \условие\

       | for \переменная цикла \ in \диапазон\

Метка \метка\ необязательна, она отмечает начало цикла и используется для организации вложенных циклов или для указания в каком цикле начать новую итерацию по оператору next или из какого цикла выйти по оператору exit.
По первой схеме итераций цикл, ограниченный ключевыми словами 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;

Здесь переменная цикла i последовательно принимает значения 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.
При необходимости закончить оператор цикла до завершения всех итераций применяют оператор exit выхода из цикла. В примере

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;

благодаря оператору exit, находится номер самой левой единицы в векторе 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