建立时间、保持时间、建立余量、保持余量的理解

分析说明:D2:目的寄存器;D1:源寄存器; edge2:下一个时钟上升沿;edge1:当前时钟上升沿;edge0:当前时钟上升沿的前一个时钟沿;如下图:

建立时间:触发器D2(数据要到达目的的地方)在时钟上升沿edge1(以edge1是当前的时钟上升沿)输入端的数据data1(data1是edge0时D1打给D1的数据,或者说是edge0时刻D1的输出。edge0是edge1的前一个上升沿)的前一段时间t_setup要求data1数据稳定(为什么要这样要求呢?)。很明显建立时间是对D2的输入数据的时间要求,或者说data1要在edge1来之前的某段时间内到达D2。

1、为什么要求建立时间呢?

为了使数据正确的锁存就需要数据是稳定的,如果知道触发器的实现电路的话。如果在edge1-t_setup到edge1这段时间有可能变动的话,就会造成不知道锁存的是1还是0,这就是所说的亚稳态情况之一。这样是不能使数据可靠传输的。所以需要建立时间。

2、数据data1(来自触发器D1,即数据源)要传输到D2的输入端,这个数据data1到达D2时间t12如何计算呢?

在edge0来的时候之后的某个很小的时间t1(可以认为是触发器的传播延时),开始由D1出发,经过组合逻辑延时t2,到达D2(数据的目的地)。答案已经知道t12= t1 + t2。(一定要注意当前时刻是edge1,对于t12的分析是以edge0作为参考时钟。为什么要这样呢?看3小点。)此时时钟到达D2,D1的差没有考虑,即时钟抖动。还有t2一般都是给最大延时,最小延时即t2max, t2min。具体用哪个看???等等说。。。。

3、在当前时刻edge1的D2 data1建立时间的时候,那data1的数据在什么时候由D1输出呢?

再次强调建立时间是分析D2输入端的数据时间要求。此时刻即edge1,D2输入端的数据在哪个时刻由D1发出呢(假设在同步系统中,为什么要做这个假设呢?)?肯定是在某个edge,或者说是……edge2,edge1,还是edge0,edge(-1),………。如果说在edge1的时候才开始发出??想想。。。。这是不可能满足建立时间的!推推看:假设edge1能够满足建立时间。要求是什么呢?要求clk 的edge1到D2要远远慢于D1在这里是多少:t12 + t_setup。这样所有的edge到达目的寄存器要至少慢于t(t组合逻辑的延时)+t_setup。这样的同步系统我不知道如何实现。如果是在edge2,edge3,……时刻才发出data1,要满足建立时间是不是更不可能实现?    如果在edge0就开始了数据的传输,会有什么样的结果呢?很明显此时的数据data1有一个clk的时间来传输,因为提前一个clk D1就将data1发出,只要data1能在edge1 - t_setup的时刻前到达D2的输入端就可以满足建立时间了。这样分析的优点在哪?我也不太专业,反正这样分析感觉很对。这也是目前时序分析工具的默认data1数据由D1出发的时间点。这也是要求的数据传输时序,实际硬件电路可是不管这些的所以这些只是我们希望的要求时序它只管数据在要求稳定的时候是否稳定。后面的多周期也是如此。如果在edge(-1)就开始输出呢,会有什么样的结果?因为D2要求data1稳定的时间还是不变的即:edge1 - t_setup。这样data1就有2 * clk的时间来传输了。很明显这样就更能满足在edge1 - t_setup前就稳定的要求了。这就是系统工具(如quartus 的timequest)中用到的指定多周期。如edge(-2),edge(-3),……都是多周期分析了。

4、data1数据是如何走的呢?

假设不是多周期(因为多周期分析我还没用到过,不会分析)在各个时刻data1数据的传输还是很容易搞错的。因为在edge1时刻D2的输出不是data1,那此时D2输出的数据什么呢?肯定是edge(-1)D1的输出。data1在什么时刻输出呢?在edge2+t1(t1可以认为是触发器的传播延时)才从D2输出。这样就能解释为什么数据经过一层的触发器,就要多延迟一个时钟。如何才能使data1正确的由D2输出呢?或者说在edge0时,data1如何才能正确的由D1输出呢?这就是要求满足保持时间。也就是说只有满足保持时间data才能正确的由D发出。只是要在保持时间要讨论的。

5、如何才算data1满足D2保持时间?

数据到达D2的时间比D2要求数据稳定的时间要早,就说data1满足D2保持时间。假设是提前一个clk,则 t_q(这个不好描述,,,,在一个时钟周期内除了传输时间还剩的时间) = clk - t12,此时可以确定t12中的t2是用最小还是用最大的呢?为了分析的保险t2 = t2max,这样data1的到达时间就会晚点,这样就更有可能不满足D2对data1的建立时间。 只要t_q = clk - t2max - t1 > t_setup(t_setup也是一个时间段),就说data1由D1输出满足到D2输入的建立时间。t_q > t_setup是相对时间段。不是时间轴上的时间。如果能在时间轴上标出那就好了。我就不标了。我就写写:|t_q|(data1由D1输出到D2的时间轴上的时间) = edge0 - t2max - t1, |t_setup|(D2要求data1稳定的时间轴的时间)= edge1 - t_setup。这个时候满足建立时间的标准是|t_q|在时间轴的左边,|t_setup|在时间轴的右边即|t_q| < |t_setup|。这个时候(edge1)千万不要想到data1在D2的输出,因为这个时候data1只要等着,还不到输出的时候。

6、建立时间的余量t_setup_slack?

到这里就很清楚了,就是data1到达了D2的一个clk内还剩的时间 减 D2要求的建立时间段就是建立时间的余量:t_setup_slack = t_q(在一个时钟周期内除了传输时间还剩的时间) - t_setup。即建立时间余量大于0,就可以满足data1由D1传输到D2,一个时钟周期内满足建立时间。

7、在Verilog中是如何体现这种建立关系的?

在Verilog中要产生触发器必须要这句 always @(posedge clk or negedge rst_n),有这句不一定产生触发器。看看下面的代码:

always @(posedge clk_200M or negedge rst_n)    begin
    if(!rst_n)
        tx_start_flag <= 0;
    else if(byte_flag == 1)
        tx_start_flag <= 1;
    else
        tx_start_flag <= 0;
end

byte_flag 也是 clk_200M同步产生的,并且最多只有一个时钟的高。 在这段代码中能检测到byte_flag == 1吗?这里的tx_start_flag是一个触发器。byte_flag是一个触发器(数据源)的输出。 在clk_200M edge0时刻,byte_flag输出数据1,此时会经过上面的判断执行tx_start_flag <=(非阻塞) 1; 此时分析的是建立时间,而且此时的tx_start_flag输出还是0。这个时候的输出为什么还是0?不是已经运行了tx_start_flag <=(非阻塞) 1; 了吗?我的理解是tx_start_flag在edge0时刻的输出,是edge(-1)满足建立时间的值。还是这句话,建立时间分析的是输入,执行的这句tx_start_flag <=(非阻塞) 1; 也只是给到tx_start_flag触发器的输入端在edge0,执行的tx_start_flag <=(非阻塞) 1; 还不会影响tx_start_flag(触发器)在edge0时刻的输出。在edge1时刻,byte_flag输出数据0,同过选择器会执行tx_start_flag <=(非阻塞) 0; 此时tx_start_flag输出是1,是edge0满足的建立时间的等待要输出的(当然要满足保持时间)。总结这个always @(posedge clk or negedge rst_n)的行为 1)给满足保持时间的输出,也即是上一个edge的满足建立时间的输入端,先更新输出。2)经过判断执行语句,触发器输入端满足建立时间。(输入,输出是并发的没有先后,这里的1)是先执行完)。 到这里很明显只要byte_flag有一个高脉冲都会使tx_start_flag产生一个高脉冲。

====================================================================================================================

保持时间:在clk edge1(当前时刻)到达D2(目的寄存器)后的一段时间(t_hold),输入端的数据要稳定。只要满足在t_hold这段时间输入端的数据稳定,输入端的数据就能稳定的输出。

1、输出的时间是多少?

在edge1到达D2后(没有考虑时钟到达D1,D2的差,或者是时钟偏移),假设此时输入端的数据稳定(因为只想知道输出要的时间,即假设满足建立时间),数据输出需要的时间可以称为触发器的传输延时t1即要求的保持时间。如果真的要追究t1由哪些部分组成:这就要看触发器构成门电路,更细点的话要看构成门电路的cmos的制作工艺(不知道理解对么,反正时间很短0.几个ns)。t_hold > t1。 可以估计保持时间应该很短。

2、什么会导致这一段的时间的输入端数据不稳定?

在时序能控制的就是在edge1(为什么是edge1,而不是……edge(2),edge(0),edge(-1),……)时刻来自D1的输出data1,经过一段时间t12(数据由D1出发到达D2的时间)到达D2,如果到达的时间破坏了edge1要输出数据date0(edge0时刻到达D2的数据)。如果满足这种情况要求是 t12 < t_hold。 如果edge2时刻D1输出的数据data2要破坏edge1时刻D2数据data1的输出,有什么要求?D1,在edge2时刻输出的数据比edge1时刻输出的数据跑的快。这是不现实的,因为data1,data2走的是同一条电路。而edge0就是要edge1输出的数据。总结:唯一破坏稳定性的理由是t12 < t_hold。

3、保持余量?

首先要满足保持时间是稳定的即:t12 > t_hold, 才有保持余量。保持余量是:t12 - t_hold。但是其中还有个问题就是t2取 max还是min,为了是数据以最快的速度到达,即t2 = t2max。即t12  = t2min + t1 - t_hold。

4、data1破坏data0?

edge1时刻要满足保持时间的是data0(D2 edge1输出的数据),data1是D1在edge1时刻的输出到D2为了满足edge2 D2的输出的建立时间。如果data1到达D2太快,有可能破坏D2在edge1输出输出的data0的数据。这种可能性小,但还是存在的。如D1_t1 = 0.06ns, t2 = 0.06ns(没有组合逻辑),D2_t_hold  = 0.2ns,不考虑时钟偏移。t12 = 0.06 + 0.06 = 0.12ns < D2_t_hold = 0.2ns。这样的话和clk的周期是没有关系的。

总结:数据的传递要搞清。这样就能明白要哪样的时序。

有了一天的时间将其写好。看来,事情认真了还是可以做好!!这个过程,结果。。。。2015.4.24 cornhill

时间: 2024-11-11 10:02:02

建立时间、保持时间、建立余量、保持余量的理解的相关文章

建立时间保持时间方程及其影响

(注:本文翻译自:http://www.edn.com/design/systems-design/4392195/Equations-and-Impacts-of-Setup-and-Hold-Time) 在深入了解建立时间保持时间方程及其影响之前,先让我们简单的了解一下什么事建立时间和保持时间. 建立时间:建立时间定义为为了使数据正确的锁存,其在时钟有效沿到来前必须稳定的最小时间.任何这一时间的违例将会导致数据捕获错误并产生建立时间违例. 保持时间:保持时间定义为时钟有效沿后数据必须保持稳定

低级错误啊,浪费了那么长时间,对对象没有深刻理解

代码1:正确 public void TimerReloadStores(int currentPage, int pageCount) { DataTable storeParm = bo.GetStoreParamSqlServer(currentPage, pageCount, "1", pageTotal); //如果只有一页数据 if (currentPage == 1) { storeLogoSecond1.Visible = false; storeLogo1.Visib

【转】FPGA中的建立时间和保持时间的关系以及影响时钟的因素

时钟是整个电路最重要.最特殊的信号,系统内大部分器件的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要非常小, 否则就可能造成时序逻辑状态出错:因而明确FPGA设计中决定系统时钟的因素,尽量较小时钟的延时对保证设计的稳定性有非常重要的意义. 1.1 建立时间与保持时间 建立时间(Tsu:set up time)是指在时钟沿到来之前数据从不稳定到稳定所需的时间,如果建立的时间不满足要求那么数据将不能在这个时钟上升沿被稳定的打入触发器:保持时间(Th:hold time)是指数据稳定后保持的

基于建立/保持时间等的参数化时序分析

说明 本文源自作者读研期间的一份作业报告,主要基于建立时间.保持时间等时间约束参数推导时序分析公式,并通过实验进行验证. 因时间久远,某些实验数据和理论推导可能存在缺失,且难以回忆.若对读者造成理解困难,还请见谅~ 相关实验参见以下两篇文章: 采用流水线技术实现8位加法器 Stratix内嵌存储器测试报告 一  基本概念 建立时间(SetUp Time, tsu):触发器在有效时钟沿来到前,其数据输入端的数据必须保持不变的时间: 保持时间(Hold Time, th):触发器在有效时钟沿来到后,

Linux下文件的三种时间标记:访问时间、修改时间、状态改动时间 (转载)

在windows下,一个文件有:创建时间.修改时间.访问时间. 而在Linux下,一个文件也有三种时间,分别是:访问时间.修改时间.状态改动时间. 两者有此不同,在Linux下没有创建时间的概念,也就是不能知道文件的建立时间,但如果文件建立后就没有修改过,修改时间=建立时间;如果文件建立后, 状态就没有改动过,那么状态改动时间=建立时间;如果文件建立后,没有被读取过,那么访问时间=建立时间,因为不好判断文件是否被改过.读过.其状态是否 变过,所以判断文件的建立时间基本上能为不可能. 如何查一个文

【转载】在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间

在windows下,一个文件有:创建时间.修改时间.访问时间.而在Linux下,一个文件也有三种时间,分别是:访问时间.修改时间.状态改动时间. 两者有此不同,在Linux下没有创建时间的概念,也就是不能知道文件的建立时间,但如果文件建立后就没有修改过,修改时间=建立时间;如果文件建立后,状态就没有改动过,那么状态改动时间=建立时间;如果文件建立后,没有被读取过,那么访问时间=建立时间,因为不好判断文件是否被改过.读过.其状态是否变过,所以判断文件的建立时间基本上能为不可能. 如何查一个文件的三

[BZOJ 4184] shallot 以时间为基底建线段树

题意 给定时长 $n$ , 每个时刻有某个元素出现或者消失, 求每个时刻所有元素的最大异或值. $n \le 500000$ . 分析 通过 map 或者 hash , 我们可以知道 $O(n)$ 个 "一个元素 $x$ 在 $[l, r]$ " 出现的信息. 对时间建立线段树, 每个节点开一个 vector , 对区间 $[l, r]$ 对应的所有节点插入一个 $x$ . 对线段树进行 DFS , 同时动态维护线性基. 实现 #include <cstdio> #incl

2017.02.04,读书,2017第二本《把时间当作朋友》读书笔记

前言: 这是春节期间读完的一本书,也是今年的第二本,严格来说是大年初一那天看完的.春节,这个农业时代的传统,已经感到不适应时代(我)了.以公历来算,今年已经过去一个月了,农历却才刚开始,才进入的2017年节奏不得不打断一下.还好可以睡大觉. 以上是关于春节. 以下是关于这本书,依然是李笑来老师的,充满方法论的书.全文6657字,kindle版,花费大概8个小时,读起来一口气上五楼不费劲,推荐. ? 第0章 困境(程序员永远从0开始) 1 问题 最后期限没有完成的原因 没有按时开始执行任务 错误估

番茄工作法:让时间变成你最好的朋友

在我们所有的对手中,最强大的是时间.面对时间,我们丝毫没有欺骗的机会,时间一分一秒的流逝,最终的胜利者总是时间.我们经常会觉得"哦,两天过去了,任务丝毫没有进展,明天就是截止日期了,该怎么办?"我们经常忙于应付一个接一个的任务,没有时间去学习充电,享受生活,并由此陷入很大的焦虑情绪.随着社会不断发展,工业文明极大地丰富了人际间的交流手段以及获取信息的手段,我们的时间利用效率却变得越来越低了.沉下心思专心做一件事情,对绝大多数人来说已经变成一件不可能的任务.究其原因,主要有两个: 干扰太

http/https监控获取响应时间(DNS解析时间,RRT时间,服务器处理时间等)

有时候为了测试网络情况,需要返回每个阶段的耗时时间,比如DNS解析耗时,建立连接所消耗的时间,从建立连接到准备传输所使用的时间,从建立连接到传输开始所使用的时间,整个过程耗时,下载的数据量,下载速度,上传数据量,上传速度等等 有时候为了测试网络情况,需要返回每个阶段的耗时时间,比如DNS解析耗时,建立连接所消耗的时间,从建立连接到准备传输所使用的时间,从建立连接到传输开始所使用的时间,整个过程耗时,下载的数据量,下载速度,上传数据量,上传速度等等.下面的脚本获取以上信息: CURL的资料参见: