复位:
复位是一种操作,可以使电路中某些寄存器的值为我们指定一个初始值,从而使电路能够正常工作;
Removal timing check
复位信号的removal time是指在时钟有效沿来临之后,异步复位信号需要继续保持有效的最短时间。满足这个最短时间才能确保对寄存器进行正常的复位。Removal time check的波形图如下图所示。
Recovery timing check
recovery time是指在时钟有效沿到来之前,复位信号保持高电平的最短时间。即复位信号变到非复位状态的电平必须在clk之前一定的时间到达。满足这个Recovery time,可以确保在时钟有效沿来临时,异步复位信号处于无效状态,从而确保正常的数据采样。
复位信号分类:
同步复位:只有在时钟上升沿到来时,才能生效,否则无法完成对系统的复位工作。
always@(posedge clk)
if(~rst_n)
q<=0;
else
q<=d;
优点:
1、有利于仿真;
2、有利于消除毛刺信号;
3、整个电路都是同步电路,综合得到的时钟频率较高。
缺点:
1、复位信号必须要被系统识别才能完成复位任务;
2、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,耗费较多的逻辑资源。
异步复位:无论时钟沿是否到来,只要复位信号有效就对系统进行复位。
always@(posedge clk,negedge rst_n)
if(!rst_n)
q<=0;
else
q<=d;
优点:
1、逻辑i器件的目标库内有异步FIFO复位端口,可以节省资源;
2、设计相对简单;
3、异步复位信号识别方便,可以很方便的使用FPGA的全局复位端口。
缺点:
1、在复位信号释放(reset)的时候容易出现问题。具体来说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态;
2、复位信号容易受到毛刺影响。
异步复位,同步释放:复位信号来的时候不受时钟的控制,在复位信号释放的时候收到时钟信号的的同步。
分析
异步复位
当rst_async_n有效时,第一个D触发器的输出是低电平,第二个D触发器的输出rst_sync_n也是低电平,方框2中的异步复位端口有效,输出被复位。
同步释放
假设rst_async_n撤除时发生在clk上升沿,如果不加此电路则可能发生亚稳态事件。加上此电路以后,假设第一级D触发器clk上升沿时rst_async_n正好撤除,则D触发器1可能输出高电平,也可能输出亚稳态,也可能输出低电平。但此时第二级触发器不会立刻变高,它要么复位为0,要么跟随前一级触发器的输出Q1,而前一级触发器的输出Q1为0,因此,无论如何第二级触发器的输出都为0,而触发器1的输出,若稳定后Q1为1,那么rst_sync_n在下一个周期被拉高,实现同步释放;如果稳定后的Q1为0,那么下个周期rst_sync_n仍为0,但此时由于rst_async_n已经为高,所以Q1在下一个周期必为1,那么rst_sync_n在下一个时钟上升沿到来时被拉高,也实现了同步释放,只是晚了一个周期而已。
下面是异步复位同步释放的RTL代码实现:
always @ (posedge clk, negedge rst_async_n)
if (!rst_async_n) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1;
rst_s2 <= rst_s1;
end
assign rst_sync_n = rst_s2;
endmodule
利用前面两级触发器实现。特点:
1、第一级触发器的数据端口是接电源,即高电平1’b1。
2、第一级触发器的输出,不能使用,因为仍存在亚稳态的危险。两级触发器做同步,是非总线信号的最常见异步处理方法。总线信号的异步处理方法,最常见的是异步fifo实现。
总结:
1、复位同步器,第二个触发器当复位释放的时候,是否会带来亚稳态,比如reset释放和时钟之间存在recovery和removal timing违反怎么办?结论是:没有亚稳态,无需担心。
2、只有当DFF的数据输入端口和数据输出端口,存在值不同的情况下,才会有recovery timing/removal timing问题。
3、第1个dff的数据输入端口和数据输出端口,在异步复位释放的时刻,是1和0,所以会有竞争冒险,有概率产生亚稳态;
4、第2个dff的数据输入端口和数据输出端口,在异步复位释放的时刻,是0和0,所以不存在竞争冒险,不会产生亚稳态。
5、因为第1个dff有概率产生亚稳态,为了防止传播,所以,多加几级dff,降低亚稳态的传播概率是有益处的。