FPGA中三种常用复位电路

可编程逻辑

1364人已加入

描述

在FPGA设计中,复位电路是非常重要的一部分,它能够确保系统从初始状态开始启动并保证正确运行。 本文将分别介绍FPGA中三种常用复位电路:同步复位、异步复位和异步复位同步释放,以及相应的Verilog代码示例。

异步复位 or 同步复位 or 异步复位同步释放,真的是“异步复位同步释放”更好吗?

一、同步复位

同步复位是一种在时钟信号的下降沿或上升沿触发的复位方式,复位信号与时钟信号同步。 由于在同步复位中,复位信号和时钟信号是同步的,因此可以确保复位操作的稳定和可预测性。 同步复位通常由一个或多个寄存器实现,如下面的实例:

module sync_reset(
  input clk,
  input rstn,
  input data_in,
  output reg data_out
);

always @(posedge clk) begin
  if(!rstn) begin
       data_out <= 'b0;
  end else begin
       data_out <= data_in;
  end
end

endmodule

在上述代码中,rst是同步复位信号,当时钟上升沿到来时,检测到复位信号为低电平时,计数器将被初始化。

综合后电路图如下:

FPGA

从图中可看出,综合后,调用的(D Flip-Flop with Clock Enable and Synchronous Reset带使能功能的同步清除D触发器) FDRE型D触发器。

二、异步复位

异步复位是一种在时钟信号之外触发的复位方式,不管时钟边沿信号有没有到来,只要复位有效信号到来,即执行复位操作。 以下是异步复位的基本代码示例:

module async_reset(
  input clk,
  input rstn,
  input data_in,
  output reg data_out
);


always @(posedge clk or negedge rstn) begin
  if(!rstn) begin
    data_out <= 'b0;
  end else begin
    data_out <= data_in;
  end
end

endmodule

在异步复位中,rst信号不需要和时钟信号同步,并且可以在任何时候生效。在上述代码中,rst信号被用来异步地清零计数器的值,并且不需要等待时钟信号。

综合后电路如下:

FPGA

从图中可看出,综合后,调用的(D Flip-Flop with Clock Enable and AsynchronousReset带使能功能的异步清除D触发器) FDCE型D触发器。

三、异步复位同步释放

异步复位同步释放通常是这种说法,一种结合了异步与同步复位优点的复位方式,它使用一个同步器来将异步复位信号转换为同步的复位信号,从而确保复位操作的可控性和稳定性。以下是异步复位同步释放的基本代码示例:

module test_reset(
  input clk,
  input rstn,
  input data_in,
  output reg data_out
);

reg arstn_r, arstn_s_r;

always @(posedge clk or negedge rstn) begin
  if(!rstn) begin
      arstn_r <= 'b0;
      arstn_s_r <= 'b0;
  end else begin
      arstn_r <= 'b1;
      arstn_s_r <= arstn_r;
  end
end

always @(posedge clk or negedge arstn_s_r ) begin
  if(!arstn_s_r ) begin
      data_out<= 'b0;
  end else begin
      data_out<= data_in;
  end
end

endmodule

在上述代码中,rstn是异步复位信号,在异步复位条件下,计数器会被清零并重置其他必要的信号。rstn信号经过异步和同步两级的处理后,生成了一个同步释放的复位信号arstn_s_r ,它与时钟信号同步并在时钟边缘上生效。然后,同步复位电路将控制信号传递给其他电路,使其从复位状态转换到正常操作状态。

综合后电路如下:

FPGA

从图中可看出,即使复位信号通过两级同步处理,也是用的两个异步复位D触发器FDCE实现的,所以实际上无需做这种异步复位同步释放的处理。

四、总结

在实际应用中,选择合适的复位方式取决于具体的设计要求和运行环境,但实际上我们写verilog代码常用的是异步复位的方式,当然关于复位设计,真的需要每一个寄存器都复位吗,下一个文章,我们再来唠唠。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分