全系列:《基于Xilinx的时序分析、约束和收敛》目录与传送门
衍生时钟(Generated Clocks,又称为生成时钟)是指由设计中已有的主时钟通过倍频、分频或者相移等操作后产生的新的时钟信号,如由MMCM或PLL或由组合逻辑生成的倍、分频时钟信号。
衍生时钟约束必须指定时钟源,在对衍生时钟进行约束时,并不指直接对其周期、相位等进行描述,而是描述其与源时钟的关系,如倍频因子、分频因子、相位关系等。衍生时钟与源时钟之间的关系可以是:
衍生时钟约束的一般语法是:
create_generated_clock -name <generated_clock_name>\
-source <master_clock_source_pin_or_port>\
-multiply_by <mult_factor>\
-divide_by <div_factor>
<pin_or_port>
下图中,主时钟clkin的时钟周期为10ns,通过组合逻辑的形式构建了2分频的衍生时钟clkdiv2,

根据源时钟的不同认定方式,clkdiv2的衍生时钟约束有两种表达方式:
(1)源时钟是主时钟clkin
create_clock -name clkin -period 10 [get_ports clkin]
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 \ [get_pins REGA/Q]
(2)源时钟是REGA的时钟管脚
create_clock -name clkin -period 10 [get_ports clkin]
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 \ [get_pins REGA/Q]
除了用选项-divide_by来描述外,也可以使用-edges选项来描述上面的2分频衍生时钟。其表示方法如下:
# waveform specified with -edges instead of -divide_by
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} \ [get_pins REGA/Q]
其中的 -edges {1 3 5} 分别表示衍生时钟的第一个上升沿是源时钟的第1个边沿;衍生时钟的第一个下降沿沿是源时钟的第3个边沿;衍生时钟的第2个上升沿是源时钟的第5个边沿。通过这种边沿之间的对应关系间接描述了源时钟与衍生时钟之间的倍、分频关系。

下图是一个用MMCM实现的衍生时钟,源时钟周期10ns,占空比50%。衍生时钟占空比25%,周期10ns,相移90度。

这个衍生时钟可以被约束为:
create_clock -name clkin -period 10 [get_ports clkin]
create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges {1 2 3} \
-edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT]
-edges {1 2 3}和 -edge_shift {2.5 0 2.5}共同表示:
假设例4的其他情况均为例3相同,不同的是衍生时钟是源时钟的4/3倍,所以可以描述为:
create_generated_clock -name clk43 -source [get_pins mmcm0/CLKIN] -multiply_by 4 \ -divide_by 3 [get_pins mmcm0/CLKOUT]
非常经典的使用倍频系数和分频系数来描述的衍生时钟。
在了解了衍生时钟时钟约束的语法后,我们接着来学习一下,如何具体地在vivado中使用它。
我们首先新建一个简单的工程,并实现以下代码:
module test(
input sys_clk, //50M
input rst,
output out
);
assign out = clk_div2;
reg clk_div2;
wire pll_clk;
//2分频
always @(posedge pll_clk)begin
if(rst)
clk_div2 <= 0;
else
clk_div2 <= ~clk_div2;
end
//PLL实现125M
clk_wiz_0 pll_inst
(
// Clock out ports
.clk_out1 (pll_clk), // output clk_out1
.reset (rst), // input reset
.locked (), // output locked
.clk_in1 (sys_clk) // input clk_in1
);
endmodule
代码主要实现的功能:
(1)Vivado自动推导的衍生时钟
使用PLL或者MMCM生成的衍生时钟,是可以不用做衍生时钟约束的,vivado会自动推断出衍生时钟的相位、频率等参数。
自动推导的好处在于当MMCM/PLL/BUFR的配置改变而影响到输出时钟的频率和相位时,用户无需改写约束,Vivado仍然可以自动推导出正确的频率/相位信息。劣势在于,用户并不清楚自动推导出的衍生时钟的名字,当设计层次改变时,衍生时钟的名字也可能改变。但由于该衍生时钟的约束并非我们自定义的,因此可能会没有关注到它名字的改变,当我们使用这些衍生时钟进行别的约束时,就会出现错误。
解决办法就是用户自己手动写出自动推导的衍生时钟的名字,也仅仅写出名字即可,其余的不写。如下如所示:

比如上面的代码,使用了PLL生成一个2倍频的时钟,且我们没有做衍生时钟约束,在Tcl界面输入:report_clocks,会发现自动推到出了3个时钟,一个是主时钟sys_clk,一个是PLL生成的时钟clk_out1_clk_wiz_0,最后一个是PLL自动生成的反馈时钟clkfbout_clk_wiz_0(和我们使用PLL的方式有关,这里不管它)

接着我们新建一个xdc文件,命名为timing.xdc,用来存储各种XDC指令。
接着可以使用GUI界面来创建时序约束语句。在创建了XDC文件后,把工程综合完成,点击 edit timing constraints,打开时序约束编辑界面:

此时已经由PLL生成了两条约束:一条是主时钟约束,另一条是jitter约束。

PLL生成的2倍频时钟clk_out1_clk_wiz_0 的名字是自动生成的,看上去很奇怪,我们可以自己把它改成特定的有意义的名字:


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

此时再在Tcl界面输入:report_clocks,会发现名字已经改了:

(2)手动推导的衍生时钟
除了PLL和MMCM自动推出的衍生时钟外,我们自己用组合逻辑构建的分频时钟等,均需要自己手动写约束,约束的语法在上面已经介绍过了,这里说下用GUI界面来生成。
我们首先打开综合界面下的原理图:

可以看到2分频衍生时钟的master端是clk_div2_reg的C端,而source端则是 clk_div2_reg的Q端。
接着按如下步骤操作:


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

此时再在Tcl界面输入:report_clocks,会发现多出来了一个手动推导的衍生时钟clk_div2:

导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时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 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接