异步复位同步释放

首先要说一下同步复位与异步复位的区别。

同步复位是指复位信号在时钟的上升沿或者下降沿才能起作用,而异步复位则是即时生效,与时钟无关。异步复位的好处是速度快。

再来谈一下为什么FPGA设计中要用异步复位同步释放。

复位信号的释放是有讲究的:

  • 我们知道,DFF的D端和clk端之间时序关系是有约束的,这种约束我们通过setup time和hold time来 check。即D端的data跳变的时刻要与clk端的时钟上升沿(或者下降沿)跳变要错开,如果这两个跳变撞到一起,我们无法保证DFF能够sample到正确的data,这时候不满足setup/hold time要求,就会发生亚稳态,我们sample到的data可能是不稳定的中间态的值,并不是我们原本想要的data。
  • 与此类似,异步复位端与clk端之间也存在着类似的时序约束关系,为了准确稳定地sample到异步复位端的reset信号,我们要求reset信号在clk上升沿(或者下降沿)跳变的前后一段时间内保持稳定,不要跳变。clk跳变沿之前必须保持稳定的最短时间叫做recovery time,clk跳变沿之后需要保持稳定的最短时间叫做removal time。如果在此时间窗口内reset信号发生跳变,不确定reset到底有没有释放成功(类似setup+hold时间窗口内,data跳变,发生亚稳态,sample到的值是不稳定的中间态值)。在IC设计过程中我们是会check recovery和removal time的,如果不满足,我们会通过布局布线的调整(后端的调整)让电路满足这个条件(实质就是让reset跳变沿和clk跳变沿错开);但是对于FPGA设计而言,我们一般不采用异步释放的方法,因为FPGA的布局布线可以调整的空间不大,相对于IC设计,FPGA后端的布局布线基本上是tool自己搞定,所以我们很难调整布局布线以满足这个条件,所以我们一般就会直接用异步复位同步释放的方法来让reset跳变沿和clk跳变沿错开。

最后再说一下同步数字电路的setup/hold timing check的实质。

同步数字电路的基本单元就是两级DFF,中间是一堆组合逻辑,data就是在clk一拍一拍的控制下,逐渐向后面传递,当然,在传递的过程中,通过组合逻辑实现数据的处理与转换;但是物理世界里面,组合逻辑一定是有毛刺的,比如说data通过一系列的处理之后准备通过DFF传递到下一个单元的时候,你怎么能保证第二级DFF采到的值是处理完毕稳定可靠的data,而不是还处于中间态的data?!(举个例子,假设我们这里的data是一个8bit的bus信号,处理之前是1111_0000,通过组合逻辑处理完之后我们期望变成1111_1111;我们知道后面4个bit由0变1是需要时间的,由于布局布线的缘故,这4bit不可能在同一个时刻齐刷刷的同时由0变1,肯定是有的bit先变1,有的bit后变1;也就是在由1111_0000变成1111_1111的过程中,可能会存在1111_1000/1111_1100/1111_1101/...等等这样的中间态数据,我们不能在data还处于中间态的时候就去sample它,否则得到的不是我们预期的值,会引起整个芯片的逻辑错误)我们实际上是通过setup/hold time来保证的,即:如果电路中所有DFF的setup/hold time都能够满足,表示data到达D端的时间比clk跳变沿时刻超过了setup时间(反之,如果data在setup+hold时间窗口内还在变化,一定会有setup/hold timing vio),这样,我们通过check 所有DFF的setup/hold timing来间接地保证所有DFF采到的值都是经过组合逻辑处理并且处理完毕之后稳定可靠的值。(更确切的说,通过hold timing check来保证sample到的值是经过组合逻辑处理之后的值而不是上一笔的data,通过setup time来保证sample到的是经过组合逻辑处理完毕之后并且稳定下来的值)

 

posted @ 2016-11-10 15:15  鱼游时光  阅读(1777)  评论(0编辑  收藏  举报