欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异步复位和同步复位

程序员文章站 2022-07-13 23:16:58
...


前言

本章解释一下同步复位和异步复位的区别,以及异步复位同步释放究竟好在哪里,需要怎么做

一、同步复位

同步复位就是只有在时钟上升沿时,复位信号才有效
代码如下:

module sync_rst(
				input			clk,
				input			rstn,
				input			din,
				output reg		dout
);
always @(posedge clk)
begin
	if(!rstn)
		dout <= 0;
	else 
		dout <= din;
end
endmodule

二、异步复位

只要复位信号有效就进行复位

代码如下:

module sync_rst(
				input			clk,
				input			rstn,
				input			din,
				output reg		dout
);
always @(posedge clk or negedge rstn)
begin
	if(!rstn)
		dout <= 0;
	else 
		dout <= din;
end
endmodule

这里异步和同步复位在代码上的区别仅有always快内多了一个negedge rstn的信号触发
但是综合出来的电路却是完全不一样的

三、同步复位和异步复位的区别

异步复位和同步复位

  • 同步复位综合后的电路会如下所示,其复位会放在DFF外面单独做一个逻辑,这样会耗费一定的资源,因为只会在始终有效沿复位,所以异步复位可能发生的毛刺和亚稳态在此不会发生

异步复位和同步复位

  • 而异步复位可以直接用DFF的异步复位端口,其综合后的电路如下
    异步复位和同步复位

四、 异步复位同步释放

结合同步电路可以滤除毛刺,防止亚稳态和异步电路可以节省资源的优点就设计了异步复位同步释放的电路。
代码如下:

module sync_rst(
				input			clk,
				input			rstn,
				input			din,
				output reg		dout
);
reg		rstn_dly1;
reg		rstn_dly2;
wire	sys_rstn;

assign sys_rstn = rstn_dly2;

always @(posedge clk or negedge rstn)
begin
	if(!rstn) begin
		rstn_dly1 <= 0;
		rstn_dly2 <= 0;
	end
	else begin
		rstn_dly1 <= 1'b1;
		rstn_dly2 <= rstn_dly1;
	end
end

always @(posedge clk or negedge sys_rstn)
begin
	if(!sys_rstn) 
		dout <= 0;
	else 
		dout <= din;
end

endmodule

这里用到了避免亚稳态的同步器设计,对复位信号进行异步复位,并用同步器打两拍,这样复位信号只会在时钟有效沿才释放,并且避免了亚稳态,在这段代码中,对rstn做了异步复位同步释放,后续所有的电路只需要用sys_rstn作为复位信号即可。