前两天和师兄讨论了一下design rule其中提到了同步异步复位的比较这个常见问题,据说也是IC公司经常问到的一面试题。后来在网上看了些相关资料,终于在这一点有了比较清晰的感念,眼看就要实习了,唯恐同学们面试时阴沟里翻船,特此将这个问题总结如下(如果你对:你在设计中如何复位?为什么这样复位?这两个问题概念清晰,本贴可以略过)一、概念:同步复位:就是指复位信号只有在时钟上升沿到来时,才能有效,否则无法完成对系统的复位工作。用verilog描述如下:always @ (posedge clk)begin if (!Rst_n) ... end异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:always @ (posedge clk or negedge Rst_n)begin if (!Rst_n) ...end二、各自的优缺点:1. 同步复位的优点大概有3条:a. 有利于仿真器的仿真。b. 可以使所设计的系统成为的同步时序电路,这便大大有利于时序分析,而且综合出来的一般较高。c. 因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。缺点:a. 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew组合逻辑路径延时,复位延时等因素。b. 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。2. 异步复位优点也有三条,都是相对应的a. 大多数目标器件库的都有异步复位端口,因此采用异步复位可以节省资源。b. 设计相对简单。c. 异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。缺点:a. 在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。b. 复位信号容易受到毛刺的影响。三、总结及推荐复位方式: 所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。也就是上文中所说的:“异步复位,同步释放”。这就结合了双方面的优点,很好的克服了异步复位的缺点(因为异步复位的问题主要出现在复位信号释放的时候,具体原因可见上文)。 具体实现并不难,这里列出一种方式:那就是在异步复位键后加上一个所谓的“reset synchronizer”,这样就可以使异步复位信号同步化,然后,再用经过处理的复位信号去作用系统,就可以保证比较稳定了。reset sychronizer的代码如下:module Reset_Synchronizer( output reg rst_n, input clk, asyncrst_n); reg rff1;always @ (posedge clk , negedge asyncrst_n) begin if (!asyncrst_n) {rst_n,rff1} <= 2'b0; else {rst_n,rff1} <= {rff1,1'b1}; endendmodule大家可以看到,这就是一个dff,异步复位信号直接接在它的异步复位端口上(低电平有效),然后数据输入端rff1一直为高电平'1'。倘若异步复位信号有效的话,触发器就会复位,输出为低,从而复位后继系统。但是,又由于这属于时钟沿触发,当复位信号释放时,触发器的输出要延迟一个时钟周期才能恢复成'1’,因此使得复位信号的释放与时钟沿同步化。此外,还有一种方法更为直接,就是直接在异步复位信号后加一个触发器,然后用D触发器的输出作为后级系统的复位信号,也能达到相同的效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)