数字IC秋招面试专题(三)异步复位和同步复位

🔈声明:
🔑未经作者允许,禁止转载
🚩推荐一个IC、FPGA新手入门的好网站:👉点击进入学习吧



前言

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

一、同步复位

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

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 <= 1'b0;
		rstn_dly2 <= 1'b0;
	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作为复位信号即可。

  • 在实习面试的时候,被问到过异步复位,同步释放这种电路形式;大致知道但是最后没敢说出口;
  • 此处画图总结一下,加深印象
    在这里插入图片描述

这里可以看出rstn一旦拉低,sys_rstn就会拉低,这就达到异步复位的要求;
而同步复位为什么要一个缓冲器来完成呢?

  • 没有缓冲器,rstn刚好释放在有效沿,sys_rstn就会发生亚稳态;
  • 而有一级缓冲器,即使释放在有效沿,sys_rstn也会采样rstn_dly1的值,最多就是没有晚一拍释放,但亚稳态概率会大大降低;
  • 而这个释放拉高的功能就需要DFF的D端和高电平相连完成了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值