前言
建立时间
:是指在触发器的时钟信号上升沿到来之前,数据稳定不变的时间。
保持时间
:是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间。
建立时间和保持时间是由器件决定的。 具体可以参考:
为什么会有建立时间和保持时间
注意:对于这个问题,在实际应用中,由于触发器的延时是固定的,所以更多时候改变的是组合逻辑的延时,以使整个系统满足时序要求。
t
p
d
t_{pd}
tpd 也叫传播延时,是指触发器输出的响应时间,也就是触发器的输出在clk
时钟上升沿到来之后多长的时间内发生变化并且稳定,也可以理解为触发器的输出延时。
t
c
o
m
b
t_{comb}
tcomb 是组合逻辑延时,即触发器的输出经过组合逻辑所需要的时间。
建立时间容限:相当于保护时间,这里要求建立时间容县大于等于 0。
保持时间容限:保持时间容限也要求大于等于0。
允许的最短时钟周期,也就是最高的时钟频率情况下(满足触发器D2
的建立时间)
需要在最短的时钟周期内满足时序,也就是在一个时钟周期内满足时序。由上图可以知道:
建立时间容限
=
T
c
l
k
−
T
p
d
1
(
m
a
x
)
−
T
c
o
m
b
(
m
a
x
)
−
T
s
e
t
u
p
2
建立时间容限 = T_{clk} - T_{pd1(max)}-T_{comb(max)}-T_{setup2}
建立时间容限=Tclk−Tpd1(max)−Tcomb(max)−Tsetup2
由于建立时间容限大于等于0,所以可以得到:
T
c
l
k
≥
T
p
d
1
(
m
a
x
)
+
T
c
o
m
b
(
m
a
x
)
+
T
s
e
t
u
p
2
T_{clk} \ge T_{pd1(max)}+T_{comb(max)}+T_{setup2}
Tclk≥Tpd1(max)+Tcomb(max)+Tsetup2
所以建立时间决定了该系统的最短时钟周期(最大时钟频率)。
由此可以得到触发器D2
的
T
s
e
t
u
p
2
T_{setup2}
Tsetup2 应该满足以下条件:
T
s
e
t
u
p
2
≤
T
c
l
k
−
T
p
d
1
(
m
a
x
)
−
T
c
o
m
b
(
m
a
x
)
T_{setup2} \le T_{clk} - T_{pd1(max)}-T_{comb(max)}
Tsetup2≤Tclk−Tpd1(max)−Tcomb(max)
组合逻辑的最大延时
应该满足:
T
c
o
m
b
(
m
a
x
)
≤
T
c
l
k
−
T
p
d
1
(
m
a
x
)
−
T
s
e
t
u
p
2
T_{comb(max)} \le T_{clk} - T_{pd1(max)}-T_{setup2}
Tcomb(max)≤Tclk−Tpd1(max)−Tsetup2
所以建立时间决定了该系统的组合逻辑的最大延迟。
避免信号竞争的情况下(满足触发器D2
的的保持时间)
触发器D1
的输出必须要保持一定的时间(这个一定的时间+组合逻辑的延时必须要满足触发器D2
的的保持时间),才能让触发器D2
的输出信号正确,不产生竞争。
当前时刻的输出(即触发器D2
的输入)必须要保证不会影响到前一个时钟的触发器D2
的输出,也就是说触发器D2
的输出需要一定的保持时间才能稳定输出,但是在不满足保持时间的情况下触发器D2
的输入被改变了,导致后面的输出就会出现竞争导致错误。
通俗来讲就是:在触发器D2
的输入信号还处在保持时间的时候,如果触发器D1
的输出已经通过组合逻辑到达D2
的输入端的话,将会破坏D2
本来应该保持的数据。
由上图可得出,极限情况:
保持时间容限
+
t
h
o
l
d
2
=
t
p
d
1
(
m
i
n
)
+
t
c
o
m
b
(
m
i
n
)
保持时间容限 + t_{hold2} = t_{pd1(min)}+ t_{comb(min)}
保持时间容限+thold2=tpd1(min)+tcomb(min)
由于保持时间容限大于等于0,所以触发器D2
的t_{hold2}
应该满足:
t
h
o
l
d
2
≤
t
p
d
1
(
m
i
n
)
+
t
c
o
m
b
(
m
i
n
)
t_{hold2} \le t_{pd1(min)}+ t_{comb(min)}
thold2≤tpd1(min)+tcomb(min)
可以得到组合逻辑的最小延时
应该满足:
t
c
o
m
b
(
m
i
n
)
≥
t
p
d
1
(
m
i
n
)
−
t
h
o
l
d
2
t_{comb(min)} \ge t_{pd1(min)} -t_{hold2}
tcomb(min)≥tpd1(min)−thold2
所以建立时间决定了该系统的组合逻辑的最小延迟。
跨时钟域(CDC
)问题
亚稳态
1、概念
亚稳态是由于电路的边沿触发导致输出在高电平和低电平之间震荡的一种现象,原因就是建立时间或者保持时间不满足。当用时钟对变化的数据信号进行采样时,事件的顺序决定了结果。事件之间的时间差越小,确定哪个先发生的时间就越长。当两个事件非常接近地发生时,决定过程可能需要比分配的时间更长的时间,并且会发生同步失败。
2、引起亚稳态的原因
(1)对变化的数据信号进行采样
(2)在数据跳变期间进行采样,建立或者保持时间不满足
- 跨时钟域的信号和同步时钟之间的关系不能确定
- 单一时钟域内EDA工具确保建立保持时间,不会出现亚稳态
3、如何减少亚稳态的风险
单一时钟域内信号------EDA工具检查每个触发器的建立保持时间,确保其不出现亚稳态
跨时钟域的信号---------没有EDA工具可以保证其可靠性;静态时序分析其应该设置false path约束;只能靠逻辑设计来保证:同步化技术。
4、同步化技术
根据跨时钟域信号的特点来选择同步化方法:
(1)同步器----针对控制信号
(2)保持寄存器和握手-----地址或数据总线信号
(3)异步FIFO设计----------数据总线信号
同步器(也就是使用two-stage of flip-flop)
1、同步器就是使用一个两级的触发器接在原来的输出后面,从而用一定时间的延时获得更可靠的输出
2、同步器的分类
(1)电平同步器—适用于clk1和clk2频率差不多的情况下
电平同步器会由于clk1和clk2频率不同造成数据的丢失或者重复的采样
(2)边沿检测同步器-----慢时钟域到快时钟域
把数据的变化转换一个脉冲,去除重复采样。
(3)脉冲同步器------快时钟到慢时钟域
3、同步器设计推荐的做法
同步器单独成模块,引入两个独立时钟。
其他模块都设计为单一时钟模块,完全同步模块
以时钟域作为信号命名的前缀
静态时序分析的时候,对同步器模块异步输入信号的设定false path:用通配符
3、使用同步器需要注意的问题
(1)原时钟域的寄存器和新时钟域的两个寄存器之间都不能有组合逻辑
(2)快时钟域到慢时钟域
(3)多位控制信号跨时钟域
最简单的方法是将多路控制信号合并成一路,传输到另一个时钟域后再分开。如下图所示
(4)总线信号跨时钟域(一般是多位的数据,不可能和多位控制信号那样合成一路)
直接使用同步器会带来问题。一般用的方法:保持寄存器加握手信号、异步FIFO设计(这两种方法都要使用同步器)。
- 保持寄存器和握手
效率比较低,因为数据需要一拍一拍地发,而且还需要每拍还有握手开销,造成了延时。 - FIFO
同步FIFO:写时钟和读时钟为同一个时钟
异步FIFO:写时钟和读时钟为独立时钟,用来匹配不同时钟域的读写速度。
跨时钟域的数据信号需要用到异步FIFO,隔离时钟域,匹配读写速度。
FIFO重点:写满和读空标志的产生
读写指针的相对位置的比较产生:
(1)同步FIFO直接把读写时钟比较或运算产生
(2)异步FIFO由于读写指针不同时钟域,比较前指针必须同步化
(3)由于二进制的指针会出现多位同时跳变,直接由同步器进行同步优化会有问题,所以一般用格雷码(任意两个相邻数之间转换是,只有一位发生变化)。
===================== 分割线===================================
跨时钟域问题就是两个使用不同时钟信号控制的模块间的信号进行通信传输的问题。按照传输信号的位数可以将跨时钟域问题分为单bit
和多bit
问题。
(1) 单bit问题(一般是控制信号):打两拍或者握手信号
(2) 多bit问题(一般是数据信号):使用FIFO
同时按照两个不同模块的时钟的快慢顺序可以分为从快时钟域到慢时钟域的传输
,或从慢时钟域到快时钟域
的传输。所以总共可以分为四种情况。
慢时钟采集快时钟、单bit传输----------打两拍
打两拍就是增加一个两级触发器,同时该触发器由快时钟
进行驱动。
慢采快可能会出现data1信号不能满足F2所需的建立时间和保持时间从而使得触发器处在亚稳态状态。可以采用打两拍的方法来缓解这种现象。可以用平均故障间隔时间 (MTBF, Mean Time Between Failure)
来衡量两次错误发生的间隔时间(越大越好),易知:
M
T
B
F
∝
1
F
MTBF \propto \frac{1}{F}
MTBF∝F1
注意:打两拍(多加一级触发器)只是加长MTBF
,但是并不能完全解决掉亚稳态问题。
在实际应用中,如果clk1
和clk2
的频率相差比较大的时候,可能后面的data2
和data3
会重复的采集到data1
的高电平或者低电平,所以为了避免重复采集的情况发生,一般的解决方案是通过采集data1
的边沿来将数据同步到F2
的时钟域中。