Поиск…


Синтаксис

  • 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 все еще имеет свое первоначальное значение в правой части второго присваивания в блоке.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow