Найти тему

Циклы в Verilog

Оглавление

В языке Verilog реализовано 2 типа циклов: while – цикл с предусловием и for – цикл с параметром (счетчиком). Третий цикл do в Verilog не предусмотрен.

Цикл While

Условие выхода из цикла проверяется каждый раз перед выполнением тела цикла.

Синтаксис:

while (логическое выражение) тело цикла, оператор 1;

Или:

while (логическое_выражение) begin
тело цикла, оператор 1;
тело цикла, оператор 2;
... тело цикла, оператор n;
end

Рассмотрим цикл While на примере циклического сдвига числа 8′b10001101 вправо на 4 бита. При таком типе сдвига, старшие биты (с 8-го по 2-ой) сдвигаются на 1 позицию вправо, а младший бит (1-ый) переносится на старшую (8-ую) позицию. Таким образом, циклически сдвинув число 8′b10001101 на 4 позиции вправо, получим 8′b11011000.

Код программы:

`timescale 1 ns / 1 ps

module main (
input wire rst,
input wire start,
output reg [7:0] out
);

integer i;

always @(posedge rst, posedge start)
if (rst) begin
out = 8'b10001101;
i = 0;
end
else begin
i = 0;
while (i < 4) begin
out = {out[0], out[7:1]};
i = i + 1;
end
end

endmodule

В данном случае, имеется регистр [7:0] out, которому по сигналу сброса rst присваивается значение 8′b10001101. По фронту сигнала start выполняется цикл while до тех пор, пока истинно условие i < 4.

Цикл For

Цикл for называется циклом с параметром. При его использовании указывается начальное значение параметра, условие выхода из цикла и счетчик итераций. Счетчик, как и в цикле while используется с блокирующим присваиванием.

Синтаксис:

for (i = 0; i < N; i = i + 1) тело_цикла_1;

Или:

for (i = 0; i < N; i = i + 1) begin
тело цикла, оператор 1;
тело цикла, оператор 2;
...
тело цикла, оператор n;
end

В примере с циклом wire можно заменить строки:

i = 0;
while (i < 4) begin
out = {out[0], out[7:1]}; i = i + 1;
end

на:

for(i = 0; i < 4; i = i + 1)
out = {out[0], out[7:1]};

Результат симуляции будет аналогичен предыдущему примеру.

Цикл Repeat

Цикл repeat применяется, если какое-то действие необходимо выполнить фиксированное число раз.

Синтаксис:

repeat (число_итераций) begin
тело цикла, оператор 1;
тело цикла, оператор 2;
...
тело цикла, оператор n;
end

Число_итераций задается целым положительным числом. Для примера заменим участок кода:

for (i = 0; i < 4; i = i + 1)
out = {out[0], out[7:1]};

на:

repeat (3) out = {out[0], out[7:1]};

Цикл выполнится 3 раза, результат симуляции будет аналогичен предыдущему.

Цикл Forever

Цикл Forever является бесконечным циклом, поэтому при его использовании, необходимо указывать какие-либо временные параметры, иначе при моделировании данный цикл будет бесконечно выполняться на нулевом модельном времени.

Синтаксис:

forever тело цикла, оператор 1 ;

или:

forever begin
тело цикла, оператор 1;
тело цикла, оператор 2;
...
тело цикла, оператор n;
end

#verilog