这里为什么要分析复位的设计,主要是因为在设计中,对于一些内部寄存器,我们需要进行静态时序分析,如quartus的Time Quest时序分析工具。而复位信号一般都是从外部进来,然后通过一定布局布线直接接到对应寄存器上,这就使得很难使用静态时序分析工具来分析对应的时序功能。如同步复位,这个主要是与输入时序分析有关,相对比较容易进行分析,而对于异步复位的情况,则变得较为复杂。(如建立时间域值slack)
同步复位
同步的意思就是与控制时钟保持同步,因此,在设计中,寄存器接收的复位信号有效是在时钟的边沿触发的。实际上同步复位在altera的芯片中,是与数据一同接入一个组合逻辑电路,然后通过该组合逻辑电路,将最终的数据接入寄存器输入端。如下设计一个简单的同步复位电路:
module Verilog1(
input clk,
input rst_n,
output reg a
);
always@(posedge clk)
begin
if(!rst_n)
a <= 1'b0;
else
a <= a+1'b1;
end
endmodule
其综合后的电路如下图。
而如果不加复位电路:
module Verilog1(
input clk,
output reg a
);
initial
begin
a <= 1'b0;
end
always@(posedge clk)
begin
a <= a+1'b1;
end
endmodule
很明显,同步复位电路中,是将同步复位与输入的数据通过一个组合逻辑电路之后再接入寄存器的输入端。因此同步复位电路要比没有同步复位电路的电路的组合逻辑延时大一些。
在quartus的TimeQuest分析器中建立时间裕量是由数据请求时间减去数据到达时间计算得到的。而由于组合逻辑延时增加,因此会导致数据到达时间的增大,由此,会降低建立时间裕量,从而不得不降低设计的主频。
有时候可以设计一个超过n个clk有效的复位有效电路,来增强电路抗干扰能力。
异步复位
1.亚稳态
异步复位有优点也有缺点,其优点就是可以不占用组合逻辑资源,避免了同步复位降低建立时间阈值的缺陷。缺点就是容易出现亚稳态的情况,如下图。
注:此图片来自《FPGA设计实战演练(高级技巧篇)》
当复位信号与时钟边沿离得较近的时候,比较容易产生亚稳态,这时一般在后面加两级触发器来消除该亚稳态。如下图,在复位寄存器之后级联两级触发器,之后再将数据送到下一级计算模块当中。
我们可以看一下altera的异步复位是怎样的,对于每一个寄存器,其有清零和置位两个方式,置位其实就是预设值数据。
下面为清零方式
always@(posedge clk , posedge rst_n)
begin
if(rst_n)
data <= 1'b0;
else
data <= ~data;
end
置位方式
always@(posedge clk , posedge rst_n)
begin
if(rst_n)
data <= 1'b1;
else
data <= ~data;
end
在进行异步复位的时候,需要设置截断异步复位信号的约束。异步复位和它们将要复位的寄存器的时钟域之间没有确定的时序关系,所以工具很难进行正确的静态时序分析,可以在SDC文件中使用set_false_path语句对时序路径进行截断。
set_flase_path -from [get_ports {rst_n}] - to [all_registers]
2.噪声等抖动
很多时候电路的运行场合会存在噪声,而一些噪声可能会影响到复位信号,而这些噪声是不确定的,一般都是影响部分寄存器,这就会导致一些寄存器的复位信号有效,有些无效。一旦这种情况发生,就可能导致整个系统跑飞的情况。比如状态机,状态寄存器可能会出现某一个寄存器发生复位,导致状态进入无效状态,最终使得系统无法正常工作。
异步复位同步释放
所谓异步复位同步释放,字面意思就是复位的时候,是按照异步复位的功能进行的,使用的资源也是异步复位的资源,而同步释放是指寄存器跳出复位状态是受时钟控制的,也就是在时钟的上升沿释放。就是通过某种设计,将异步信号同步到被异步复位寄存器的时钟域下,可以按照跨时钟域同步器设计来理解,因为是异步复位信号,所以只是其同步设计与数据的跨时钟同步不一样。主要作用可以降低亚稳态的概率,提高电路抗干扰能力,利于时序分析工具进行分析。
上图中的电路的功能,是通过两级寄存器将异步复位信号传入内部寄存器中,这个时候,时序分析工具就可以分析同步后的异步复位信号与内部寄存器的域值了,而对于外部给入的复位信号,同样需要设置false
路径(与上面异步复位一样)。这样设计的目的就是可以帮助我们分析异步复位的时序分析。这里的电路可以使得异步复位信号至少保持一个时钟的时间,大大减小了亚稳态的情况,如果想要增加保持的时间,可以在同步器寄存器中继续增加寄存器的级数。
如果整个系统的时钟是通过PLL提供的,对于PLL的复位信号是不能通过同步器来驱动的,需要直接与外部复位信号相连,而PLL的时钟锁定是需要时间的,而这个过程中,如果其余寄存器发生了复位的情况,在这个错误的时钟控制下,整个系统的精确度肯定会收到影响,因此可以将PLL的locked信号接到同步器中所有寄存器的时钟使能端,这样就可以实现在PLL锁定期间,一旦发生复位,可以将该复位信号一直持续到PLL时钟有效。如图为电路原理图实现方法。
异步复位信号时序模型
对于异步复位,我们需要保证复位信号在被复位寄存器的一个时钟上升沿之后保持一定时间,使该寄存器能够被复位有效,同时也要保证复位信号在下一个时钟上升沿之前,将异步复位信号撤掉,以确保数据能够正常在寄存器之间正确传递。所以异步复位信号的撤销需要在hold
之后到setup
之前电路工作才是有效的。
根据设计的异步复位同步释放电路,其复位信号在寄存器之间传递的模型是上图那样的,中间尽量不加入任何逻辑延时。
我们在分析其时序时,主要看的是复位信号是否满足能够在建立时间之前撤销,因为如果不能做到,就会导致一些电路设计不能正常工作,或产生误差,如状态机跑飞、计数器偏差等(只针对在复位之后立即或几个时钟内就要进行工作的,如果是等待一段时间之后才将数据变为非复位数据的情况,则不需要考虑时序不满足,因为不影响)。
在Time Quest里,Recovery和Removal表示复位的余量,Recovery表示复位信号撤销时间与建立时间的裕量,Removal表示复位持续时间与保持时间的裕量。我们一般主要关注的是Recovery的报告,只要裕量大于零,则复位信号就能保证不产生Recovery故障,电路就可以在复位之后即刻正常工作。