建立时间和保持时间的理解、相关计算及在FPGA设计中的应用

学数字电路设计或者面试相关岗位的时候,都需要理解掌握建立时间和保持时间的概念,而这个东西我觉得还挺绕的,看的时候都明白,转过身就忘了,每次要用的时候又到处找资料,理解半天,非常的浪费时间,所以这里用我个人比较容易理解的思路写个总结,加深记忆,也方便以后回顾。以下分析都是基于我自己的理解,仅供参考,如有错误的地方还请不吝指出。

1. 分析模型

理解建立时间保持时间需要一个模型,如图所示。起点是源触发器D1的采样时刻,终点是目的触发器D2的采样时刻,假设起点已经满足了建立时间和保持时间要求,现在分析终点采样时刻是否同样满足要求。


用到的参数:
Tco: 数据正确采样后从D端到达Q端的延时,触发器固有属性,不可改变
TDelay: D1输出端到D2输入端的组合逻辑延时和布线延时
Tsu: 触发器的建立时间,触发器固有属性,不可改变
Th: 触发器的保持时间,触发器固有属性,不可改变
Tclk: 时钟周期
t1: 假设源时钟为clka,clka到达D1的延时
t2: 同t1,是clka到达D2的延时

触发器的行为:
时钟沿到来时采样数据D,将采到的数据寄存下来,并输出到Q端,所以如果没有新的时钟沿到来,则Q端输出的一直是上次采样的数据,每来一个时钟沿,采样一次数据D。

假设clk传输没有延时:
先假设clk的传输没有任何延时,则每一个时钟上升沿都会同时到达D1和D2。

时间起点,第一个时钟沿D1的采样时刻,时间终点,第二个时钟沿D2的采样时刻。
物理起点,D1的输入端,物理终点,D2的输入端。

建立时间满足(关注数据头):
第一个时钟沿到来时,数据data的头部从起点①开始传输,经过Tco到达②,在经过TDelay到达③。根据建立时间的要求,数据在时钟沿到来之前需要保持稳定的最小时间为Tsu,假设这里刚好满足建立时间的要求,数据data到达③后经过Tsu的时间到达了④。计时是从第一个时钟沿开始的,采样在第二个时钟沿,采样的时候data在位置④,则有

Tco+TDelay+Tsu=Tclk T c o + T D e l a y + T s u = T c l k

如果不是最极限的情况,则第二个时钟沿到达③时,data的头部已经超过④,假设超过④的时间为t,则有
Tco+TDelay+Tsu+t=Tclk,t0 T c o + T D e l a y + T s u + t = T c l k , t ≥ 0

即有
Tco+TDelay+TsuTclk T c o + T D e l a y + T s u ≤ T c l k

如果这条路径是关键路径(Delay最长),那么系统能跑到的最大频率为
Fmax=1min(Tclk)=1Tco+TDelay+Tsu F m a x = 1 m i n ( T c l k ) = 1 T c o + T D e l a y + T s u

保持时间满足(关注数据尾):
第二个时钟沿到来时,D2采集数据data,同时D1在采集数据new data,所以data的尾部在第二个时钟沿到来时开始从D1的输入端①开始向前传输,经过Tco和TDelay后到达D2的输入端③,所以第二个时钟沿到来之后data稳定的时间为

Tco+TDelay T c o + T D e l a y

根据保持时间的定义,有
Tco+TDelayTh T c o + T D e l a y ≥ T h

加上CLK的传输时延:
事实上Clock的传输也是有延时的,如图所示,两个触发器的源时钟为clka,到达D1需要t1的时间,到达D2需要t2的时间, t2t1 t 2 − t 1 其实就是我们常说的clock skew(时钟偏斜),就是同一个时钟沿达到D1和D2的时延差别,如果D1和D2离的很远,那么相应的clock skew就会更大。

建立时间:
加上clk传输时延后,变了的是第二个时钟沿到达D2的时间,从 Tclk T c l k 变为 Tclk+t2t1 T c l k + t 2 − t 1 ,所以有

Tco+TDelay+TsuTclk+t2t1 T c o + T D e l a y + T s u ≤ T c l k + t 2 − t 1

因为t2大于t1,所以对左边时间的限制其实是放宽了
保持时间:
与建立时间相反,因为第二个时钟沿晚来的原因,实际上对保持时间的要求更严格了
Tco+TDelay(t2t1)Th T c o + T D e l a y − ( t 2 − t 1 ) ≥ T h

从上面的分析可以看到,数据跑得越快(TDelay越小),时钟传输时延越大(clock skew越大)对建立时间的满足越有利,而对保持时间的满足越不利,相反则对满足保持时间越有利,对满足建立时间越不利。建立时间还跟时钟周期有关系,时钟周期越小,越容易发生建立时间违例,而保持时间则跟时钟周期没有关系。在设计中,我们常常关注的是建立时间是否满足要求,因为它关系到我们能使用的最小时钟周期有多小,能否跑到预定的工作频率,而因为时钟通常都是走专门的快速线路,很难存在时钟传输时延过大的问题,所以一般也不会出现保持时间违例的情况。

2. 在FPGA设计中的应用

这里只针对建立时间,不针对在座的各位。再来看一下满足建立时间要求的公式

Tco+TDelay+TsuTclk+t2t1 T c o + T D e l a y + T s u ≤ T c l k + t 2 − t 1

Tco和Tsu是芯片固有的,Tclk是设计需要的,都不能改动, t2t1 t 2 − t 1 跟两个寄存器之间的距离有关系,本质上跟TDelay也存在一定的联系,时序约束中也会对clock skew进行约束,但是如果出现建立时间违例是否可以动 t2t1 t 2 − t 1 我也不太清楚,我觉得至少优先级不会太高,而且效果也不会太好。所以我们能动的只有TDelay,TDelay由组合逻辑延时(Tcomb)和布线延时(Tpd,path delay)组成
TDelay=Tcomb+Tpd T D e l a y = T c o m b + T p d

减小TDelay即减小Tcomb和Tpd。
减小Tcomb可以通过拆分组合逻辑实现,也即在组合逻辑中插入寄存器,就是我们常说的流水线技术,这样做的坏处是会增加数据输出的时钟周期个数,每插入一个寄存器,数据就会延时一个Tclk,但是好在不会影响吞吐量,所以这是最建议的办法。

插入寄存器改善时序的原理:
比如我们在D1和D2之间的组合逻辑中插入一个寄存器D3,则时序分析的路径就变成了D1到D3和D3到D2两条,只要最差的那一条也满足建立时间的要求就可以了,因为将TDelay拆成了两个,所以即使是两条中最差的那条,时序肯定也比D1到D2好很多。一个简单的插入寄存器的例子如下

always @ (posedge clk) 
    a <= b1 + b2 + b3 + b4;

改为

always @ (posedge clk) begin
    a1 <= b1 + b2;
    a2 <= b3 + b4;
    a  <= a1 + a2;
end

本来组合逻辑是 b1+b2+b3+b4 b 1 + b 2 + b 3 + b 4 的,现在被拆成了三个,数据会延时一拍输出

b1 + b2
b3 + b4
a1 + a2

减小Tpd可以通过对关键路径的时序进行约束,或者位置约束来实现,这里我经验不多,就不展开了。

对于建立时间违例的解决办法按优先级有:
1. 首先是修改代码,找到关键路径上的源寄存器和目的寄存器,拆分它们之间的组合逻辑。插入寄存器是最简单粗暴的办法,实际上在设计之初,如果我们精心设计的话,是可以在算法级对组合逻辑进行分解的,好的时序是设计出来的,不是约束出来的;
2. 如果修改代码实在解决不了,在使用约束关键路径的办法;
3. 应该还有其他很多办法,不过我暂时还不知道;
如果上面都解决不了,我们还可以:
4. 买更好更快的芯片,更好的芯片意味着更低的Tsu要求,更小的Tpd、Tcomb;
5. 降低工作频率,即提高时钟周期。
总的来说,都是在跟那个公式打交道。

.
.
.
.

另:

上面的分析模型是用Visio画的,新建电路和逻辑电路模板,然后就可以开始画了…触发器默认是RS触发器,可以右键配置成D触发器。

.

.

.

  • 35
    点赞
  • 228
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值