FPGA中异步复位和同步复位

为了避免纯粹的同步复位和纯粹异步复位的问题,可以使用一种叫做同步化的异步复位,我们称其为第三类复位。这种复位完全结合了异步复位和同步复位的优势,我们知道异步复位的优势是不参与数据路径,所以不影响数据路径速度,而复位几乎是瞬间起作用;而同步复位的优势是百分百地同步时序分析且具有抗噪声性能。这种复位其实就是通常我们所说的异步复位同步释放。就如同我之前讨论的那样,异步地进入复位是最好的,只是异步地退出复位会导致一些类似亚稳态和由同步电路参与反馈而引起不想要的状态之类的危害等问题。

         后面我们会讨论如何来实现这样的同步化的异步复位。我先来如图1所示的电路,同步寄存器(Synchronizer Register)象同步复位那样被使用,不过被同步后的异步复位和原始异步复位经过门控以后用来异步地复位后续寄存器。这个电路中异步复位信号异步地复位后续电路,并且复位是异步地释放。它的缺点就是复位路径上引入了门电路的延迟。

1:带门控的同步化异步复位原理图

         一种更好的实现方法如图2所示,这个电路去除了图1中复位路径上门电路延迟。异步复位输入直接连接到同步寄存器(Synchronizer Register)的CLRN端口上,这样复位立即生效。当复位撤除(释放)时,一个逻辑“1”从同步器(Synchronizer)被时钟打出用来同步地释放后续寄存器的复位。

2:不带门控的同步化异步复位原理图

         2等效的Verilog代码如图3所示,第一个进程模块用来产生同步复位输出rst_nrst_n作为第二个进程模块的异步复位。两个进程模块的复位信号都位于各自的敏感列表中。其实第一个进程模块就是将系统输入的异步复位进行同步,产生一个后续逻辑使用的同步化了的异步复位,所以我们看到第二个进程模块里将这个已经同步化了的复位信号当作异步复位使用。

3:同步化异步复位的Verilog代码

         同样,为了减少亚稳态对上述同步器中的两个寄存器的影响,同时也是为了增加平均无故障时间(MTBF),这两个寄存器应该在FPGA中被放置的越靠近越好,以尽量减少在器件中的布线延迟。Quartus IIfitter将会自动认识到这些寄存器是用于同步器,所以会自动地进行上述处理,作为本例这两个寄存器将会被布局到同一个LAB中。

         尽管reset_n已经进行了上述同步化处理,时序约束的时候还是要使用set_false_path命令将其进行切割,而从同步寄存器输出的复位rst_n现在可以使用TimeQuest进行准确地RecoveryRemoval分析。本设计的SDC约束和异步复位一样(如笔者上一篇关于异步复位博文中图4所示),所以现在我们在Quartus II中编译这个设计并运行TimeQuest时序分析器,那么我们将会得到这个电路的RecoveryRemovalslack报告,如图4所示。

 

2.jpg

 

4:同步化异步复位的RecoveryRemoval分析

         上述分析结果表明,两条路径(reg4reg1reg4reg2)都进行了RecoveryRemoval检查。这个电路的Recovery时间检查(就象建立时间检测一样)差不多有9nsslack,而Removal(就象保持时间检查一样)也有660psslack。两个检查都得到通过,意味着这个电路没有时序错误路径。

         使用上述同步化异步复位的一个代价是它们很容易受到噪声和窄脉冲的干扰。同样地,如果可能最好对输入到FPGA的异步复位先进行滤波和去抖动。图2中的同步化异步复位原理图可以确保同步后的异步至少有一个时钟周期的长度,如果需要扩展复位长度到n个时钟周期,那么可以增加同步器中的寄存器个数到n+1个。请一定确保外部输入的异步复位reset_n连接到了所有同步器寄存器的CLRN端口,这样确保使得产生的同步化异步复位能够被异步地置位。

         当有PLL涉及时,有些特殊情况需要考虑。比如我们来如图5所示的电路。需要同步的复位跟之前一样直接接到了同步器中寄存器的CLRN端口,而同步后的寄存器也同样接到了reg1reg2CLRN端口,同时也被接到PLLareset端口。所有寄存器包括同步器中的寄存器的驱动时钟来自PLL的输出时钟。虽然看起来PLL使用了同步后的复位,实际上这是行不通的。当PLL处于复位状态时,PLLc0是没有时钟输出的,因此同步器中的寄存器将无法清除复位(意思是复位无法得到释放)。结果是,这个电路将永远无法跳出复位。

5:使用PLL时不正确实现同步化异步复位的原理图

         为了解决这个问题,PLL的复位应该使用FPGA原始输入的异步复位reset_n(如图6所示,这里进行了取反,这主要取决于复位是‘0’有效还是‘1’有效,这里不讨论),而不是同步后的复位。此外,使用PLLLock输出来作为同步器中寄存器的时钟使能,是个不错的做法。因为这将防止同步后的复位在PLL的输出时钟稳定之前提前释放。

6:使用PLL时正确实现同步化异步复位的原理图

         7显示了图6所示是PLL正确实现同步化异步复位原理图的Verilog代码。

2.jpg

 

7使用PLL时正确实现同步化异步复位的Verilog代码

         注意到上述代码中同步器的进程模块中多一个条件,即PLLLocked信号,它作为同步器中的寄存器的同步时钟使能信号。同时注意下面例化的PLL以及两个个进程模块的时钟,这些都是当加入PLL时仅有的变化。

         8是需要给这个电路加入的SDC时序约束,基本和没有使用PLL相同,唯一的区别是需要使用create_generated_clock语句为PLL的输出时钟加约束(注意其实使用PLL后,可以直接使用语句derive_pll_clocks来简单地进行约束)。

8:使用PLL时实现同步化异步复位的时序约束

         最后,还有一个值得一提的例子。如前所述,设计中的不同时钟域的寄存器如果需要复位,应该首先将复位同步到当前的时钟域后再使用,也就是说每个时钟都需要有一套自己的复位同步器寄存器。而且,有的时候设计的某些部分可能需要比其它部分先从复位状态释放,所以这就需要一个复位释放顺序的安排。图9给出了这样一个例子,同步寄存器都通过类似菊花链方式串起来,我们看到最上面的同步器具有最高优先级从复位状态跳出来。图9所示的电路中,所有的复位都同时有效,但是rst_a_n具有从复位状态跳出的最高优先级,接着是rst_b_n具有中等优先级,rst_c_n是最后被释放的。当然,如果在不同复位之间需要更长的间隔时间,可以在同步器中添加任意个数寄存器来达到需要的间隔长度。

9:不同时钟域同步化异步复位释放优先级安排

 

总结

本文以及前面两篇文章分别介绍了不同复位的优缺点,比如同步复位,异步复位以及同步化的异步复位。同步复位需要一个时钟,所以窄复位脉冲将会被忽略,然后同时增加了系统的抗干扰能力。同步复位是百分之一百的同步电路,所以不存在亚稳态问题。只是同步复位会带来额外的资源消耗以及数据路径上的延迟,基于此我们说同步复位不是最佳复位选择。TimeQuest可以象分析其它数据路径那样分析同步复位。

异步复位通常立即起作用,也容易被实现,而且由于它们不象同步复位那样会给数据路径引入额外的延迟,所以复位速度很快。同时相比同步复位,异步复位消耗更少的逻辑资源。比较不幸的是,它们无法通过TimeQuest来进行时序分析(其它静态时序分析器也无法分析),而且如果处理不当还会给电路带来亚稳态问题。异步复位的最大弱点是它们无法确保所有的寄存器在同一个时钟沿处跳出复位状态。这在带反馈的同步设计中是会有问题的,比如状态机设计。

在将异步复位连接到寄存器的异步输入端口前给它加入一个同步器,这样就创造一个叫同步化了的异步复位。这种复位具有异步复位那样的立即将复位作用于电路好处,同时又提高电路速度,因为它们不会给数据路径带来额外的延迟。同时,这种复位象同步复位那样避免了亚稳态问题,而且保证所有的寄存器能够同时从复位状态跳出。不象异步复位,同步化了异步复位可以在TimeQuest里分析RecoveryRemoval。正是由于这些原因,同步化了的异步复位是大部分FPGA设计中复位电路首先方法。




一、特点:
   同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用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,

 才将复位信号释放,实现同步释放的作用。        ——zhengjw 2012.10.18 

(假设不这样做,当触发器的复位信号置1时刻和其时钟信号的上升沿时刻很接近时,会造成此时触发器的

   信号建立时间setup_time很短,造成亚稳态)。



使用复位信号综合器可以很好地将同步和异步复位的优点结合起来,而消除他们缺点。因此在FPGA/CPLD的逻辑设计中可以很好的提高复位的可靠性,从而保证电路工作的稳定可靠性。





其实异步复位的话,优点就是可以直接用触发器异步复位端,相对同步复位来说又简单又省逻辑资源,但其致命缺点就是复位结束也就是释放的时刻恰在时钟上升沿的建立时间和保持时间之间时无法决定现在的复位状态是1还是0,造成亚稳态。

因此最好全局复位信号送出之前做一个“异步复位,同步释放”的处理。
下面是常见一种方式:
 
module asy_reset( clk, rst_n, rst_nr
 );
input clk;
input rst_n;
output rst_nr;

reg rst_nr;
reg rst_nr1;  
         
always @ (posedge clk or negedge rst_n)
  if(!rst_n) 
     rst_nr1<= 1'b0;
  else  
     rst_nr1<= 1'b1; 
            
always @ (posedge clk or negedge rst_n)
  if(!rst_n) 
     rst_nr<= 1'b0;
  else  
     rst_nr<= rst_nr1; 
            
 endmodule 
 
 
下面就可以直接用用rst_nr作为复位信号使用,并且不会造成亚稳态。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值