FPGA时序约束篇之时序分析与时序约束的作用
在每个初学者学习FPGA设计时,都会听前辈说:时序约束对FPGA设计很重要。那么,听了这么多次,时序分析到底是什么?时序约束的作用是什么?

网上巴拉巴拉看了一些杂七杂八的资料,简单写个学习笔记。
先用比较官方一点的语言来描述一下时序分析与时序约束?
我们在使用HDL(Hardware Description Language )描述或者设计一个电路时,常常会被问到,你所设计的电路的最高主频能跑到多少?
What?我们在给设计系统中不是给定了约束的系统时钟频率了吗?这里,最高主频是啥?最高主频是指当设计电路每个寄存器都能正确所存数据所需要的最大时钟频率。那么,在这里最高主频在设计中是通过我们手算得到的吗?当然不是。可以通过EDA软件的综合后的时序报告中可以看到。然后根据时序报告对时序约束进行修改。
假如我们设计一个模块,其示意图如下。模块的输入数据DATA通过一个寄存器REG_1(D触发器)进行寄存后,在经过一系列的逻辑运算后,在通过一个寄存器(D触发器)REG_2进行寄存后,作为模块的输出。

那么,这里有几个点需要指出:

对于上面图中的逻辑计算部分,内部是由一系列的逻辑门电路组成的,这里每个逻辑器件之间数据的传输存在延迟。那么问题来了,在第一个时钟的上升沿数据DATA从寄存器REG_1的D端输入,经过一定时间后从D触发器REG_1的Q端输出,再经过逻辑运算,这里逻辑运算也得需要一定的时间,从输入到输出存在延迟,如果这个延迟超过了一个时钟的周期,那么在第二个时钟周期的上升沿处,寄存器REG_2对逻辑运算的结果进行采样得到的结果就不是我们想要的数据,如下图所示。

那么,在上图中,由于组合逻辑的路径太长,所以从寄存器REG_1的Q端到寄存器REG_2的D端的时间太长,从而导致经过组合逻辑运算后的数据到达目的寄存器REG_2的D端时已经超过了其工作时钟CLK_2的上升沿(Latch Edge),所以目的寄存器REG_2无法锁存到正确的数据。
假如这里我们约束的系统时钟频率为50M Hz,那么源时钟CLK、源寄存器工作时钟CLK_1与目的寄存器工作时钟CLK_2的时钟周期都为20ns。这里由于无法满足时序收敛的要求,需要降低时钟频率,即增大时钟周期,以满足时序收敛的要求,如下图中右图所示。

那么,上面是不满足时序收敛的情况。加入经过时序分析后,我们给的系统时钟频率50M Hz是满足时序收敛的情况,如下图中左图所示。

那么,在这里,可以进一步提升时钟的频率,即降低时钟的周期,但此时目的寄存器REG_2仍然能够正确寄存数据,如上图中右图所示。
好了,上面就是关于时序分析与时序约束的解释,如果有疑义的地方欢迎评论区友好探讨学习!!!!!
关于时序分析与时序约束中的基本知识参照下一篇《FPGA时序约束篇之时序约束中的一些基础概念》

如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o
这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw
你能解释一下吗?我想评估来自两个不同来源的值和计算。一个消息来源为我提供了以下信息(以编程方式):'a=2'第二个来源给了我这个表达式来评估:'a+3'这个有效:a=2eval'a+3'这也有效:eval'a=2;a+3'但我真正需要的是这个,但它不起作用:eval'a=2'eval'a+3'我想了解其中的区别,以及如何使最后一个选项起作用。感谢您的帮助。 最佳答案 您可以创建一个Binding,并将相同的绑定(bind)与每个eval相关联调用:1.9.3p194:008>b=binding=>#1.9.3p194:009>eva
我无法运行Spring。这是错误日志。myid-no-MacBook-Pro:myid$spring/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/lib/spring/sid.rb:17:in`fiddle_func':uninitializedconstantSpring::SID::DL(NameError)from/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/li
我在RoR应用程序中有一个提交表单,是使用simple_form构建的。当字段为空白时,应用程序仍会继续下一步,而不会提示错误或警告。默认情况下,这些字段应该是required:true;但即使手动编写也行不通。该应用有3个步骤:NewPost(新View)->Preview(创建View)->Post。我的Controller和View的摘录会更清楚:defnew@post=Post.newenddefcreate@post=Post.new(params.require(:post).permit(:title,:category_id))ifparams[:previewButt
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'