概述
大部分的FPGA和ASIC设计都是基于大量flip-flop或者寄存器的同步系统设计,所以所有这些同步单元的起始状态或者将要返回的状态是一个已知状态(罗辑‘1’或者‘0’)就显得非常重要。这一个功能通常都是由一个“reset”电路来完成。一个设计或者一个FPGA器件通常都使用或输入有一个或者多个复位信号,同时伴随一些其它控制逻辑电路来共同完成此“复位”功能。本文探讨各种复位电路,同步的、异步的以及同步化的异步复位,分析这些不同复位电路的优缺点。展现实现这些不同复位电路的技巧,并使用Altera的TimeQuest时序分析器来对它们进行正确的时序分析。
我们通常意义上的同步电路通常是由两种复位方式来进行电路的复位,即同步复位和异步复位。同步复位的复位频率同步与寄存器的时钟域,而异步复位按性质,其影响寄存器和寄存器的时钟之间没有确定的时序关系。正因为如此,获取异步复位信号的时序关系是非常困难的。如前所述,这里即将讨论的第三种复位,无法更好的为其命名,大家更多的时候叫其同步化的异步复位,就是一个异步复位被同步到系统时钟域,有时候大家也称这种过程为异步复位同步释放。这种同步化的异步复位,具有同步复位的好处,却没有同步复位的缺点;同时他们还避免了纯粹异步复位的缺陷。后面论述中我们将看到,这种同步化的异步复位应该是FPGA电路设计时复位电路的首选。
同步复位
所谓同步复位是基于这样的一个前提,即服务信号只是在寄存器时钟的有效沿时影响该寄存器的状态。同步的典型优点是它们能确保电路为百分百的同步电路。同步复位的另一个优点是它们的时序可以很容易被静态时序分析器比如Altera的TimeQuest分析器分析。由于同步复位信号是被时钟启动(Launch)和锁存(Latch),而启动和锁存的时钟彼此同步,所以复位信号的到达时间(Arrival time)和所需时间(Required time)就能很轻易的确定并进行正确的slack分析。同步复位还有一个优点是它们更易于仿真当它们作用于一些基于周期机制的功能模块时。
同步复位也有自己的缺点。例如,它们可能要求脉冲宽度满足一定要求,以保证在需要复位的时钟沿复位信号是有效的,所以这时候电路中也许需要脉冲延伸器或者说脉冲扩展器。也许更重要的是,同步复位总是需要一个时钟来完成对电路的复位。如果因为某些因素导致复位信号的启动时钟沿错误,那么就会导致整个电路复位功能的失败。
在Altera FPGA中,有两种方法可以将复位信号送达寄存器。一种是随数据门控输入,如图1所示,另一种是使用LAB宽控制信号,如synclr,如图2所示。

图1:使用组合逻辑的同步复位

图2:LAB-wide控制信号
我们看,第一种方法存在潜在的缺陷,即额外的门延时可能不得不被添加到逻辑电路当中,从而导致复位信号数据到达时间(Data Arrival Time)增加。在这种情况下,就可能会导致建立时间的slack为负。第二种方法依赖于LAB到寄存器的专用布线资源。尽管如此,还是比异步复位到同一个寄存器要慢。如图3所示,同步清零(synclr)到达寄存器的路径上经过了一个与门,而异步清零(aclr)到同一个寄存器的路径是直接到达的。此外从图3我们可以看到每个LAB的控制信号里边,只有一个同步清零(synclr),却有两个异步清零(aclr)。所以使用大量同步复位信号会导致fitter工具使用更多的LAB模块。然而,如果没有使用这些LAB范围内的同步清零信号,逻辑单元(LC)利用率可能会增加。这些都是在FPGA中采用同步复位时必须要做出的权衡。幸运的是,在Quartus II提供了一些控制措施来让用户在这两种方法选择采用哪种方法。这些控制可以是全局控制,也可以是只施加于给定的模块(entity)上,但是不能针对单个寄存器施加此控制。在AE中可以添加以下两类约束来进行此控制,分别是ALLOW_SYNCH_CLEAR_USAGE 和FORCE_SYNCH_CLEAR。第一个设置将允许综合器在需要的时候使用LAB范围同步清零信号,第二个设置,迫使工具总是使用它。无论哪种方式,同步复位将是比异步复位慢,在FPGA设计中不是最好的方式。

图3:ALM细节
如果我要检视同步复位信号的时序,那么有两种同步复位信号需要考虑,即外部同步复位和内部同步复位信号。所谓外部同步复位信号是该同步复位同步于FPGA外部时钟域,只是这种同步复位在一般FPGA设计中是不常见的。图4显示了一个外部同步复位的例子。

图4:外部同步复位原理图
如图4所示,一个上电异步复位信号por_n在外部被系统时钟寄存两次后才输入到FPGA。而在FPGA内部,该复位信号和数据一同经过一个与门后作为一个寄存器的数据输入,产生一个同步复位。图5显示了一个图4所示原理图电路的Verilog代码,需要注意的是当使用同步复位时,复位信号不能放在进程的敏感列表中,否则就是异步复位了。

图5:外部同步复位Verilog代码
上述电路的时序约束如图6所示,由于外部复位信号是同步复位,所以只需要将reset_n约束为普通的输入信号,可以施加set_input_delay约束。 |