0

我正在浏览 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

注意:总是阻塞中使用的阻塞分配以获得顺序逻辑

4

1 回答 1

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
于 2014-09-17T11:55:20.207 回答