引言
本文主要是提供了 ASIC 设计中关于复位技术相关的概念和设计。
一、同步复位 Sync
当时钟上升沿检测到复位信号时,执行复位操作(有效的时钟沿是前提)。
always @( posedge clk )begin
if(!rst_n)
b <= 0;
else
b <= a;
end
同步复位的 RTL 电路图
优点
缺点
- 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务,同时还要考虑诸如 Clock Skew、组合逻辑路径延时、复位延时等因素;
- 由于大多数的逻辑器件的目标库内的 DFF 都只有异步复位 SR 端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口上插入组合逻辑,这样就会一方面额外增加 FPGA 内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。
二、异步复位 ASync
无论时钟上升沿是否到来,只要复位信号有效,就执行复位操作。
always @( posedge clk or negedge rst_n )begin
if(!rst_n)
b <= 0;
else
b <= a;
end
异步复位的 RTL 电路图
优点
- 大多数目标器件库的 DFF 都有异步复位 SR 端口,直接使用的话,就不需要额外的组合逻辑,从而节省资源;
- 设计相对简单;
- 异步复位信号识别方便(电路在任何情况下都能复位而不管是否有时钟出现)。
缺点
- 最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态(此时 clk 检测到的 rst_n 的状态就会是一个亚稳态,即是 0 是 1 是不确定的),从而导致复位的失败;
- 可能因为噪声或者毛刺造成虚假复位信号(比如以前的游戏机玩到一半突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题);
- 静态时序分析比较困难;
- 对于 DFT 设计,如果复位信号不是直接来自于 I/O 引脚,在 DFT 扫描和测试时,复位信号必须被禁止,所以还要消耗额外的同步电路。
三、异步复位、同步释放
推荐异步复位、同步释放的方式,并且复位信号为低电平有效:异步复位、同步释放指的是复位信号的到来与撤除都与 clk 无关,但是复位信号的撤除是在下一个 clk 到来之后才执行,也就是复位信号 rst_sync_n 由高到低时实现异步复位。电路的目的是防止复位信号的撤除时可能产生的亚稳态。
珍贵的手绘图
对于同步释放,这个是关键,即当复位信号 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 来之后,才随着变为高电平,即同步释放。
always @(posedge clk or negedge rst_n)begin
if(!rst_n)
rst_r <= 2'b00;
else
rst_r <= {rst_r[0],1'b1};
end
assign sys_rst_n = rst_r[1];
always @(posedge clk or negedge sys_rst_n)begin
if(!sys_rst_n)
b <= 1'b0;
else
b <= a;
end
异步复位、同步释放的 RTL 电路图
-
asic
+关注
关注
34文章
1199浏览量
120429 -
时钟
+关注
关注
10文章
1733浏览量
131446 -
SYNC
+关注
关注
1文章
15浏览量
11443 -
同步复位
+关注
关注
0文章
27浏览量
10711 -
异步复位
+关注
关注
0文章
47浏览量
13311
发布评论请先 登录
相关推荐
评论