在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; endendendmodule
在上述代码中,rst是同步复位信号,当时钟上升沿到来时,检测到复位信号为低电平时,计数器将被初始化。
综合后电路图如下:
从图中可看出,综合后,调用的(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; endendendmodule
在异步复位中,rst信号不需要和时钟信号同步,并且可以在任何时候生效。在上述代码中,rst信号被用来异步地清零计数器的值,并且不需要等待时钟信号。
综合后电路如下:
从图中可看出,综合后,调用的(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; endendalways @(posedge clk or negedge arstn_s_r ) begin if(!arstn_s_r ) begin data_out<= "b0; end else begin data_out<= data_in; endendendmodule
在上述代码中,rstn是异步复位信号,在异步复位条件下,计数器会被清零并重置其他必要的信号。rstn信号经过异步和同步两级的处理后,生成了一个同步释放的复位信号arstn_s_r ,它与时钟信号同步并在时钟边缘上生效。然后,同步复位电路将控制信号传递给其他电路,使其从复位状态转换到正常操作状态。
综合后电路如下:
从图中可看出,即使复位信号通过两级同步处理,也是用的两个异步复位D触发器FDCE实现的,所以实际上无需做这种异步复位同步释放的处理。
在实际应用中,选择合适的复位方式取决于具体的设计要求和运行环境,但实际上我们写verilog代码常用的是异步复位的方式,当然关于复位设计,真的需要每一个寄存器都复位吗,下一个文章,我们再来唠唠。
标签: