在系统复位时,如果clk的上升沿与rst_n的下降沿同时到达,系统会先响应复位信号。但是clk上升沿与rst_n 上升沿同时到达使,就可能会出现短暂的竞争冒险问题。
解决方法:
1、 异步复位设计:优点:节省资源,设计简单,方便FPGA识别复位信号。
缺点:在复位释放时容易出现竞争冒险,容易受到毛刺的干扰。
2、 同步复位设计:优点:降低亚稳态概率,100%的同步电路,大大有利于时序分析,综合出来的fmax一般比较高。滤除高于时钟频率的毛 刺。
缺点:复位信号有效长必须大于时钟周期。浪费资源(DFF都只有异步复位端,没有同步复位端)。
3、 异步复位的同步化设计:先用D触发器打一拍然后提供给剩下的时序电路使用。
异步复位:针对D触发器它是异步的。
同步释放:同步时钟的时候才有效,同步化复位电路。
异步复位,同步释放 的具体方法:
1, 无PLL,可以先延时一段时间后送出一个延时完成标志信号。
reg rst_n1,rst_n2; always @(posedge clk) //同步化 begin if(!rst_n) begin rst_n1 <= 0; rst_n2 <= 0; end else begin rst_n1 <= 1; rst_n2 <= rst_n; end end reg delay_done; // 延时完成标志 wire rst_n_n; assign rst_n_n = rst_n2&delay_done;
2、有PLL的情况下,借助PLL时钟完成所存信号的锁存端。
reg rst_n1,rst_n2; always @(posedge clk) //同步化 begin if(!rst_n) begin rst_n1 <= 0; rst_n2 <= 0; end else begin rst_n1 <= 1; rst_n2 <= rst_n; end end wire locked; //PLL完成所存信号 wire rst_n_n; assign rst_n_n = rst_n2&locked;
PS:推荐另一篇文章:
对于异步复位、同步释放的理解:http://group.chinaaet.com/334/84221