正确的触发器建模方法

时间:2014-09-17 04:24:55

标签: verilog flip-flop

我正在阅读来自Microsemi网站(Actel HDL Code)的文档,我发现了一些触发器(同步,异步等)的实现。在所有情况下,作者都用触发器模拟了触发器。阻止陈述。

我想知道这些实现是否正确,因为我一直使用非阻塞来建模顺序逻辑?我错过了什么,或者它只是一种模拟触发器而不是顺序电路的方法吗?

// 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 个答案:

答案 0 :(得分:1)

触发器应该按照您之前的想法使用非阻塞(<=)进行建模。

如果您在1995年之后使用任何版本的verilog ,那么您的端口声明可以稍微整理一下。注意:为了清晰起见,我添加了开头,_n指定了有效的低信号。

具有异步复位的上升沿触发器

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

具有同步复位功能的上升沿触发器

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