更新于20180823

时序检查中对异步复位电路的时序分析叫做()和()?

  这个题做的让人有点懵,我知道异步复位电路一般需要做异步复位、同步释放处理,但不知道这里问的啥意思。这里指的是恢复时间检查移除时间检查

在开始之前需要先搞明白的一点是为什么要保持建立时间和保持时间大于零,不满足的话会怎么样呢?

首先需要明白的一点就是D触发器的构造,D触发器实际上是由一个传输门加上反相器组成的双稳态电路组成的如下图:

这个电路的工作情况:clk为低电平的时候传输门T1导通,T2关断,输入数据D会被锁存到Qm处。然后在clk为高电平的时候,T1关断,T2导通,输入数据Qm传输到Q上面去。这个过程实际上就是在时钟上升沿的时候将D数据 转移到Q上面去。

建立时间指的是在T1导通T2关断的时候,输入数据D到达Qm所用的时间,假设这个时候D没有到达Qm,会导致其输出的是原先的值,或者是错误的值,保持时间指的是在T1关断,T2导通的时候,Qm 到达Q用的时间,假设输入D没有在sclk到达后保持这么长的时间的话,加入变化的快的话,D变化导致的Qm变化从而使得输出的Q采集到不正确的值,这也是亚稳态的一种吧。还有一种情况就是反相器的I1 的输入端因为D输入变化而使得Qm电压波动,这个波动会在T2导通后传输到Q端

一、时序分析

首先需要明确的是深入理解什么是建立时间,什么是保持时间,还是用图来说话

Tsu:保证数据在时钟采样是是稳定的,决定了该触发器之间组合逻辑的最大延迟

Th:保证数据能准确的被采样,决定了该触发器之间组合逻辑的最小延迟

在实际上做时序分析的时候可以分两类分别分析

1.组合逻辑的时序分析:电路上的延时是加性的

2.时序逻辑的时序分析:电路上的延时是非加性的

一个典型的模型在实际电路中,通常是时序逻辑和组合逻辑的结合,保证两种电路之间的数据传输没有问题的关键是要保证满足建立时间和保持时间之间的关系。,也就是说对于D2而言,它的建立时间和保持时间与D1的建立保持时间无关,只取决于D2的组合逻辑延时以及D1 的传输延时。

例题:假设第一个触发器的D1的建立时间最大值为T1max,最小为T1min,组合逻辑的延时最大为T2max,最小为T2min,请问第二个触发器D2的建立时间和保持时间瞒住的关系。

图中tco指的是触发器从0翻转到1所用的时间,有的地方叫tdq

Tdelay指的是组合逻辑的延时,tpd是时钟传输的延时,但实际上在FPGA中这部分的延时已经做到了很小了完全可以忽略掉的,有的地方叫tskew

进入正题开始分析:用时序电路图的方法,先假设tpd为零

对于D2的建立时间可以画图:

建立时间满足公式:Tco+Tdelay+T3<T   T3<T-Tco-Tdelay  那么这里的Tco和Tdelay应该取max

保持时间与建立时间满足公式Th+Tsetup=Tclk,因此,可以得到T4<Tco+Tdelay这里取min

把时钟延时加上,即Tpd!=0时,有如下时序图:

可以计算的到,建立时间放宽了Tpd,为Tclk+Tpd-(Tco+Tdelay)>=T3,Th减小为Tco+T2min-Tpd。

总结:

简易公式:

以下两个公式确定了D2的Tsetup和Thold: 

1) D1的Tco + max数据链路延时+D2的Tsetup<T(T3<T-Tco-T2max)

2)D1的Tco + min数据链路延时>D2的Thold(T4<Tco+T2min)

实际中,某条数据链路的延时是一个定值,不过要求它在{T2min-T2max}之间

二、关于约束条件:

       建立时间约束:
(1)式的思想其实就是在第二个时钟沿来临之前,数据稳定的时间一定要大于等于建立时间。因此在一个时钟周期内,数据稳定的时间为Tclk-Tdq-Tcomb,因为时钟也存在偏移,因此要把这个时钟偏移加上,于是最后数据稳定的时间为Tclk+Tskew-Tdq-Tcomb,满足这个稳定时间大于建立时间即可,因此推导出了(1)式,进而可以推导出在已知建立时间、组合逻辑延时、D触发器延时、时钟偏移的情况下,理论上能够承载的最大时钟频率为:
        f_max = 1/(Tsetup+Tdq+Tcomb-Tskew)
这个关系式对于电路设计和芯片选型方面都有着非常大的帮助。当然,在实际工程中还要根据实际情况留有一定的设计余量以应对短暂的非常规情况。

  保持时间约束:
(2)式的思想为在第二个时钟沿来临之后,数据稳定的时间一定要大于等于保持时间。因此在时钟沿来临之后,数据稳定的时间为Tdq+Tcomb,再减去时钟偏移则为Tdq+Tcomb-Tskew,满足这个稳定时间大于等于保持时间即可。

最后联立(1)(2)式我们可以推导得出:

组合逻辑延时范围:
       Thold+Tskew-Tdq<=Tcomb<=Tclk-Tdq+Tkew-Tsetup
时钟偏移范围:
      Tsetup-Tclk+Tdq+Tcomb<=Tskew<=Tdq+Tcomb-Thold

三、补充问题:

关于Tco大小分析:

与()有关呢,如何提高这部分的性能,对于组合逻辑呢,翻转的速度如何确定,如何提高?

假设数据是咋上升沿进行的采样,那么只需要保证数据在时钟上升沿到来前数据保持稳定,以及时钟上升沿后数据保持稳定,那么我们知道数据是在上升沿到来的那一瞬间被打入到触发器进而采样的,那么我们只要保证这一瞬间数据稳定不就行了么?理论上没啥问题,但实际上我们需要考虑D触发器的内部结构

图二是经典上升沿D触发器的内部结构图:

与非门G1到G4是维持阻塞电路,G5和G6构成一个RS触发器用于数据的锁存。如有不明白RS触发器的真值表和工作机理的可以在网上找到资料,这里不再累述。

  图中可以看到,时钟信号直接作用在了G2和G3上面,也就意味着G2和G3是真正的采样传输门电路,输入信号应该要正确的被G2和G3采样后传输至后面的RS触发器。我们注意到,数据在传输到G3之前经过了G4,传输至G2之前经过了G4和G1。我们知道,实际情况中信号经过门电路是有延迟的。所以输入信号在到达G2和G3之前经过了G1和G4的延迟,因此就引入了建立时间的概念:建立时间就是为了补偿信号在G1和G4上的延迟。也就是数据在时钟沿来临之前,需要足够的建立时间让信号经过G1和G4到达G2和G3。触发器的建立时间主要取决于G1和G4.
  那么保持时间呢?一样的,上升沿来临时,数据通过G2和G3传输至后面的RS触发器,但G2和G3也会存在延时。因此又引入了保持时间的概念:保持时间就是为了补偿信号在G2和G3上的延迟。也就是数据在时钟沿来临之后,需要足够的保持时间让信号正确的从G2和G3传输至RS触发器。触发器的保持时间主要取决于G2到G3,进而可以推断出,一般D触发器的保持时间比建立时间要长。
  也许有人问,如果不满足建立时间和保持时间会怎样?很简单,因为在传输的过程中数据并不是处于稳定状态而处于亚稳态区,则会导致采样的数据可能会出错。

触发器可以将hold time减小到0

此外关于自己在SDC文件中的约束

setup violation
主要就是设法剪掉critical path的delay,要么pipeline(流水线分一下),要么retiming,要么把combination往前后级挪一挪。减小传输延时,降低时钟频率。
hold time violation
hold time violation是clock tree的skew引起的。主要的宗旨就是设法加前面一级combination的delay,比如加buffer什么的。这时候hold time不满足必须让前前面延迟大一些,并大到比clock period还大出至少一个hold time来。也可以适当把clock period缩小。不过hold time并不是自己能控制的,挺闹心的。或者可以减小时钟延时。
在综合时,综上所述,
setup violation是由于前级组合的延迟过大引起的,因此要用set_max_delay来限制,
hold violation是由于前级组合延迟过小引起的,因此不能让他太小,要用set_min_delay来限制。

再进一步分析下建立时间保持时间不满足发生的情况:

建立时间不满足是因为组合逻辑延时过于长,而保持时间不满足是因为逻辑团延时过小,建立时间保持时间都不满足发生在异步时钟域中一个讲的非常直观的PPT乍就没有早点看到这些东西,还是自己太懒了http://www.docin.com/p-977469569-f7.html

FPGA时序分析的更多相关文章

  1. FPGA时序分析相关

    什么叫时序? 时间与动作的相互关系,什么时间干什么活. 同步时序:单一时钟源,所有寄存器在单一时钟源下同步工作. 异步时序:多个时钟源,除使用带时钟的触发器之外,还可以使用不带时钟的触发器与延时元件作 ...

  2. FPGA Timing笔记

    很多FPGA工程师都会遇到timing的问题,如何让FPGA跑到更快的处理频率是永久话题.决定FPGA的timing关键是什么?如何才能跑到更快的频率呢? A. 第一步需要了解FPGA的timing路 ...

  3. 【转载】FPGA静态时序分析——IO口时序

    转自:http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html 1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟约束 ...

  4. FPGA静态时序分析——IO口时序(Input Delay /output Delay)

    1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟约束,还应包括完整的IO时序约束和时序例外约束才能实现PCB板级的时序收敛.因此,FPGA时序约束中IO口时序约束也是一个重点.只有约束正确 ...

  5. FPGA高级设计——时序分析和收敛(转)

    何谓静态时序分析(Static Timing Analysis,简称STA)? 它可以简单的定义为:设计者提出一些特定的时序要求(或者说是添加特定的时序约束),套用特定的时序模型,针对特定的电路进行分 ...

  6. FPGA STA(静态时序分析)

    1 FPGA设计过程中所遇到的路径有输入到触发器,触发器到触发器,触发器到输出,例如以下图所看到的: 这些路径与输入延时输出延时,建立和保持时序有关. 2. 应用背景 静态时序分析简称STA,它是一种 ...

  7. 如何利用FPGA进行时序分析设计

    FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器 ...

  8. FPGA静态时序分析——IO口时序(Input Delay /output Delay)(转载)

    转载地址:http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html 1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟 ...

  9. FPGA中的时序分析(五)

    时序约束实例详解 本篇博客结合之前的内容,然后实打实的做一个约束实例,通过本实例读者应该会实用timequest去分析相关的实例.本实例以VGA实验为基础,介绍如何去做时序约束. 首先VGA这种情况属 ...

随机推荐

  1. python之路(dingo 框架)

    Python之路  转载自QIMI老师  Python之路 第一篇:Python基础 PyCharm使用秘籍免费视频教程v3 ... 迭代器生成器 模块和常用内置模块 面向对象 面向对象进阶 网络编程 ...

  2. Bugku 社工

    1.密码 姓名:张三 生日:19970315 猜想KEY是:zs19970315.  结果就是如此.

  3. springboot rabbitmq消息同步用作接口调用

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  4. Flux转Mono next()

    import java.util.LinkedHashMap; import java.util.Map; import java.util.NoSuchElementException; impor ...

  5. SQL基础教程(第2版)第2章 查询基础:2-1 SELECT语句基础

    ● 通过指定DISTINCT可以删除重复的行.● 为列设定显示用的别名. ■列的查询 通过 SELECT 语句查询并选取出必要数据的过程称为查询(query). 该 SELECT 语句包含了 SELE ...

  6. redis基本指令

    1.键值相关命令       keys * 取出当前所有的key       exists name 查看n是否有name这个key       del name 删除key name       e ...

  7. 最新版Navicat Premium激活,附激活工具

    再次申明:Navicat Premium为收费软件,请勿商用,如有侵权,请联系我删除. 注意事项:1.运行注册机时最好关闭电脑的杀毒软件:2.运行注册机请断网,无需将注册机放到Navicat Prem ...

  8. IT架构的本质--阅读笔记01

    万物都有其本质,也只有了解了事物的本质之后,才不至于出现在事物稍作改变时就难以应对的情况,作为软件工程专业的学生,我们应该对IT架构的本质有一定的了解.“老僧三十年前未参禅时,见山是山,见水是水.及至 ...

  9. python中os模块的常用方法

    1.os模块:os模块在python中包含普遍的操作系统功能,下面列出了一些在os模块中比较有用的部分. os.sep可以取代操作系统特定的路径分隔符.windows下为 “\\” os.name字符 ...

  10. Python笔记_第四篇_高阶编程_GUI编程之Tkinter_2.控件类

    1. Label控件: 说明:标签控件,可显示文本 图示1: 实例1: import tkinter # 创建主窗口__编程头部 win = tkinter.Tk() # 设置标题 win.title ...