复位问题

本文的编写仅为了自己学习笔记整理。
参考来源:

  1. https://blog.csdn.net/wordwarwordwar/article/details/74091757
  2. https://blog.csdn.net/qq_15062763/article/details/90904439
  3. http://www.elecfans.com/dianzichangshi/20171130589181.html
  4. http://m.elecfans.com/article/678347.html
  5. http://bbs.eetop.cn/thread-311664-1-1.html

1. 复位方式

  1. 无复位
  2. 同步复位
  3. 异步复位
  4. 异步复位,同步释放

2. 无复位

数字电路离不开复位,而没有复位,在FPGA中,上电后寄存器初始值默认为“0”。当然,也是人为的赋初值。

reg[7:0]  a;
always @ (posedge clk)
begin
   a <= b;
 end

如果没有复位信号,省了很多资源,编译和布线时间也缩短不少,如果规模很大,对提高设计整体性能也是有帮助的。但是在数字电路设计中,我们很少不用复位电路。到是我们经常利用FPGA这个特性,自己产生内部复位电路。

3. 同步复位

3.1 定义

顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。
同步复位就是非常专业,不留一点马虎,和他的名字一样,只在时钟的有效沿发生,所以一个有效的同步复位信号,至少要维持一个时钟周期(把你叫不醒,是不会停的)。由于仅仅在时钟的有效沿有效,所以可以滤除复位信号上的毛刺,电路可靠性好很多。
在这里插入图片描述
在这里插入图片描述
和异步复位相比,同步复位没有用上寄存器的CLR端口,综合出来的实际电路只是把复位信号rst_n作为了输入逻辑的使能信号。那么,这样的同步复位势必会额外增加FPGA内部的资源消耗。

3.2 优缺点

  1. 总的来说,同步复位的优点大概有3条:
    a、有利于仿真器的仿真。
    b、可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。
    c、因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
  2. 他的缺点也有不少,主要有以下几条:
    a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。
    b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。

4. 异步复位

3.1 定义

它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。因此异步复位抗干扰能力差,有些噪声也能使系统复位,因此有时候显得不够稳定,要想设计一个好的复位最好使用异步复位同步释放。
(同步复位与异步复位的区别主要看是否有时钟信号参与。异步复位不需要时钟参与,一旦信号有效立即执行复位操作;同步信号需要时钟参与,只有有效的时钟信号出现,复位信号才有效。

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

4.2 优缺点:

  1. 对于异步复位来说,他的优点也有三条,都是相对应的:
    a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
    b、设计相对简单。
    c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
  2. 缺点:
    a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
    b、复位信号容易受到毛刺的影响。

(异步复位就是复位信号直接连到FF的异步复位端,信号随到随复位,不需要时钟。在没有时钟时要复位的情况下,一定得用异步复位。如果对复位信号没有特别要求时,在后端比较容易做。
同步复位其实就是把复位信号当作一个数据的输入,同其他输入混在一起后,连到FF的D端。所以它需要时钟才工作,而且在后端要做一个reset tree,无形中给后端的时序收敛增添了困难)

5. 异步复位,同步释放

那么同步复位和异步复位到底孰优孰劣呢?
只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患,特权同学过去从没有意识到也没有见识过。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。
看一下两级寄存器异步复位的例子:
在这里插入图片描述
正常情况下,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都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成了系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?
上面的分析似乎都让人意识到同步复位和异步复位都不可靠,那么如何将两者结合,取长补短呢。
即:采用异步复位,同步释放的复位方式。
在这里插入图片描述
如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。

  为了避免亚稳态,让拉高的复位信号打两拍,达到与时钟clk边沿同步的目的

注意,是时钟边沿!!!边沿,边沿,边沿
以上就是同步释放,可见只是拉高的信号打两拍,拉低的信号,也就是复位信号有效的时候,该复位就复位,该干嘛干嘛,我们不用去管它。
以下是解释:
假设复位信号低电平有效rst_n,当复位信号无效时,也就是复位信号拉高时,即为复位信号的释放。
由于异步复位信号与时钟无必然联系,两者都是独立的,所以复位信号的拉高将有一定的概率导致电路出现亚稳态。
对于亚稳态的处理,通常是利用同步器进行同步,使其输出能够受到时钟clk的控制。也就是说,同步器的输出最终与时钟clk同步。另外,同步器的另一个口语化表达为:“打两拍”,通过两个D触发器,最终得到与时钟同步的信号。

猜你喜欢

转载自blog.csdn.net/weixin_43755290/article/details/107354183