复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)
文章目录
- 背景
- 前言
- 一、复位信号的同步与释放
- 1.1 ··· 同步复位
- 1.1.1 ··· 综述
- 1.1.2 ··· 优缺点
- 1.2 ··· recovery time和removal time
- 1.3 ··· 异步复位
- 1.3.1 ··· 综述
- 1.3.2 ··· 优缺点
- 1.4 ··· 同步复位 与 异步复位
- 1.5 ··· 异步复位、同步释放
- 1.5.1 ··· 总述
- 1.5.2 ··· 机理
- 1.5.3 ··· 复位网络
- 二、思考与补充
- 2.1 ··· 复位信号是否被需要
- 2.2 ··· 关于第一级触发器的数据端口
- 2.3 ··· 第二个dff是否存在亚稳态
- 2.4 ··· 异步复位去毛刺
- 2.5 ··· PLL配置后的复位设计
- 2.6 ··· 复位的消耗的资源比你想象的要多
- 参考文献
说明1:在查阅相关资料过程中,发现一些关于有趣的知识点,本文有尝试对其进行整合,力求详尽。
说明2:如果文章有误,欢迎大家指出、讨论,笔者也会积极改正,希望大家一起进步!
背景
笔者前一阵子在写Verilog代码时,关于rst_N信号,用的是如下片段。
input Clk;
input rst_N;
reg rst_N_d;
always @(posedge Clk or negedge rst_N) begin
if (!rst_N) begin
rst_N_d <= 1'b0;
end else begin
rst_N_d <= 1'b1;
end
end
// 将rst_N_d作为整个工程的复位信号,接到顶层模块下面的各个子模块中。
但是,实际将代码下载到开发板后,发现将输入信号rst_N反复置0、置1切换时,输出的效果相比于预期效果,不是很稳定,百思不得其解。随后,一个经验丰富的大佬告诉我,可以考虑异步复位、同步释放的方式来控制所有子模块的rst_N_d 信号,如下所示。
input Clk;
input rst_N;
reg rst_N_d1,rst_N_d2;
always @(posedge Clk or negedge rst_N)
if (!rst_N) begin
rst_N_d1 <= 1'b0;
rst_N_d2 <= 1'b0;
end else begin
rst_N_d1 <= 1'b1;
rst_N_d2 <= rst_N_d1;
end
// 将rst_N_d2作为整个工程的复位信号,接到顶层模块下面的各个子模块中。
改完后,发现代码下载到开发板后的效果比较不错,稳定了很多。
基于此,考虑到自身学FPGA是野路子,决定好好研究一下同步与释放,记作此文。
前言
-
复位的作用:
可以使代码或者是器件恢复到一个已知、确定的状态,如初始状态;
可以寄存器、计数器等内部的数据置为预设的值。 -
复位的目的:
1、通过控制复位信号,确保电路从已知的初始状态开始运行。
2、通过控制复位信号,使电路从某个错误状态回到已知状态。 -
在FPGA设计中,复位信号的同步与释放是确保系统稳定性和可靠性的关键。几种常见的复位信号,如下:
1、同步复位
2、异步复位
3、异步复位、同步释放 -
关于触发器,已在前文《7系列 之 存储单元(Storage Elements)》中有过介绍,诸位道友可点击链接进行传送。
-
本文所查看得RTL、Synthesis视图,是基于xc7a100tfgg676-2 (active)进行的。
一、复位信号的同步与释放
1.1 ··· 同步复位
1.1.1 ··· 综述
-
诸位道友经常提及的 同步复位 ,
即同步复位、同步释放,Synchronous Reset and Synchronous Release。 -
复位信号的复位、释放都是与时钟信号同步进行的,
这意味着,复位信号的变化只在特定的时钟边沿(通常是上升沿)发生。 -
Verilog代码,如下:
input Clk;
input rst_N;
reg rst_N_d;
always @(posedge Clk ) begin
if (!rst_N) begin
rst_N_d <= 1'b0;
end else begin
rst_N_d <= 1'b1;
end
end
- 其RTL视图为:
- 其综合后的电路为:
从RTL视图来看,同步复位的代码过程就是一次触发器过程。
而其综合的结果为,FDRE。
注:FDRE,为Xilinx的触发器的Primitive之一;功能描述为:同步使能、同步复位。
1.1.2 ··· 优缺点
-
优点:
1、复位、释放操作是在时钟边沿同步进行的,因此可以确保所有的寄存器和逻辑单元在同一个时钟周期内被正确地复位、释放,从而给了寄存器足够的时间来稳定状态来减少复位信号引起的亚稳态问题、避免了由于复位信号不同步导致的时序不确定性。
2、同步复位使得电路是同步的,可使静态时序分析更加简单,减少时序分析难度。 -
缺点:
1、采用同步复位,需要在数据输入端增加组合逻辑,消耗额外的逻辑资源;
2、同步复位比较依赖于时钟信号,且复位信号的脉冲宽度必须要大于一个时钟周期,才能确保同步复位。
3、如下图所示,博文《异步复位 & 同步释放》在同步复位的缺点中提及到:“一些三态总线的初始化过程中,要求最好异步复位。”。
4、当复位信号的撤销时间在建立时间和保持时间以内时,也会产生亚稳态。
1.2 ··· recovery time和removal time
信号的本身不稳定、或者信号采样时刻不确定,都可能会带来亚稳态。
在同步电路中,输入数据需要与时钟满足setup time和hold time才能进行数据的正常传输,防止亚稳态。同样的道理,对于一个异步复位寄存器来说,异步复位信号同样需要和时钟满足recovery time和removal time 才能有效进行复位操作和复位释放操作,防止输出亚稳态。(《异步复位和同步释放》)
- recovery time(恢复时间),指撤销复位状态时,在时钟有效沿来临之前,复位信号保持无效电平的最短时间,即复位释放与下一个时钟有效沿之间需要间隔的最小时间,类似于setup time。
- removal time(去除时间),指进入复位状态时,在时钟有效沿来临之后,复位信号保持有效电平的最短时间,即复位信号与上一个时钟有效沿之间需要间隔的最小时间,类似于hold time。
无论是复位信号的电平,
必须要满足recovery time和removal time这两个要求,否则可能会造成亚稳态。
另外,并不是复位信号撤销时才可能出现亚稳态,复位信号一开始出现时,同样可能会存在亚稳态,只不过异步复位信号持续时间长,即使第一个周期出现了亚稳态(即第一个周期复位未成功),下一个时钟周期也不会再出现亚稳态了。如果复位信号的变化只持续刚刚一个时钟周期,那么复位信号开始和撤销时都可能会出现亚稳态。(《异步复位,同步释放》)
1.3 ··· 异步复位
- 诸位道友所经常提及的 异步复位 ,
即,异步复位、异步释放,Asynchronous Reset and Asynchronous Release。
复位信号,不随着系统时钟的边沿触发起作用,而是可独立于时钟信号起作用。
1.3.1 ··· 综述
- Verilog代码,如下:
input Clk;
input rst_N;
reg rst_N_d;
always @(posedge Clk or negedge rst_N) begin
if (!rst_N) begin
rst_N_d <= 1'b0;
end else begin
rst_N_d <= 1'b1;
end
end
-
其RTL视图为:
相比于同步复位,拥有异步复位的寄存器在设计过程中就多了一个引脚(复位引脚)。 -
其综合后的电路为:
而其综合的结果为,FDCE。
注:FDCE,为Xilinx的触发器的Primitive之一;功能描述为:同步使能、异步复位。
1.3.2 ··· 优缺点
-
优点:
1、大多数的触发器都有异步复位端口,能保证数据路径上是干净的,不用消耗额外的逻辑资源。
2、复位信号不依赖于时钟,不管有没有时钟信号,复位信号都能使电路复位。 -
缺点:
1、当异步复位信号的撤销时间在Trecovery(恢复时间)和Tremoval(移除时间)之间时,输出结果就会出现亚稳态,造成复位失败。
recovery time和removal time都是检查异步信号(reset或preset或set)的释放沿,释放沿必须在时钟沿前面提前recovery time释放,或者在时钟沿后removal time之后释放。由于异步复位信号与时钟无必然联系,两者都是独立的,所以复位信号的释放将有一定的概率导致电路出现亚稳态。(《异步复位同步释放》)
2、系统所产生的的噪声或毛刺会引发伪复位,需要设计过滤器来消除复位电路上毛刺的影响。
3、异步复位需要确保满足时序要求。(补充:“复位信号和时钟信号一样,都是大扇出,所以无论同步或异步,在后端版图设计时需要分析复位树的时序确保满足时序要求。尽管存在复位 buffer tree,但最好要对复位信号少做逻辑。”(《异步复位,同步释放》))
1.4 ··· 同步复位 与 异步复位
只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。(《异步复位同步释放—关于复位的问题》)
ADD:
对于xilinx 7系列的FPGA而言,flip-flop支持高有效的异步复/置位和同步复位/置位。对普通逻辑设计,同步复位和异步复位没有区别,当然由于器件内部信号均为高有效,因此推荐使用高有效的控制信号,最好使用高有效的同步复位。输入复位信号的低有效在顶层放置反相器可以被吸收到IOB中。(《xilinx FPGA复位浅析》)
经过上述分析,同步复位和异步复位都有优缺点,那么是否能将连着结合、取长补短呢?
1.5 ··· 异步复位、同步释放
-
其实,阅读到这里,
不难看出异步复位、同步释放是同步释放和异步复位相结合的产物,
而不是同步异步与复位释放两两相组合的结果。 -
异步复位、同步释放,即
复位信号的复位状态有效时不受时钟信号的同步控制,
而在复位信号释放时(复位状态无效时)受到时钟信号的同步控制。 -
异步复位、同步释放的目的是在于:防止复位信号释放时产生亚稳态,且节省逻辑资源。
1.5.1 ··· 总述
- Verilog代码,如下:
input Clk;
input rst_N;
reg rst_N_d1,rst_N_d2;
always @(posedge Clk or negedge rst_N)
if (!rst_N) begin
rst_N_d1 <= 1'b0;
rst_N_d2 <= 1'b0;
end else begin
rst_N_d1 <= 1'b1;
rst_N_d2 <= rst_N_d1;
end
- 其RTL视图为:
- 其综合后的电路为:
1.5.2 ··· 机理
-
异步复位:当复位信号拉低时,rst_N拉低,直接进入复位状态。
-
同步释放:当复位信号释放时,由于加入了两级同步缓存器,复位状态不会立即释放,而是等到同步时钟的有效沿时再进行释放;且,rst_N的释放信号不会随着rst_N的撤销而撤销。
-
同步释放的具体过程,如下:
1 第一个有效时钟沿到来时:当异步复位信号rst_N释放时,用来同步的第二级寄存器 rst_N_d2 的数据仍然是0,因此第二级寄存器 rst_N_d2 是不会出现亚稳态的。即便第一级寄存器 rst_N_d1 可能会出现亚稳态,但这个亚稳态并不是直接经过第二级寄存器 rst_N_d2 进行输出 ,需要等待下一个时钟有效沿的到来,相当于被打了节拍。
2 第二个有效时钟沿到来时:当第一级寄存器 rst_N_d1 上一个时刻的这个亚稳态经过第二级寄存器时,基本已经稳定下来了;即便稳定下来不为无效电平,那也就相当于复位信号的有效电平多持续了一个周期。因此我们可以看出,使用异步复位同步释放时,异步复位撤销后需要额外等待一个时钟周期。
简单理解:第2级DFF释放信号与时钟clk边沿同步,所以释放信号在clk上升沿后需经过Tco(Tsu+thd)才能到达下一级DFF的复位端口,所以可以满足下一级DFF的recovery time和removal time,从而不会出现亚稳态。(《异步复位同步释放》)
- 思考:
1、第一级触发器的输出,存在亚稳态的可能,这是毋庸置疑的,而且第一级触发器输出的亚稳状态是在逐渐衰减的,且可以持续一个时钟周期;正常情况下,第二级触发器的输出是非亚稳态。但是,如果在第二级触发器的采样时保持时间不够长,且这时第一级触发器的输出依旧处于亚稳态,那么,第二级触发器的输出也会是亚稳态的。不过,这属于小概率事件。
2、在目前的同步化设计中,用两级触发器进行同步可以消除绝大部分可能的亚稳态了。那么,是不是三级同步操作,会使输出的复位信号更加稳定呢;当然,这样会多消耗一个触发器。
3、《2级同步引发的思考》,关于两级触发器的思考,可以深入了解下。
既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。(《异步复位同步释放—关于复位的问题》)
不同的复位方式有各自的优缺点。但是在工程中,一般都用异步复位的方法,最好是异步复位同步释放的方法。(《异步复位,同步释放》)
1.5.3 ··· 复位网络
《异步复位 & 同步释放》提及到了复位分发技术,用两级触发器对复位信号打了两次节拍,这也算是异步复位、同步释放的应用了。
二、思考与补充
逛博客的时候,看到了一些有趣的问题与思考,截图放在文中了,供诸位道友参考学习。
也可以直接到 参考文献 这一章节,直接点击文章名称进行转跳。
2.1 ··· 复位信号是否被需要
实际上,在写Verilog代码时,写了过多的复位信号反而会对Fmax产生限制。
笔者感觉《同步复位和异步复位》这篇博客的这段解释,如下图所示,似乎更为细致。
同时,在一博客下面有看到对Xilinx官方文档《UltraFast Design Methodology Guide for FPGAs and SoCs (UG949)》的描述:
2.2 ··· 关于第一级触发器的数据端口
2.3 ··· 第二个dff是否存在亚稳态
《异步复位,同步释放的理解》,通过引用文献,对复位同步器得第二个dff是否存在亚稳态进行了解答,如下图所示。这也算是对本文章节《2.2.2 ··· 机理》中思考的一个解答吧。
2.4 ··· 异步复位去毛刺
《同步复位和异步复位》,这篇博客也有提到这么一个操作,截图给诸位道友看一下。
2.5 ··· PLL配置后的复位设计
文章《异步复位同步释放(Synchronized Asynchronous Reset)》中,提到了一种PLL配置后的复位设计,感觉有点眼熟,截个图放下面,供诸位道友观摩、讨论。
文字描述如下:
代码综合后的RTL如下:
2.6 ··· 复位的消耗的资源比你想象的要多
以下截图出自博客《你真的会Xilinx FPGA的复位吗?》。
嗯,这部分实际上和前文中的 “复位信号是否被需要 ”这部分倒是挺相似的,道友们可以多留意下。
参考文献
1、《异步复位和同步释放》
2、《异步复位,同步释放》
3、《异步复位同步释放—关于复位的问题》
4、《异步复位 & 同步释放》
5、《异步复位,同步释放的理解》,这篇不错,安利一波。
6、《异步复位同步释放原理》
7、《同步复位和异步复位》
8、《异步复位同步释放》
9、《同步复位和异步复位》,这篇也不错。
10、《2级同步引发的思考》
11、《异步复位同步释放(Synchronized Asynchronous Reset)》
12、《xilinx FPGA复位浅析》
13、《你真的会Xilinx FPGA的复位吗?》,这篇也很不错。
14、《How do I reset my FPGA?》(笔者对这篇文章进行了翻译,《翻译:How do I reset my FPGA?》)
15、《RTL设计- 多时钟域按顺序复位释放》