复位是将寄存器恢复到默认值。一般复位的功能包括:同步复位,异步复位。
数字逻辑需要复位
数字逻辑中的寄存器和ram在上电后默认的状态和数据是不确定的,如果有复位,我们可以把寄存器复位到初始状态0,ram的数据可以通过复位来触发RAM初始化到全0。
一般的逻辑都是从0开始的,是根据设计的需要 设定的一个值。只要逻辑进入了错误的状态,通过复位可以把所有的状态恢复到初始值。如果没有复位,那么逻辑可能永远存在运行错误的状态。
FPGA内部也会有上电复位
FPGA板子上没有复位按键的话,FPGA内部也有上电复位电路,FPGA芯片内部有一个上电检测模块,一旦检测到电源电压超过检测门限后,就产生一个上电复位脉冲送给所有寄存器,脉冲会自动作用各个寄存器,这个脉冲会自动作用在各个寄存器的复位端,和功能复位管脚共同控制寄存器的复位。
FPGA重新配置后,也会触发上电复位。
复位方式
复位按键只是一种控制方式, 还有一种上电自动控制复位控制。
同步复位。异步复位
同步复位:
同步复位是指当上升沿检测到复位信号,执行复位操作,有效的时钟沿是前提。
always @ (posedge clk) begin
if (rst_n == 1'b0)
y <= 1'b0 ;
else
y <= b ;
end
同步复位优点:
有利于仿真器的仿真
可以使设计的系统成为100%的同步时序电路,有利于时序分析,可综合出较高的Fmax
由于只在时钟有效电平到来时有效,所以可以滤除高于时钟频率的复位毛刺。
缺点:
复位信号的有效时长必须大于时钟周期,才能真正的被系统识别并完成复位任务,同时还要考虑诸多时钟偏斜,组合逻辑路径延时,复位延时等因素。
由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,若采用同步复位的话,综合器就会在寄存器的数据输入端端口插入组合逻辑,这样会额外增加FPGA内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。
异步复位:
异步复位指的是无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
always @ (posedge clk or negedge rst_n) begin
if (rst_n == 1'b0)
y <= 1'b0 ;
else
y <= b ;
end
优点:
大多数目标器件库的DFF都有异步复位端口,那么该触发器的复位端口不需要额外的组合逻辑,可以节省资源
设计相对简单
复位信号的产生和响应都很方便。
缺点:
在复位信号释放(reset)的时候容易出现问题。具体来说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
异步复位信号需要满足恢复视觉和去除时间,才能有效的复位和释放复位,防止出现亚稳态。
推荐使用异步复位,同步释放的方式
一般来说,同步系统,都使用异步复位。这是因为同步复位的电路实现,比异步复位的电路实现,要浪费更多电路资源。
if(!rst_n)
b <= 1'b0;
else
b <= a;
//
always @ (posedge clk or negedge rst_n)
if(!rst_n)
c <= 1'b0;
else
c <= b;
正常情况下,clk的上升沿c更新为b,b更新为a。一旦进入复位,b,c都清零;但是我们不能确定复位信号rst_n会在什么时候结束。如果结束于b、c寄存器的{launch edge –setup,launch edge+hold}时间之外,那么一切都会正常。但如果恰恰相反,rst_n的上升沿出现在了clk上
。如果此时认为rst_n为0,那么b、c依然保持复位清零,而如果认为rst_n为1,那么就跳出复位。因为此时rst_n的不确定性,就可能出现4种情况,即b和c都复位或者都跳出复位,再或者一个复位一个跳出复位。
那么后者就会造成一个系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?为了解决这个问题,一个常见的方法就是采用异步复位,同步释放的机制。
异步复位,同步释放:复位信号到来时,不受时钟信号的同步,而复位信号释放的时候的受时钟信号的同步。
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;
异步复位: 当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在下一个周期被拉高,实现同步释放。