verilog
Процедурные блоки
Поиск…
Синтаксис
- always @ (posedge clk) begin / * statements * / end
- always @ (negedge clk) begin / * statements * / end
- always @ (posedge clk или posedge reset) // может синтезировать менее эффективно, чем синхронный сброс
Простой счетчик
Счетчик, использующий флип-флоп в стиле FPGA:
module counter(
input clk,
output reg[7:0] count
)
initial count = 0;
always @ (posedge clk) begin
count <= count + 1'b1;
end
Счетчик, реализованный с использованием асинхронных сбросов, подходящих для синтеза ASIC:
module counter(
input clk,
input rst_n, // Active-low reset
output reg [7:0] count
)
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) begin
count <= 'b0;
end
else begin
count <= count + 1'b1;
end
end
Процедурные блоки в этих примерах приращение count
на каждом нарастающем фронте тактового сигнала.
Неблокирующие назначения
Неблокирующее присвоение ( <=
) используется для назначения внутри always
чувствительных к краю блоков. Внутри блока новые значения не отображаются до тех пор, пока весь блок не будет обработан. Например:
module flip(
input clk,
input reset
)
reg f1;
reg f2;
always @ (posedge clk) begin
if (reset) begin // synchronous reset
f1 <= 0;
f2 <= 1;
end
else begin
f1 <= f2;
f2 <= f1;
end
end
endmodule
Обратите внимание на использование неблокирующих ( <=
) назначений здесь. Поскольку первое присваивание фактически не вступает в силу до тех пор, пока после процедурного блока второе назначение не сделает то, что предназначено, и фактически заменит две переменные - в отличие от блокирующего присвоения ( =
) или присвоений на других языках; f1
все еще имеет свое первоначальное значение в правой части второго присваивания в блоке.