名词解释
先了解一下什么是 同步复位/异步复位,请移步到这里
为什么要异步复位同步释放?这个功能有什么用?这八个字包含两个步骤,异步复位,同步释放
异步复位的意思是复位信号rstn和clk信号不是同时到来的,在always语句块中表现为:
always @(posedge clk or negedge rstn) begin
if(!rstn)
reg _1 <= 1'b0;
end
当异步复位信号到来时,寄存器 reg_1 会被直接拉低,这是不会产生问题的,当rstn下降沿和clk上升沿同时到来时,如果rstn比clk先到来一瞬间,且原来的reg_1信号为1,reg_1会被拉低为0,后一瞬间,clk来了,因为前一瞬间的reg_1值被拉低了,所以在clk到来时,一定有set_up不满足要求…但是!一进always 语句块后,由于rstn是0,所以reg_1会被赋值为0,还是0。也就是说不管我reg_1的set_up / hold满不满足要求,reg_1都会被重置到0,不会有任何问题,如图所示:
综上所述,异步复位信号是不会产生问题的,但是为什么要同步释放?是释放信号会出问题吗?
答:是的,当rstn释放的时候(从0变1)时,如果rstn释放边沿和clk释放边沿很接近,那么就会出现亚稳态,而亚稳态在电路里面是非常致命的,在亚稳态采样到的数据是不准确的,而电路中一个不准确的值,会导致这后面的所有值都不准确。
当rstn释放的时候,寄存器的输入端D可能因为某个组合逻辑电路和rstn有关系,导致D随rstn同步拉高。那在clk上升沿到来的时候,就会有D的set_up不满足,出现亚稳态,边沿采样的时候,输出reg_1不知道该采D=0的信号还是D=1的信号,所以不妨打两拍,不着急在rstn释放的时候采样,用两个寄存器来延迟两个周期,等到数据D稳定了之后再同步拉高rstn采样。
总结:异步复位为0 的时候不做处理,当rstn从0变1的时候,打两拍随clk同步拉高,此时寄存器输入的D已经稳定很长时间,可以避免亚稳态的发生。
参考文献:看这里
牛刀小试
题目:请你用verilog,设计一个电路实现异步复位同步释放功能。
代码如下:
module Sys_Rst(
input clk ,
input rst_n ,
output sys_rst
);
reg rst_r0;
reg rst_r1;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
rst_r0 <= 1'b0;
rst_r1 <= 1'b0;
end
else begin
rst_r0 <= 1'b1;
rst_r1 <= rst_r0;
end
end
assign sys_rst = rst_r1;
endmodule
电路图
声明
本人所有系列的文章,仅供学习,不可商用,如有侵权,请告知,立删!!!
本人主要是记录学习过程,以供自己回头复习,再就是提供给后人参考,不喜勿喷!!!
如果觉得对你有用的话,记得点赞+收藏+评论!!!
下期预告
大家有想看的吗?可以告诉我。
全网各平台同名===> “IC二舅”
下一期如果有大家想看的或者哪块不懂想学习的,可以私聊或在群里提问都可以,“二舅”肯定是知无不言言无不尽!!!
“二舅”博客:
https://blog.csdn.net/qq_40549426?spm=1019.2139.3001.5343
“二舅”精神内耗学习群:
878501676