复位电路设计(异步复位、同步释放)

以下内容摘自正点原子的:《逻辑设计开发指南》

复位电路是数字逻辑设计中非常常用的电路,不管是 FPGA 还是 ASIC 设计,都会涉及到复位,一般 FPGA或者 ASIC 的复位需要我们自己设计复位方案。复位指的是将寄存器恢复到默认值。一般复位功能包括同步复位和异步复位。复位一般由硬件开关触发引起,也可以由复位逻辑控制引起。

相信大家在学习 FPGA 或者 ASIC 的时候都有如下的疑问:

1、 数字逻辑为什么需要复位?
2、 FPGA 板上面没有复位按键怎么办?
3、 复位只有通过按键复位一个控制方式吗?
4、 同步复位好还是异步复位好呢?
5、 复位是高电平有效还是低电平有效好呢?

依次来解决一下上面的疑问

1、 数字逻辑为什么需要复位?

数字电路中寄存器和 RAM 在上电之后默认的状态和数据是不确定的,如果有复位,我们可以把寄存器复位到初始状态 0,RAM 的数据可以通过复位来触发 RAM 初始化到全 0。那可能很多人会问为什么是全 0呢?其实一般逻辑起始都是从 0 开始变化的,这个是根据设计的需要设定的一个值,如果设计需要寄存器上电复位为 1,也是可以的。还有一种情况是逻辑进入了错误的状态,通过复位可以把所有的逻辑状态恢复到初始值,如果没有复位,那么逻辑可能永远运行在错误的状态。因此复位功能是很重要的一个功能。

2、 FPGA 板上面没有复位按键怎么办?

没有复位按键也没有关系,因为 FPGA 内部也会有上电复位的功能,不管是 Intel(已收购 ALTERA)还是 Xilinx 的 FPGA,都是有上电复位电路,也就是 POR(Power On Reset)电路。FPGA 芯片内部有一个上电检测模块,一旦检测到电源电压超过检测门限后,就产生一个上电复位脉冲(Power On Reset)送给所有的寄存器,这个脉冲会自动作用在各个寄存器的复位端,和功能复位管脚共同控制寄存器的复位。

还有一种情况,就是 FPGA 重新配置之后,也会触发上电复位。因此 FPGA 板上面即使没有复位按键也是没有关系的。

3、 复位只有通过按键复位一个控制方式吗?

复位按键是一种控制方式,还有一种上电自动复位控制,如下图所示。

在这里插入图片描述
这种是一种简单的 RC 复位电路,电源接通时候,通过 R1 对 C2 进行充电,经过一段延迟后加到电路当中产生复位信号,这个复位信号的上升速度低于电源的上电速度,当复位引脚检测到高电平时候,系统复位结束,进入正常工作状态。

4、 同步复位好还是异步复位好呢?

  • 同步复位

同步复位指的是当时钟上升沿检测到复位信号,执行复位操作,有效的时钟沿是前提。

Verilog 中是这样写的:

always @ (posedge clk) begin
	if (rst_n == 1'b0) 
 		y <= 1'b0 ;  
 	else 
		y <= b ;  
end

同步复位的优点如下:
a、有利于仿真器的仿真;

b、可以使所设计的系统成为 100%的同步时序电路,有利于时序分析,而且可综合出较高的 Fmax;

c、由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺。

同步复位也有一些缺点,缺点如下:

a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑诸如时钟偏移、组合逻辑路径延时、复位延时等因素(所以复位信号有时需要脉冲展宽,用以保证时钟有效期间有足够的复位宽度);

b、由于大多数的逻辑器件的目标库内的 DFF 都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会一方面额外增加 FPGA 内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。

  • 异步复位

异步复位指的是无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。当时钟上升沿检测到复位信号,执行复位操作。

Verilog 中是这样写的:

always @ (posedge clk or negedge rst_n) begin
	if (rst_n == 1'b0) 
 		y <= 1'b0 ;  
 	else 
		y <= b ;  
end

优点:
a、大多数目标器件库的 DFF 都有异步复位端口,那么该触发器的复位端口就不需要额外的组合逻辑,这样就可以节省资源;

b、设计相对简单;

c、异步复位信号产生和响应都很方便(电路在任何情况下都能复位而不管是否有时钟出现)。

异步复位也有一些缺点,缺点如下:

a、最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态(此时 clk 检测到的 rst_n 的状态就会是一个亚稳态,即是 0 是 1是不确定的),从而导致复位失败。

异步复位信号需要满足 recovery time(恢复时间)和 removal time(去除时间),才能有效的复位和释放复位,防止出现亚稳态。

  • 释放复位时,复位信号在时钟有效沿来临之前就需要提前一段时间恢复到非复位状态,这段时间为 recovery time。类似于同步时钟下触发器的 setup time。
  • 复位时,复位信号在时钟有效沿来临之后,还需要在一段时间内保持不变,这段时间为 removal time。类似于同步时钟下触发器的 hold time。

recovery 与 removal time 示意图如下所示。
在这里插入图片描述

b、可能因为噪声或者毛刺造成虚假复位信号(比如系统正常工作时突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题);

c、静态定时分析比较困难,静态时序分析一般是针对同步设计的,都是基于时钟周期来分析时序的。

d、对于 DFT(DesignForTest 可测性设计)设计,如果复位信号不是直接来自于 I/O 引脚,在 DFT 扫描和测试时,复位信号必须被禁止,因此需要额外的同步电路。

总结下来,我们推荐使用异步复位、同步释放的方式,并且复位信号为低电平有效。

这里我们再进一步解释下,
1、复位信号到来的有效与否与 clk 无关,而且复位信号的撤除也与 clk 无关,但是复位信号的撤除是在下一个 clk 来到后才起的作用。

2、异步复位同步撤离的目的为了防止复位信号撤除时,可能产生的亚稳态。

异步复位同步撤离产生的 Verilog 代码如下:

always @ (posedge clk or negedge rst_async_n) begin
 	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 
end
 
assign rst_sync_n = rst_s2; 
 
always @ (posedge clk or negedge rst_sync_n ) begin
 	if (rst_sync_n == 1'b0)
 		y <= 1'b0 ;
 	else 
 		y <= b ;
end

在这里插入图片描述
复位信号 rst_sync_n 由高拉低时实现 y 寄存器的异步复位。同步释放,这个是关键,即当复位信号rst_async_n 撤除时(由低拉高),由于双缓冲电路(双触发器)的作用,rst_sync_n 不会随着 rst_async_n 的撤除而撤除。假设 rst_async_n 撤除时发生在 clk 上升沿,如果不加此电路则可能发生亚稳态事件,但是加上此电路以后,假设第一级 D 触发器 clk 上升沿时 rst_async_n 正好撤除,(第一个 DFF 此时是处于亚稳态的;假设此时识别到高电平;若是识别到低电平,则增加一个 Delay)则 DFF1 输出高电平,此时第二级触发器也会更新输出,但是输出值为前一级触发器 clk 来之前时的 Q1 输出状态,显然 Q1 之前为低电平,所以第二级触发器输出保持复位低电平,直到下一个 clk 来之后,才随着变为高电平,即同步释放。

5、 复位信号是高电平有效还是低电平有效好呢?

一般数字电路设计里面是使用低电平复位,但是在一些 IP 电路里面,比如 FPGA 的 FIFO 或者一些其他硬核 IP,一般都是高电平复位。使用低电平还是高电平复位都差不多,不过习惯上一般使用低电平复位。

posted @ 2021-03-06 22:55  耐心的小黑  阅读(516)  评论(0编辑  收藏  举报