为什么会有建立时间和保持时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么会有建立时间和保持时间相关的知识,希望对你有一定的参考价值。
何为建立时间(Setup Time)和保持时间(HoldTime)?以D触发器为例,在作为接收端时;由于工艺、寄生参数、触发器结构等原因决定,被采样数据必需有一个稳定区 间,保证数据可以正确的被触发器采样。通常我们把这个要求的稳定区间称为 Setup-Hold window。我们把 Setup-Hold window 和时钟沿对应起来,把Setup-Hold window 分解为两部分,建立时间(Setup Time)和保持时间(Hold Time)。
我们先来对他有一个直观的描述:
在触发器的时钟沿到来前,输入数据必须保持在一个稳定状态的最小时间;称为建立时间(setuptime)。
在触发器的时钟沿到达后,输入数据需要继续保持在原状态的最小时间,称为保持时间(holdtime)。
建立保持时间的初步推导
在这里我们从触发器的内部结构来分析建立保持时间
上 图是一个由6个与非门构成的维持阻塞结构的D触发器,每个与非门有门延时tpd;其中/SD 和/RD是异步置0置1端;当/SD 和/RD为0、1(或1、0)时,触发器被直接置1(或置0),只有当/SD 和/RD同时为1时,CLK和D的变化才起作用。各端的逻辑关系如下
G1=(/SD&SD‘&G2) ////Q=/SD & SD‘ & /Q
G2=(/RD&RD‘&G1) ////Q=/RD & RD‘ & Q
RD‘=(SD‘&CP&a) ////RD‘ = SD‘ & CP & a
SD‘=(/RD&CP&b) ////SD‘ = /RD & CP & b
b=(/SD&SD‘&a) ////b = /SD & SD‘ & a
a=(D&/RD&RD‘) //// a = /RD & RD‘ & D
分析电路逻辑功能时可以假定/SD 和/RD同时为1,即可暂时把/SD 和/RD相关的门的连线去掉,如下图:
Q=SD‘ & /Q
/Q=& RD‘ & Q
RD‘ = CP & a // RD‘=0锁住G6,一个 & 门延迟,RD‘更新
SD‘ = CP & b //SD‘=0锁住G4 G5,一个 & 门延迟,SD‘更新
b = SD‘ & a //两个 & 门延迟2ptd,b的值更新
a = RD‘ & D //一个 & 门延迟tpd,a的值更新
结合上图触发器结构,我们看出,若要使时钟到来前数据a、b都稳定,从D到a经过1个与非门,到b经过2个与非门;所以必须使D在CLK上升沿到来之前至少提前2个tpd输入才能保证数据稳定;
时钟到来之后,要经过1个tpd,使RD’和SD’输出;当RD’=0时,锁住与非门G6;SD=0时,锁住G4和G5;使D的变化不再影响到下一级;
通过上面的推导结合建立保持时间的定义,我们可以得出该D触发器的建立时间为2*tpd;保持时间为tpd;
详细验证:
上面只是一个初步推论,不满足这个时间会不会又有怎样的现象?是否和我们取得的定义符合?为了支撑该推论我们还需要做些验证:当D与CLK的建立保持时间满足上述条件的情形和不满足上述条件情形都会出现什么状况;
我们列出在D输入为0时,
1. 比clk上升沿提前稳定2*tpd,并在clk上升沿到来后保持1*tpd;
2. 比clk上升沿提前稳定1*tpd,并在clk上升沿到来后保持1*tpd;
3. 比clk上升沿提前稳定2*tpd,并在clk上升沿到来不保持;
三种情形,看会对输出造成什么影响
以下为上述三个条件下的真值表;相邻两栏之间间隔一个tpd;Z表示无效状态,tpd=0时,Q 和/Q已被赋予一个初始状态;
D输入为0,比clk上升沿提前稳定2*tpd,并在clk上升沿到来后保持1*tpd
Tpd |
D |
a |
b |
CLK |
SD‘ |
RD’ |
Q |
/Q |
备注 |
0 |
Z |
Z |
Z |
0 |
1 |
1 |
1 |
0 |
无数据输入时高阻态,Q被异步置0后释放 |
1 |
0 |
Z |
Z |
0 |
1 |
1 |
1 |
0 |
有效数据开始输入 |
2 |
0 |
1 |
Z |
0 |
1 |
1 |
1 |
0 |
|
3 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
数据稳定(a和b) |
4 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
稳定后时钟沿到来 |
5 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
RD’锁定G6输出1状态,此处开始输入D变化不对输出造成影响 |
6 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
|
7 |
X |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
此值由SD‘&RD‘经过tpd后输出,当CLK为低时,数据保持,直到下一个时钟到来 |
D输入为0,比clk上升沿提前稳定1*tpd,并在clk上升沿到来后保持1*tpd
Tpd |
D |
a |
b |
CLK |
SD‘ |
RD’ |
Q |
/Q |
备注 |
0 |
Z |
Z |
Z |
0 |
1 |
1 |
1 |
0 |
无数据输入时高阻态,Q被异步置0后释放 |
1 |
0 |
Z |
Z |
0 |
1 |
1 |
1 |
0 |
有效数据开始输入 |
2 |
1 |
1 |
Z |
0 |
1 |
1 |
1 |
0 |
D在1个tpd后跳变(不满足建立时间) |
3 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
时钟来临 |
4 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
稳定后时钟沿到来 |
5 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
输出错误,且不能锁住G6,会有空翻转,数据无法保持,状态不定 |
6 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
|
7 |
X |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
此值由SD‘&RD‘经过tpd后输出,当CLK为低时,数据保持,直到下一个时钟到来 |
D输入为0,比clk上升沿提前稳定2*tpd,并在clk上升沿到来不保持
tpd |
D |
a |
b |
CLK |
SD‘ |
RD’ |
Q |
/Q |
备注 |
0 |
Z |
Z |
Z |
0 |
1 |
1 |
1 |
0 |
无数据输入时高阻态,Q被异步置0后释放 |
1 |
0 |
Z |
Z |
0 |
1 |
1 |
1 |
0 |
有效数据开始输入 |
2 |
0 |
以上是关于为什么会有建立时间和保持时间的主要内容,如果未能解决你的问题,请参考以下文章
回到之前的片段(如 ListView)后,我可以保持 ScrollView 的位置吗?
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段