复位电路及时序分析

复位电路及时序分析



前言

一、复位的三种模式

同步复位
异步复位
异步复位同步释放

1.1 同步复位

1.1.1 同步复位理论

和时钟沿有关
需要同步复位的脉冲宽度重视需要一个时钟来完成复位。

发送同步复位信号到寄存器的方式有两种:

  • **随数据门控输入:**缺点是会添加额外的门延迟,会导致建立时间可能不满足
  • 依赖LAB到寄存器的专用布线资源,但是还是会比异步复位到同一个寄存器要慢。
    因此一般不采用同步复位

注意:同步复位不能放入敏感列表中,否则就是异步复位了

**小结:**同步复位需要考虑类似于单bit信号的一些概念:布局布线后到寄存器的路径、脉冲宽度、不同时钟不同的复位信号、建立时间和保持时间

1.1.1 同步复位实际应用

大部分输入到FPGA的是异步,如果要使用同步复位,则需要复位信号在内部进行同步后,再送到寄存器中

// 这里也是需要打两拍,就是**单bit信号的同步处理**
assign rst_n = reg2;
always@(posedge clk)
begin
	reg1 <= reset_n;
	reg2 <= reg1;
end

在时序上需要设置为伪路径

缺点:因为是外部的异步信号,往往该异步信号的脉宽小于一个时钟周期
优点:可以防止一些毛刺,可以让单路拒绝小于n个时钟周期的脉冲触发同步复位

注意:

  • 因为是同步复位,所以每一个时钟域都应该采用独立的复位电路(因为同步复位至少大于复位时钟域一个时钟周期)
  • 如果使用pll的输出的时钟来创建同步电路,只有pll时钟输出稳定之后才能复位(复位信号是同步与时钟的,时钟都不稳定,怎么复位呢)
  • 如果pll使用了复位信号,那么这个信号就不要同步到PLL的输入时钟,直接使用异步复位(PLL的时钟复位又用PLL输入时钟下的同步复位信号,这不冲突了吗)

小结:外部输入的异步信号,经过同步器处理后,输入到对应时钟域进行复位,不同的时钟域要用不同的同步器处理;涉及到PLL的需要注意复位时间;同步复位在一定程度上可以避免毛刺

1.2 异步复位

tip:不是所有的寄存器都需要复位,需要复位的才给复位,不然会浪费布局布线资源。

1.2.1 异步复位理论

异步复位在复位的时候没问题,但是在释放的时候需要考虑异步微建立时间微保持时间,,复位去除检查,removal(类似保持时间)recovery(类似建立时间);

1.2.2 异步复位实际应用

亚稳态处理:
在复位信号撤销的时候,如果不满足就会进入亚稳态

解决方式:在复位的寄存器后面加一系列寄存器(这个一系列是根据恢复情况来的),另外,如果本身系统就是在复位后的一段时间才工作的话,其实异步复位出现亚稳态不会影响

**时序:**异步复位和复位的时钟域没有任何的时序关系,那么设为伪路径

**去抖处理:**同步化的异步复位

此外:除了亚稳态问题,还需要关注异步复位在整个系统中布局布线带来的时序问题

例如,因为复位信号线的布局布线不同,有的复位信号在当前时钟周期就来到,有些是在下一个时钟周期,那么复位的时序就不同,如果一个寄存器依赖另一个寄存器的输出,那么就会造成问题。比如使用独热码的状态机,5’b0001,有4种状态,每一个只有一个状态位被设置,由于有些状态位跳出复位状态有一些没有跳出,则会出现非法状态。如果使用二进制编码状态机,可以创建未使用的状态来过渡到复位状态,使其成为一个确定的状态机,这样就允许非法或闲置的状态得到恢复。

1.3 异步复位同步释放

tip:同步复位的优势就是抗噪声的能力。
程序设计如下:
有两个模块:

  • 一个是产生同步复位输出:将异步复位在时钟域下进行同步,产生一个后续逻辑使用的同步化的异步复位
  • 另外一个是异步复位:将已经同步化的复位信号当做异步复位使用。
assign rst_n = reg4;

always@(posedge clk or negedge reset_n) begin
	if(!reset_n) begin // 这里复位时高复位:这里相当于复位信号结束的时候,采用的是同步输出复位信号为0,**这里输出是异步的**
		reg3 <= 1'b0;
		reg4 <= 1'b0;
	end
	else begin //这里相当于复位信号来了,之后使用同步后的复位信号并延迟了一拍输出,**这里输出是同步的**
		reg3 <= 1'b1;
		reg4 <= reg3 ;
	end
end


代码中需要注意的是,最好对输入到FPGA的异步复位进行滤波和去抖,也就是至少要保证复位至少有一个时钟周期。

此外,如果设计到PLL,也使用同步器上的同步后的复位,因为驱动时钟是PLL产生的,如果都用这个复位信号,那么会导致没有时钟,同步器(就是第一个模块)中的寄存器将无法清除复位状态,无法跳出复位,最好像下面这样使用

assign rst_n = reg4;

always@(posedge clk or negedge reset_n) begin
	if(!reset_n) begin // 这里复位时高复位:这里相当于复位信号结束的时候,采用的是同步输出复位信号为0,**这里输出是异步的**
		reg3 <= 1'b0;
		reg4 <= 1'b0;
	end
	else if(lock)begin **// 只有PLL输出稳定了,才复位完成结束,否则一直复位**
		reg3 <= 1'b1;
		reg4 <= reg3 ;
	end
end


时序上就是伪路径即可

tip:不同时钟域的复位信号,最好先同步到当前时钟域下再使用,也就是说每一个时钟,都会有其自己的复位信号(将复位信号同步到各自时钟域中,就是要让其复位至少有一个时钟周期,防止出现时序问题)、一般硬件都是异步复位,反之用同步会增加面积
小结:不管是什么模式的复位,需要思考复位信号的脉宽、亚稳态问题、干扰和去抖问题、布局布线导致的复位顺序问题、PLL复位问题、复位信号扇出、复位释放顺序

总结

从复位的整体角度来总结:类似考虑单bit信号的传输,需要考虑:

  • 微建立时间和微保持时间:防止出现亚稳态、脉冲宽度要合适、后续数据打拍解决亚稳态
  • 布局布线:复位的速度、顺序
  • 不同时钟在使用各自的复位
  • 编码问题
  • 复位去抖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值