FPGA开发中,一种最常用的复位技能便是“异步复位同步开释”,这个技能比较难以了解,许多材料对其说得并不透彻,没有讲到实质,可是它又很重要,所以对它有必要了解,这儿给出我的观点。
讲到这个之前,咱们要先了解recovery time和removal TIme的概念。如下图:
关于异步复位而言,假设是低电平有用,那么很简略碰到的状况便是我在开释该信号的时分,发现它的开释沿竟然跟时钟跳变沿太挨近了!这会导致D触发器处于亚稳态。咱们知道,上图的reset_n信号是接D触发器的直接复位端的。假设两个跳变沿过于挨近,那么D触发器就有或许发现自己该采样了,可是复位信号还没撤销呢!采仍是不采就不能确认。所以,咱们要求reset_n信号开释的时分,有必要远离clock上升沿recovery TIme +removal TIme这么大的时间区域,其间clock上升沿之前的有必要远离的那段时间叫做recovery TIme,上升沿之后有必要远离的那段时间叫做removel time。简略的讲,两者不能一起跳变,或许挨近一起跳变!
为了防止开释的时分形成亚稳态问题,提出了“异步复位,同步开释”的解决办法。所谓异步复位,便是复位信号能够直接不受时钟信号影响,在恣意时间只要是低电平就能复位(假设约好低电平复位),也便是说,复位信号不需求和时钟同步。而同步开释就很有意思了,它的意思是让复位信号撤销的时分,有必要跟时钟信号同步,也便是说正好跟时钟同沿。这就奇怪了!由于之前咱们刚讲,要防止复位开释沿跟时钟沿同步。这儿为什么就能够了呢?
咱们先看一个异步复位同步开释的代码,Verilog代码如下:
归纳后的RTL图表如下:
下面对上面的图进行说明。咱们看到,真实驱动reg2和reg1等功用模块作业的复位信号其实是rst_n信号,而rst_n信号则是异步复位端reset_n经过reg3和reg4两级寄器之后的发生的新的复位信号。其间reset_n为异步复位,而rst_n则是经过同步开释得到的新的复位驱动信号。rst_n将与时钟沿同步,所以它实质上是同步复位信号。
这样,经过reg3和reg4两级锁存,就把reset_n从一个异步复位端口,加工成了一个输出同步复位rst_n的模块。
reg3的输入端永久接“1”,所以某时间,正常状况下,reg3和reg4都输出“1”。假设在某时间,reset_n信号被拉为低电平,这将导致reg3直接复位,输出为“0”,而此刻reg4需求下一个时钟周期才会变成“0”;并且reg4是在时钟沿作用下采样,所以reg4从“1”跳变为“0”的时间必定跟时钟沿是同步的,这就得到了一个同步开释的成果。而reg2和reg1都是时钟沿驱动,所以这种同步开释的rst_n将能够有用的驱动后边的复位,不会形成亚稳态效应。
咱们看到,其实最终咱们也便是完成了同步复位的功用,那咱们为什么不直接运用同步复位来写呢?原因在于,许多模块自身不具有同步复位端口,可是根本都支撑异步复位,所以运用异步复位愈加节约资源,假设必定要完成同步复位,那么会生成更多组合逻辑。比方图中一切寄存器的CLR端口其实便是异步复位端口。而经过上面多加了reg4触发,咱们让CLR这个异步复位的端口完成了同步复位的功用,而同步复位信号作用更好,对毛刺按捺能力强,这便是“异步复位同步开释”的含义。所以让异步复位端口完成同步复位功用,这才是“异步复位同步开释的实质”!
责任编辑:gt