打印

关于异步复位同步释放的疑惑,求指点!

[复制链接]
1954|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
异步复位同步释放可以减少亚稳态出现的几率,想了好久还是想不通;如果reset_n在

clk到达reg3时出现波动或者释放,那么reg3还是无法确定输出0 or 1,而这个不确定

的输出也会传递到reg4,继而继续传到reg2和reg1的复位端,那这样的话不是和最简单

的异步复位没区别吗?

相关帖子

沙发
Backkom80| | 2012-7-20 18:33 | 只看该作者
不一样,细细的在想想哈,嘻嘻

使用特权

评论回复
板凳
zhhtqb2b|  楼主 | 2012-7-20 21:41 | 只看该作者
2# Backkom80

还是想不出来,您看看我的分析

一、第一个clk到达时,reset_n低电平出问题(过早释放或者出现毛刺),reg3误判,认为没有复位操作,Q3*=1;reg4不管判断正确与否,Q4*=0;reg1和reg2复位信号为0正常复位。

二、第二个clk到达时,reset_n低电平出问题(过早释放或者出现毛刺),reg3误判,认为没有复位操作,Q3*=1;reg4误判,认为没有复位操作,Q4*=Q3=1;reg1和reg2复位信号为Q4=0正常复位。

三、第三个clk到达时,即使reset_n低电平正常,无论reg3和reg4判断正确与否,reg1和reg2复位信号为Q4=1,不执行复位,出现问题。

使用特权

评论回复
地板
gaochy1126| | 2012-7-21 18:02 | 只看该作者
应该会在时钟沿期间起作用吧

使用特权

评论回复
5
zhhtqb2b|  楼主 | 2012-8-7 13:47 | 只看该作者
没人看太伤心了

使用特权

评论回复
6
hawksabre| | 2012-8-8 18:54 | 只看该作者
异步复位、同步释放







       FPGA设计中常见的复位方式即同步复位和异步复位。在深入探讨亚稳态这个概念之前,特权同学也并没有对所谓的同步复位和异步复位有太多的注意,而在实践中充分感受了亚稳态的危害之后,回过头来细细品味《Verilog HDL设计与验证》一书中关于复位的章节,可谓受益匪浅。







       在特权同学以前的代码里大多使用的是异步复位。



       一个简单的异步复位的例子



always @ (posedge clk or negedge rst_n)



         if(!rst_n) b <= 1'b0;



         else b <= a;














         我们可以看到FPGA的寄存器都有一个异步的清零端(CLR),在异步复位的设计中这个端口一般就是接低电平有效的复位信号rst_n。即使说你的设计中是高电平复位,那么实际综合后会把你的复位信号反向后接这个CLR端。







       一个简单的同步复位的例子



always @ (posedge clk)



         if(!rst_n) b <= 1'b0;



         else b <= a;














         和异步复位相比,同步复位没有用上寄存器的CLR端口,综合出来的实际电路只是把复位信号rst_n作为了输入逻辑的使能信号。那么,这样的同步复位势必会额外增加FPGA内部的资源消耗。







       那么同步复位和异步复位到底孰优孰劣呢?



       只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患,特权同学过去从没有意识到也没有见识过。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。







       再看下面一个两级寄存器异步复位的例子







always @ (posedge clk or negedge rst_n)



         if(!rst_n) b <= 1'b0;



         else b <= a;



         



always @ (posedge clk or negedge rst_n)



         if(!rst_n) c <= 1'b0;



         else c <= b;      














         正常情况下,clk的上升沿c更新为b,b更新为a。一旦进入复位,b,c都清零;但是我们不能确定复位信号rst_n会在什么时候结束。如果结束于b_reg0和c_reg0的{launch edge –stup,launch edge+hold}时间只外,那么一切都会正常。但如果恰恰相反,会出现什么情况呢? rst_n的上升变化出现在了clk上升的建立保持时间上,此时clk检测到的rst_n的状态就会是一个亚稳态(是0是1不确定)。从代码里我们看到如果此时b_reg0和c_reg0认为rst_n为0,那么依然保持复位清零,而如果认为rst_n为1,那么就跳出复位。因为此时的rst_n的不确定性,就可能出现4种情况,即b_reg0和c_reg0都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成了系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?



       上面的分析似乎都让人意识到同步复位和异步复位都不可靠,那么如何将两者结合,取长补短呢。







       异步复位、同步释放







always @ (posedge clk)



         rst_nr <= rst_n;                 //现将异步复位信号用同步时钟打一拍







always @ (posedge clk or negedge rst_nr)



         if(!rst_nr) b <= 1'b0;



         else b <= a;



         



always @ (posedge clk or negedge rst_nr)



         if(!rst_nr) c <= 1'b0;



         else c <= b;      














         如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。







       另外特权同学请教过IC设计部一位资深专家,他们在设计中常用的复位方式和上面的方法类似,大体如下:

使用特权

评论回复
7
hawksabre| | 2012-8-8 18:54 | 只看该作者
兄弟  这是我到网上找的  因为没用到这块  不知道有没有帮上你的忙

使用特权

评论回复
8
zhhtqb2b|  楼主 | 2012-9-3 09:56 | 只看该作者
谢谢!好人哪
7# hawksabre

使用特权

评论回复
9
GoldSunMonkey| | 2012-9-3 10:05 | 只看该作者
:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

0

粉丝