可编程逻辑
在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是同步复位信号,当时钟上升沿到来时,检测到复位信号为低电平时,计数器将被初始化。
综合后电路图如下:
从图中可看出,综合后,调用的(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信号被用来异步地清零计数器的值,并且不需要等待时钟信号。
综合后电路如下:
从图中可看出,综合后,调用的(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 ,它与时钟信号同步并在时钟边缘上生效。然后,同步复位电路将控制信号传递给其他电路,使其从复位状态转换到正常操作状态。
综合后电路如下:
从图中可看出,即使复位信号通过两级同步处理,也是用的两个异步复位D触发器FDCE实现的,所以实际上无需做这种异步复位同步释放的处理。
在实际应用中,选择合适的复位方式取决于具体的设计要求和运行环境,但实际上我们写verilog代码常用的是异步复位的方式,当然关于复位设计,真的需要每一个寄存器都复位吗,下一个文章,我们再来唠唠。
全部0条评论
快来发表一下你的评论吧 !