全系列:《基于Xilinx的时序分析、约束和收敛》目录与传送门
之前文章讨论的时序约束可以说都是对时钟的理想特征进行约束,为了更精确地进行时序分析,设计者还必须设定一些与运行环境相关的可预测变量和随机变量,这部分也称作时钟的不确定性特征,包括时钟抖动Clock Jitter、时钟不确定性Clock Uncertainty和时钟延迟Clock Latency。
理想的时钟信号是完美的方波,但是实际的方波却是存在一些时钟抖动的。那么什么是时钟抖动呢? 相对于理想时钟沿,实际时钟存在不随时间积累的、时而超前、时而滞后的偏移称为时钟抖动(时钟脉冲宽度发生暂时变化,也就是时钟周期或大或小)。有抖动的时钟信号如下图:

对于ASIC器件来说,时钟抖动通常代表了时钟的不确定性特征;但对于Xilinx FPGA而言,抖动属性被当作可预测变量看待;抖动有的需要单独设置,有的在时序分析过程中会自动计算,抖动分为两种:
- 输入抖动(set_iput_jitter):指实际时钟边沿与理想时钟边沿到达时刻之间的差值,可以使用set_iput_jitter命令为每个主时钟单独设置输入抖动
- 系统抖动(set_system_jitter):指电源噪声、板级噪声或其它原因引起的整体的抖动,对于整个设计,使用set_system_jitter命令设置一个值即可,会应用到所有时钟
对于时钟抖动,一般情况下都建议直接使用vivado工具默认产生的抖动值,而不是自行设置。若设计者有实际应用的需求,则可以使用set_iput_jitter和set_system_jitter语法来分别设置输入抖动和系统抖动。输入抖动和系统抖动都将作为时钟不确定性(Clock Uncertainty)的一部分存在。
set_iput_jitter的基本语法结构如下:
set_iput_jitter [get_clocks <clock_name>] <jitter_in_ns>
- get_clocks 用于指定事先定义好的需要约束的主时钟名<clock_name>
- <jitter_in_ns>用于指定需要约束的抖动值,单位ns
set_system_jitter的基本语法结构如下:
set_system_jitter <jitter_in_ns>
- <jitter_in_ns>用于指定需要约束的抖动值,单位ns
时钟的系统抖动值和输入抖动值通常都是符合高斯分布的一些随机值,因此以其均方值作为最坏的情况进行计算,即最坏情况的系统抖动值Tsj计算公式如下:
Tsj = sqrt (SourceClockSystemJitter ^ 2 + DestinationClockSystemJitter ^ 2)
- ^ 2表示开平方,sqrt 表示开根号
默认情况下,vivado设置的系统抖动值一般为0.050ns,所以 Tsj = sqrt (0.05 ^ 2 + 0.05 ^ 2 ) = 0.071ns。
除了时钟抖动外其他能影响时钟周期性偏差的因素,都可以使用时钟不确定性约束set_clock_uncertainty命令来进行约束。使用set_clock_uncertainty命令可以根据需要为特定的时钟关系定义附加的时钟不确定性,这样在时序分析时,可以为设计中的某些部分增加额外裕量。
set_clock_uncertainty的基本语法结构如下:
set_clock_uncertainty -setup -from[get_clocks <clock0_name>] -to [get_clocks<clock1_name>] <uncertainty_value>
- -setup表示定义建立时间的不确定性设置,也可以使用-hold来定义保持时间的不确定性。若不指定-setup或-hold,则表示同时定义建立时间和保持时间的不确定性
- -from指定源时钟,-to指定目的时钟,对于非CDC路径,一般不需要指定其路径
- get_clocks用于指定实际的时钟物理节点名称<clock0_name>和<clock1_name>
- <uncertainty_value>指定时钟不确定时间,单位为ns
尽管使用set_iput_jitter 和 set_system_jitter约束的时钟抖动值最终都会算作时钟不确定性的一部分,但使用set_clock_uncertainty 约束的时钟不确定值并不会影响set_iput_jitter 和 set_system_jitte约束的抖动值,而是额外增加约束至时钟不确定性中用于时序分析。
为了区分set_clock_uncertainty 约束的抖动值和自动计算出来的抖动值,将set_clock_uncertainty 约束的抖动值称为用户不确定性(User Uncertainty)时间,它会作为最终的时钟不确定性的一部分存在。
首先新建一个vivado的RTL工程,再添加一个Verilog文件,内容如下:
module test
(
input sys_clk ,
input rst ,
output reg [7:0] cnt
);
always @(posedge sys_clk)begin
if(rst)
cnt <= 0;
else
cnt <= cnt + 1'b1;
end
endmodule
这个工程要实现的功能非常简单,就是一个8bit的循环计数器。
然后再往工程里添加一个时序约束文件timing.xdc,内容如下:
create_clock -period 10.000 -name sys_clk -waveform {0.000 5.000} [get_ports sys_clk]
这句约束的意思是将输入的主时钟频率约束在100MHz,如果你不懂主时钟约束,可以参考《基于Xlinx的时序分析、约束和收敛(4)----主时钟约束》
管脚的绑定因为只是看时序报表不涉及具体的开发,所以就省去了(vivado自动分配,不影响看查看时序)。
工程新建完成后,点击综合、实现(完成布局布线)。然后点击实现implementation下的report timing summary,打开timing界面:

随机选取,双击路径1打开其详细界面:

可以看到,此时的时钟不确定度是0.035ns,点击这个值会出现具体的算法:

- TSJ是最坏情况的系统抖动时间,它由上面的公式 Tsj = sqrt (SourceClockSystemJitter ^ 2 + DestinationClockSystemJitter ^ 2) 计算得来,在vivado默认其系统抖动为0.05ns的情况下,其值算得为0.071ns
- TIJ是set_input_jitter设定的输入抖动时间,因为目前还没有添加该约束,所以其值为0
- DJ是由一些硬件原语(如PPL或MMCM等)产生的离散时钟抖动
- PE也是由于使用PPL或MMCM等产生的相位误差,一般是个固定的值
- UU这条没有显示是由于目前没有设定set_clock_uncertainty
根据上述公式,代入数值后求得此时的时钟不确定度值为0.035ns,那么这个值最后会用在哪里?

上图是数据要求到达时间的具体算法,现在有 建立时间裕量 = 数据要求到达时间 - 数据实际到达时间。 从上图可以看到时钟不确定性是作为一个负值加到数据要求到达时间里去的,这实际上相当于减少了建立时间裕量,是一种保守的算法,其目的是为了减少时钟非理想特性所带来的影响。
接下来设置一下输入抖动和时钟不确定性。
把工程布局布线完成后,点击 edit timing constraints,打开时序约束编辑界面:


左侧是约束分类区,展示了各种各样的时序约束;右侧是对应的约束编辑区 ;下方是已有的约束的展示区域。此时只有一条之前添加的主时钟约束。
接着点击set clock uncertainty,然后点击+号,添加一条时钟不确定性的约束语句(设定0.2ns的用户设定时钟不确定性):

然后点击set input jitter, 然后点击+号,添加一条输入时钟抖动语句(设定0.1ns的sysclk的输入时钟抖动):

然后点击set system jitter, 然后点击+号,添加一条系统时钟抖动语句(设定0.15ns的系统时钟抖动):

此时vivado左侧的保存约束按钮又可以按下了,按下将这几条语句保存:

此时,再打开timing.xdc文件,就已经出现了刚刚设置的约束语句:

此时需要把工程重新布局布线implementation一下,完成后再按上面的步骤,仍然打开路径1,观察其信息:

- Tsj = sqrt (SourceClockSystemJitter ^ 2 + DestinationClockSystemJitter ^ 2),系统抖动的值由默认值0.05ns改成了0.15ns,所以计算得到其值为sqrt (0.15 ^ 2 + 0.15 ^ 2) ≈ 0.212ns
- 时钟输入抖动设置为0.1ns
- 由于没有使用PLL或MMCM,所以DJ和PE的值均为0
- 多出来的UU是用户自己设定的时钟不确定性,其值为0.2ns
- 根据公式:((TSJ^2 + TIJ^2)^1/2 + DJ)/2+ PE + UU,代入各项得:((0.212^2 + 0.1^2)^1/2 + 0)/2 + 0 + 0.2 = 0.317ns
经过PCB和FPGA器件内部的传输,时钟边沿到达目的地后会有一个确定的延迟,这个延迟可以分为两个部分看待:
- 网络延迟(network latency):也称作插入延迟,指在FPGA内部传输带来的延迟;Vivado会自动分析计算该延迟,布线过程前只是一个粗略的估计,布线后便可以得到一个精确的值;对于生成时钟,包含其本身的网络延迟和上级时钟的网络延迟两部分
- 源端延迟(source latency):通常指FPGA器件外,时钟进入源点前的传输延迟,这部分延迟与PCB设计相关,需要用set_clock_latency命令进行约束
source latency 指从时钟源到定义时钟的pin(create clock的位置)的延迟。network latency指从定义时钟的位置到寄存器的clock pin的延迟。如下图所示:

对于已经做过主时钟约束的时钟,vivado在时序分析时都会自动计算其时钟延迟并给出详细报告。而对于FPGA外部输入的同步时钟信号,有时为了建模需要,设计者可能需要增加一些时钟延迟约束以指定这些时钟在FPGA器件之外的一些时钟延迟特性。
时钟延迟命令set_clock_latency命令的基本语法如下:
set_clock_latency [- clock <args>] [-rise] [-fall] [-min] [-max] [-source] <latency> <objects>
- - clock后指定约束时钟(由<objects指定)所相对的时钟名称<args>,若不定义时钟<args>,则时钟延迟值会自动应用到所有目标时钟<objects>所驱动的时序路径
- [-rise]、 [-fall]指定时钟延迟的边沿
- [-min]、 [-max]指定时钟延迟的最小值/最大值
- [-source]指定时钟延迟的基本类型, [-source]即源端延迟,也可以是网络延迟[-network],默认值为[-network]
- <latency>指定时钟延迟值,单位ns
- <objects>指定约束时钟的名称
对于外部引脚输入的时钟信号,其由晶振经过PCB板级延迟到达FPGA引脚的路径延迟就可以作为源端延迟[-source]来定义;而网络延迟[-network]则用于定义时钟信号从设计中的某个指定节点传输到寄存器的时钟输入端口的延迟。时钟到达寄存器输入端口的总延迟包括了时钟源端延迟和网络延迟。
以下是一条引脚到寄存器的源时钟(虚拟时钟)在没有做任何时钟延迟约束时的路径的时序报告,此时的ideal clock network latency值为默认的0.00ns:

接下来,打开timing constrains界面,编辑添加一条时钟延迟约束语句:

其界面设置如下:

这里相当于为虚拟时钟vrclk设置了2ns的时钟源延迟,再打开相同的路径,看下时序报告:

可以看到,增加了一个clock source latency,其值为设定的2ns。此时的数据到达时间增加了2ns,由原来的11.636ns变成了13.636ns,实际上是给源端的时钟增加了一个延迟值,即Tclk1增加了2ns。

ug903,Vivado Design Suite User Guide--Using Constraints
ug949,适用于 FPGA 和 SoC 的 UltraFast 设计方法指南
ug906,Vivado Design Suite 用户指南--设计分析与收敛技巧
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
目录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.
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接