FPGA常用复位处理比较

2019-04-13 16:34发布

原文地址 : http://blog.163.com/qingyu_1984/blog/static/1444145032012620112858498/
一、介绍:    同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:            always @ (posedge clk) begin                   if (!Rst_n)                     ...              end 异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下: always @ (posedge clk,negedge Rst_n) begin if (!Rst_n)                      ...           end
二、各自的优缺点:     1、总的来说,同步复位的优点大概有3条:       a、有利于仿真器的仿真。       b、可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。       c、因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。       其缺点也有不少,主要有以下几条:       a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合           逻辑路径延时,复位延时等因素。       b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的           数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。       2、对于异步复位来说,他的优点也有三条,都是相对应的:       a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。       b、设计相对简单。       c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。         缺点:       a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄           存器输出出现亚稳态,从而导致亚稳态。       b、复位信号容易受到毛刺的影响。   三、总结:     所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。   **********************************************异步复位,同步释放****************************************        以前从来没有对FPGA的复位可靠性关注过,想当然的认为应该不会有什么问题。当问题真正出在复位上的时候,才又仔细地对FPGA的复位深入的了解了一下。首先我们用的复位管脚不是FPGA的全局管脚,并且复位信号上没有上拉电阻,容易受到干扰而产生毛刺,这对异步复位是相当有害的。其次,我在FPGA内部对复位的处理过于简单。         今天在网上看了一些资料,很多是关于同步和异步复位的优缺点比较。由于我在FPGA内部用的是异步复位,所以主要看了一下异步复位的缺点:1)复位信号在时钟有效沿或其附近释放时,容易使寄存器或触发器进入亚稳态;2)容易受到毛刺的影响;3)难以仿真,难以进行静态时序分析。上面的前两条应该对我来说是影响最重要的,而第三条说老实话,我还没有到哪个阶层(嘿嘿)         异步复位,同步释放——就可以消除上面的前两条缺点。所谓异步复位,同步释放就是在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。通过一个复位信号综合器就可以实现异步复位,同步释放。下面是一个复位信号综合器的VHDL描述:   Designer: skycanny -- Date:2007-1-27 -- Discription: Reset Synthesizer Library ieee; Use ieee.std_logic_1164.all; Entity Rst_Synth is       Port (       Clk         :      in    std_logic;       Arst        :      in    std_logic;       Rst_n      :      out  std_logic ); End entity Rst_Synth; Architecture RTL of Rst_Synth is Signal    dff   :      std_logic; Begin       Process(Arst ,Clk )        Begin               If Arst = ‘0 then                      Dff               <= ‘0’;                      Rst_n      <= ‘0’; Elsif Clk’envent and Clk = ‘1’ then                                Dff               <= ‘1’;                      Rst_n      <= Dff; End if;       End process; End RTL;    这里提供给系统的复位信号RST_n只有当其复位输入端Arst = ‘1’且时钟脉冲Clk上升沿来临时才会置1,  才将复位信号释放,实现同步释放的作用。        ——zhengjw2012.10.18 (假设不这样做,当触发器的复位信号置1时刻和其时钟信号的上升沿时刻很接近时,会造成此时触发器的    信号建立时间setup_time很短,造成亚稳态)。 使用复位信号综合器可以很好地将同步和异步复位的优点结合起来,而消除他们缺点。因此在FPGA/CPLD的逻辑设计中可以很好的提高复位的可靠性,从而保证电路工作的稳定可靠性。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// PS : 自己习惯使用Verilog ,把原文的VHDL代码改成VerilogHDL后,异步复位同步释放,代码如下: module rst_n_ctrl_module   input  clk , input  rst_n ,  // outside reset  output sys_rst_n  // system reset  ) ; reg rst_n_r1 ,rst_n_r2 ; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin     rst_n_r1 <= 1'b0 ;
rst_n_r1 <= 1'b0 ;        end else begin rst_n_r1 <= 1'b1 ; rst_n_r2 <= rst_n_r1  end end  assign sys_rst_n  =  rst_n_r2  ;   endmodule  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////