Правильный способ моделирования флип-флоп

Я просматривал документ с веб-сайта Microsemi ( код Actel HDL) и обнаружил несколько реализаций триггера (синхронный, асинхронный и т. Д.). Во всех случаях автор моделировал триггеры с помощью операторов блокировки.

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

// Rising Edge Flip-Flop with Asynchronous Reset
module dff_async_rst (data, clk, reset, q);
  input data, clk, reset;
  output q;
  reg q;

   always @(posedge clk or negedge reset)
     if (~reset)
       q = 1'b0;
     else
       q = data;

   endmodule

//Rising Edge Flip-Flop with Synchronous Reset
module dff_sync_rst (data, clk, reset, q);
  input data, clk, reset;
  output q;
  reg q;

  always @ (posedge clk)
    if (~reset)
      q = 1'b0;
    else 
      q = data;

endmodule

ПРИМЕЧАНИЕ. Блокирующие назначения, используемые в блоке всегда для получения последовательной логики

1 ответ

Решение

Триггеры должны моделироваться с неблокирующими (<=), как вы думали ранее.

Если вы используете какую-либо версию verilog после 1995 года, то ваши декларации портов могут быть немного приведены в порядок. NB Я добавлю начальные концы для ясности и _n назначать активные низкие сигналы.

Триггер Rising Edge с асинхронным сбросом

module dff_async_rst (
  input  data,
  input  clk, 
  input  reset_n,
  output reg q    //SystemVerilog logic is preferred over reg
);

always @(posedge clk or negedge reset_n) begin
  if (~reset_n) begin
    q <= 1'b0;
  end
  else begin
    q <= data;
  end
end

endmodule

Триггер Rising Edge с синхронным сбросом

module dff_sync_rst(
  input  data,
  input  clk, 
  input  reset_n,
  output reg q    //SystemVerilog logic is preferred over reg
);


always @(posedge clk) begin
  if (~reset_n) begin
    q <= 1'b0;
  end
  else begin
    q <= data;
  end
end

endmodule
Другие вопросы по тегам