概述
复位
复位的基本目的是使器件能够进入可以正常工作的状态(可知态)。当系统进入异常状态后,通过复位能够让系统重新正常工作。一般把复位分为同步复位、异步复位以及无复位。无论是同步复位还是异步复位,复位数必须保证和谐(is timed),以保证复位的释放在一个时钟周期内完成。
同步复位
同步复位原理
同步复位被定义为连接到寄存器或其他同步单元的输入信号,当其有效时,系统被复位。同步复位要求,复位的前沿和后沿(leading and trailing edges)必须远离时钟沿。
module rst_syn(
input clk,
input rst,
input din,
output reg sig
);
always@(posedge clk)begin
if(rst)
sig <= 1'b0;
else
sig <= din;
end
endmodule
通过vivado得到电路为:
同时也可以将复位信号放到触发器D端(在仿真时,假如data为X状态,rst被阻塞)
同步复位的优点
- 由于同步复位是在时钟有效沿到达时有效,这意味复位信号不会出现亚稳态情况,同时复位信号上的毛刺,可以被时钟滤除。
- 同步复位有助于综合和物理实现工具执行不同的面积优化。
- 保证了电路是同步的,排除了亚稳态的影响。
同步复位的缺点
- 由于同步复位需要时钟有效沿到达,所以要想器件复位,必须存在时钟信号。例如在省电模式下,同步复位就无法使用。
- 需要对复位信号进行相应的时序约束(对时序有严格的要求)。
- 综合工具不能将复位信号和其他信号区分开。
- 复位信号必须被时钟所捕获,这样才能完成对系统的复位,所以有时候需要对复位信号进行脉冲扩展,以保证复位信号被时钟信号捕获、当复位信号的脉宽不能被时钟捕获,则复位失败。
- 在仿真中,复位信号可能会穿过一些组合逻辑,使得复位信号被X状态阻塞。
- 由于很多产家的目标库中的触发器只有异步复位为端口,则进行同步复位将耗费更多的逻辑资源。
异步复位
异步复位是指当连接到寄存器或其他同步单元上的输入信号有效时,该单元复位,并且该操作与时钟无关。
module rst_syn(input clk, input din, input rst ,output reg sig);
always@(posedge clk or posedge rst)begin
if(rst)
sig <= 1'b0;
else
sig <= din;
end
endmodule
电路为:
recover time(恢复时间)
-
对于异步复位来说,复位信号有效时的时序问题是不需要关心的,但是复位信号的释放时需要满足recover time 和 removal time,才能有效完成复位释放,以防止亚稳态的出现。
-
recover time指的是在复位释放过程中,保证电路能够在下一时钟沿之前恢复到非复位状态,复位信号释放与下一个有效时钟沿需要满足的最小时间间隔。类似于建立时间(setup time).
-
在这时间给电路中的寄存器留了足够时间来恢复至正常的状态,如何不能满足这个条件,那么下个时钟沿将会失效。
removal time(去除时间)
-
removal time在复位释放过程中,在时钟有效沿到来后复位信号还需要保持的最小时间。如果复位释放与该时钟有效沿靠的太近,就不能保证保障屏蔽该时钟沿。类似于hold time.
-
当复位信号的释放与下个时钟沿或者前一个时钟沿靠的太近,那么就无法确定该时钟沿是否有效,也就是触发器处于不稳定状态。
异步复位优点
- 无需时钟,当复位信号有效时,即可对系统进行复位,能很方便的使用全局复位。
- 相比于同步复位,异步复位有着更为宽松的时序要求,缓解了电路的时序压力。
- 由于很多产家的目标库中的触发器只有异步复位为端口,能节省逻辑资源
异步复位缺点
-
异步信号存在毛刺(glitch),可能被目标寄存器当作有效信号,当毛刺靠近时钟沿时,也会引起亚稳态。
-
由于异步信号不能被时序约束覆盖,其可能出现亚稳态,从而导致复位失败(复位撤离时间不满足复位恢复时间会导致亚稳态)。
-
可造成偶发错误
由于复位信号的布线延迟,导致各个寄存器的复位时间存在差异,可能使得不同寄存器的复位发生在不同的时钟周期。
always@(posedge clk)
sig <= din;
由于复位信号在大型设计中占用了大量的FPGA的布线资源。使用无复位的方式,能够节约FPGA的布线资源,有助于提高设计性能和减少编译时间。
缺点就是设计不灵活,只能在上电时初始化FPGA
异步复位同步释放
使用异步复位同步释放的方式能够有效兼顾同步复位和异步复位的优点,既然像异步复位那样随时复位,又可以拥有同步复位无亚稳态。
module reset_mix(
input clk,
input rst_asyn,
output reg rst_out
);
reg rst_d0;
always @(posedge clk or negedge rst_asyn)begin
if(!rst_asyn)
rst_d0 <= 1'b0;
else
rst_d0 <= 1'b1;
end
always @(posedge clk or negedge rst_asyn)begin
if(!rst_asyn)
rst_out <= 1'b0;
else
rst_out <= rst_d0;
end
endmodule
电路为:
时序波形为(假设触发器复位信号是低电平有效):
当有效复位信号rst_asyn 到来时,两个触发器同时被复位,此时复位同步器输出低电平,电路与之相连的触发器被复位。当复位信号rst_asyn释放时,左侧的触发器在有效时钟沿到来时,D端输出1,此时右侧的触发器依旧输出0,当下一个有效时钟沿到来后,右侧时钟沿输出1,电路中其余触发器复位被释放。
当复位信号释放不满足recover time ,出现亚稳态时:
由时序图可知,当复位信号释放过程不满足时序要求时,将会出现亚稳态。对于右侧寄存器来说,其Q端和D端仍然是稳定的低电平,所以右侧触发器输出是不会机会在两个电平之间发生抖动。待左侧寄存器输出稳定后,等待下一个时钟有效沿到来,右侧触发器输出高电平,复位释放。(当复位信号撤销和时钟上升沿太靠近时,如果寄存器的输入值和输出值相同时,那么就不应该发生亚稳态)。
其他
-
综合工具要求如果敏感列表中某一个信号时沿敏感的(Edge-sensitive),那么所有在敏感列表中的信号必须都是沿敏感的。
-
复位采用的电平: 要视芯片中的触发器决定复位信号是高电平有效还是低电平有效,假如某芯片是高电平有效,在设计时设为低电平有效,那么综合器将在触发器复位/置位端前插入一个反相器(这就需要浪费一个LUT)
最后
以上就是高大小刺猬为你收集整理的FPGA中关于复位的总结的全部内容,希望文章能够帮你解决FPGA中关于复位的总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复