高级时钟约束
时序的零起点
用create_clock定义的主时钟的起点即时序的“零起点”,在这以前的上游路径都会被工具自动忽略。所以主时钟在哪个“点”很重要,以下图所示结构来举例,分别于FPGA输入端口和BUFG输出端口创建一个主时钟,在时序报告中体现出的路径延时完全不同,很明显sysclk_bad的报告中缺少了之前的一段的延时,时序报告不可信。
时钟定义的先后顺序
在同一个点上,由用户定义的时钟会覆盖工具自动推导的时钟,且后定义的时钟胡覆盖先定义的时钟。若要二者并存,必须使用-add选项。
Create_clock -name sysclk -period 10 [get_ports sys_clk]
Create_generated_clock -name clkbufg -source [get_ports sys_clk] -divide_by 1
[get_pins clk_infra_i/clkfsm_buf/o]
Create_generated_clock -name clkbufr -source [get_ports sys_clk] -divide_by 1
[get_pins clk_infra_i/clkfsm_buf/o] -add -master_clock sysclk
上述例子中的BUFG的输出端由用户自定义了一个衍生时钟clkbufg,这个衍生时钟会覆盖此处原有的sysclk。此外,图示BUFR工作在bypass模式,其输出不会自动创建衍生时钟,但在BUFR的输出端定义一个衍生时钟clkbufr,并使用-add和-master_clock选项后,这一点上会存在sysclk和clkbufg两个重叠的时钟。
同步时钟和异步时钟
不同于UCF约束,在XDC中,所有的时钟都会被缺省认为是相关的,也就是说,网表中所有存在的时序路径会被VIVADO分析。这也就意味着FPGA设人员必须通过约束告诉工具,哪些路径是无需分析的,哪些时钟域之间是异步的。
如上图所示,两个主时钟ssclkin和sysclk由不同的端口进入FPGA,在经过不同的时钟网络传递,要将它们设成异步时钟,可以使用下面的约束:
set_clock_groups -name sys_ss_async -asynchronous -group
[get_clocks -include_generated_clocks sysclk] -group
[get_clocks -include_generated_clocks ssclkin]
其中,-include_generated_clocks表示所有衍生时钟自动跟主时钟一组,从而与其他组的时钟时间为异步关系。不加这个选项则仅仅将时钟关系的约束应用在主时钟层面。
重置(单点多个)时钟
重置时钟是指多个时钟共享完全相同的时钟传输网络,例如两个时钟经过一个MUX选择后输出的时钟。
如下图所示,clk125个clk250是clkcore_buf的两个输入时钟,不约束时钟关系的情况下,VIVADO会对图示路径做跨时钟域分析。这样的时序报告即便没有违例,也是不可信的。因为clk125个clk250不可能同时驱动这条路径上的时序原件。这么做也会增加运行时间,并影响最终的实现结果。
如果clk125和clk250除了通过clkcore_buf后一模一样的删除外没有驱动其他时序元件,则只需要补齐时钟关系的约束。
set_clock_groups -physically_exclusive -group [get_clocks clk125]
-group [get_clocks clk250]
在很多情况下,除了共同的扇出,其中一个时钟域或两个都还驱动其他的时序元件,此时建议的做法是在clkcore_clk的输出端建立两个重叠的衍生时钟,并将其时钟关系约束为-physically_exclusive表示不可能同时通过。这样做可以最大化约束覆盖率,也是ISE和UCF无法做到的。
create_generated_clock -name clk125_bufgctrl
-divide_by 1 [get_pins bufgctrl_i/o]
-source [get_ports bufgctrl_i/I0]
create_generated_clock -name clk250_bufgctrl
-divide_by 1 [get_pins bufgctrl_i/o]
-source [get_ports bufgctrl_i/I1]
-add -master_clock clk250
set_clock_groups -physically_exclusive
-group clk125_bufgctrl
-group clk250_bufgctrl
- java实现发送邮件服务器,SMTP协议发送邮件
- HttpURLConnection实现两个服务端的对接
- java获取properties配置文件值
- 安全退出app,activoty栈管理
- JavaBean转Map方法
- JsBridge实现JavaScript和Java的互相调用
- JAVA-FTP批量大文件传输
- 独家 | 一文读懂TensorFlow(附代码、学习资料)
- 解决openssh漏洞,升级openssh版本
- 解决NTPD漏洞,升级Ntpd版本
- 独家 | 手把手教TensorFlow(附代码)
- HBase Region自动切分细节
- eclipse搭建ssh后台
- 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 教育平台项目后台管理系统:介绍与搭建
- Python办公自动化之Excel做表自动化:全网最全,看这一篇就够了!
- Java学习笔记-spring-Bean实例化
- Java学习笔记-spring-Bean作用于
- 教育平台项目后台管理系统:课程信息模块
- 教育平台项目后台管理系统:课程内容模块
- 100 个 Python 小例子
- Entity Framework初体验
- Entity Framework 小知识(一)
- 教育平台项目前端:Vue.js 入门
- Entity Framework 约定
- 浏览器中的跨域问题与 CORS
- Entity Framework 小知识(二)
- 教育平台项目前端:Vue.js 高级
- Entity Framework 简单属性映射