异步复位 同步开释
首要要说一下同步复位与异步复位的差异。
同步复位是指复位信号在时钟的上升沿或许下降沿才干起作用,而异步复位则是即时收效,与时钟无关。异步复位的优点是速度快。
再来谈一下为什么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到的是通过组合逻辑处理完毕之后而且安稳下来的值)