TIMING_05 VIVADO环境下的时序约束 之 基本时钟周期约束
由于该系列文章阅读有顺序性,所以请跳转至该系列文章第一篇从头开始阅读,并按照文章末尾指示按顺序阅读,否则会云里雾里,传送门在此: https://blog.csdn.net/qq_33486907/article/details/89380368 《TIMING_01 时序约束与时序分析引导篇》
目录
1. 基本时钟周期约束
1.1 时钟周期约束的性质
1.2 Primary Clocks主时钟
1.3 Generated Clocks生成时钟
1.4 时钟分组约束
从本篇文章开始,正式进入时序约束,本文以XILINX VIVADO环境进行讲解,包括后续的时序分析。在时序约束约束环节VIVADO和Quaetuse II两大平台是一致的,都是基于SDC标准的约束,所以学习时序约束环节时,不必为了采用何种开发环境困扰。
1. 基本时钟周期约束
基本时钟周期约束的作用有两个:(1)告诉VIVADO需要在FPGA中运行时钟的特性,主要用于约束FPGA内部寄存器之间所需要达到的时序性能;(2)可能以此基本时钟周期约束为基础进行其他的约束,作为其他约束的基础;
约束所覆盖的路径如下:
1.1 时钟周期约束的性质
基本时钟周期约束的性质包含:时钟周期、占空比以及相位;
1.2 Primary Clocks主时钟
主时钟(Primary Clocks)一般是FPGA外部芯片,如晶振提供的时钟,通过FPGA引脚输入,Vivado进行时序分析时,以主时钟的源端点作为延时计算起始点(0ns点)。
示例1:从外部引脚引入的时钟
约束如下:
create_clock -period 10.000 -name sysclk -waveform {0.000 5.000} [get_ports sysclk]
对于主时钟的利用不要局限于一个驱动绝大多数资源的时钟,对于只驱动部分资源的时钟也属于该类,同样适用于这条约束,例如:ADC的采样随路时钟;
对于差分输入形式的时钟,只需要对P脚使用约束即可;
示例2:高速收发器提供的时钟
约束如下:
create_clock -period 3.330 -name rxclk -waveform {0.000 1.660} [get_pins gt0/RXOUTCLK]
1.3 Generated Clocks生成时钟
生成时钟的种类:(1)用户定义的时钟;(2)由MMCMx/PLL or BUFR、ODDR等推断出的时钟;
示例1:用户定义的时钟
方法1:
约束如下:
(1)首先这类约束要先指定源时钟
create_clock -period 10.000 -name clkin -waveform {0.000 5.000} [get_ports clkin]
(2)然后对生成时钟进行约束
方法1:将主时钟端点作为源
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2\[get_pins REGA/Q
方法2:将REGA时钟作为源
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 \[get_pins REGA/Q]
方法2:
对于与源时钟有固定相位关系的生成时钟也可以这样约束:
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] \-edges {1 3 5} [get_pins REGA/Q]
示例2:由MMCMx/PLL or BUFR /ODDR的推断出的时钟
推断时钟案例1:MMCMx推断的时钟
对于这类时钟在不需要使用它作为其余约束源时,可以不进行约束,只需要约束primary clock,VIVADO后会自动推导生成时钟的约束;
但是要使用这类约束时就需要重新对生成时钟进行重新命名,其意义在于便于后续约束的引用;
约束如下:
(1)首先对源时钟进行约束
create_clock -period 10.000 -name clkin -waveform {0.000 5.000} [get_ports clkin]
(2)对CLKOUT的时钟进行重命名
create_generated_clock -name clkout [gee_pins clkip/mmcm0/CLKOUT]
这样以后以此生成时钟为基础的约束即可使用clkout为源时钟名称进行约束了;但是这种做法有局限性,如果自动生成的时钟已被重新命名,且后续约束采用了该名称,那么更改时钟名称则会报错;因此,为了保持约束的独立性,使时钟不受命名干扰可采用如下方式,但显然这样略显繁琐,不便于书写阅读;
get_clocks –of_objects [get_pins clkip/mmcm0/CLKOUT]
get_clocks –of_objects [get_nets clkip/cpuclk]
这种不便SDC提供了另外一种方式“虚拟时钟”来解决这个问题,后面单独一个章节来讲解;
推断时钟案例2:ODDR生成的随路时钟
在源同步应用中,时钟由源端(发送数据端)重新生成,并随同步数据传送给目的端(捕获数据端)。这个时钟称为随路时钟,通常由ODDR 或 OSERDES生成,需要通过create_generated_clock对该时钟约束,以便创建输出延迟约束(set_output_delay)时将器作为参考时钟使用,如图:
约束如下:
create_generated_clock -name fwd_clk –multiply_by 1 -source [get_pins ODDR_inst/C] \[get_ports clkout]
在源同步设计中,还有一种情形也较为常见,即输出时钟与发送数据时钟相反,而这种反向也是通过ODDR实现的,此时ODDR的D1端口为“0”,而D2端口为“1”,如图:
输出时钟域发送数据时钟相反,约束如下:
(1)约束源时钟
create_clock -period 10.000 -name clk -waveform {0.000 5.000} [get_ports clk]
(2)约束生成时钟
create_generated_clock –name fwd_clk –invert –divide_by 1 -source [get_ports clk] \[get_ports fwd_clk]
–invert表明了输出时钟与源时钟反向,其中使用–divide_by而非–multiply_by,意在说明两者的默认值为1,–divide_by、–multiply_by和-edges三者必须存在其一;
1.4 时钟分组约束
VIVADO时序分析工具是默认设计中的所有时钟是同步的,对于异步时钟我们需要做出以下约束,告诉VIVADO这些时钟是异步的。
create_clock -period 10.000 -name clka -waveform {0.000 5.000} [get_ports clka]
create_clock -period 14.000 -name clkb -waveform {0.000 7.000} [get_ports clkb]
set_clock_groups -asynchronous -group [get_clocks clka] -group [get_clocks clkb]
对于使用了CLKMUX的统一路径上不同频率的时钟也采用该方法,如图所示:
create_clock -period 10.000 -name clk0 -waveform {0.000 5.000} [get_ports clk0]
create_clock -period 14.000 -name clk1 -waveform {0.000 7.000} [get_ports clk1]
set_clock_groups –logically_exclusive \ -group [get_clocks clk0] -group [get_clocks clk1]
不要急着跑,干货在后面,下一篇文章传送门在此:
https://blog.csdn.net/qq_33486907/article/details/94429887
本系列博客对应的完整《时序约束手册》传送在此,点击下方下载链接一:
https://download.csdn.net/download/qq_33486907/19846182
或点击下载链接二:https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.22131debncNwzA&id=588531553802
推荐使用链接一,链接二即将停止服务
TIMING_05 VIVADO环境下的时序约束 之 基本时钟周期约束相关推荐
- TIMING_06 VIVADO环境下的时序约束 之 输入延迟约束
由于该系列文章阅读有顺序性,所以请跳转至该系列文章第一篇从头开始阅读,并按照文章末尾指示按顺序阅读,否则会云里雾里,传送门在此: https://blog.csdn.net/qq_33486907/ ...
- vivado环境下实现比较器
** vivado环境下实现比较器 ** 比较逻辑功能 比较器要实现的功能比较简单,即:当A>B时,输出AGTB值为1:否则为0.在AGTB=0的情况下,为了更精准地看到究竟是A=B还是A< ...
- vivado环境下用Verilog语言实现编码器
** vivado环境下用Verilog语言实现编码器 ** 编码器的分类 编码器通常分为两大类: 普通编码器和优先编码器. 其中,普通编码器对某一个给定时刻只能对一个输入信号进行编码的编码器, 它的 ...
- 4 FPGA时序约束理论篇之时钟周期约束
时钟周期约束 时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束. 下面我们讲一些Vivado中时钟约束指令. 1. Create_cloc ...
- Vivado环境下基于FPGA的IP实现FFT变换
这里写自定义目录标题 环境 层次结构 仿真 实现 HDL 顶层文件 仿真文件 dds文件 IP配置 FFT ROM COE文件生成 reference 环境 Vivado Modelsim 仿真 层次 ...
- 3 FPGA时序约束理论篇之IO约束
I/O约束 I/O约束是必须要用的约束,又包括管脚约束和延迟约束. 管脚约束 管脚约束就是指管脚分配,我们要指定管脚的PACKAGE_PIN和IOSTANDARD两个属性的值,前者指定了管脚的 ...
- 论文:Elastic Scheduling for Microservice Applications in Clouds (云环境下微服务应用的弹性调度)
Elastic Scheduling for Microservice Applications in Clouds (云环境下微服务应用的弹性调度) 摘要: 微服务被广泛用于灵活的软件开发.最近,容 ...
- 6 FPGA时序约束理论篇之xdc约束优先级
xdc约束优先级 在xdc文件中,按约束的先后顺序依次被执行,因此,针对同一个时钟的不同约束,只有最后一条约束生效. 虽然执行顺序是从前到后,但优先级却不同:就像四则运算一样,±x÷都是按照从 ...
- 如何在FPGA设计环境中加时序约束 SDC (Z)
如何在FPGA设计环境中加时序约束 在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序的约束.通常,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器, ...
最新文章
- java线程 打印_java多线程实现 5秒一次打印当前时间
- 二叉树的深搜(DFS)与广搜(BFS)
- mysql 快速升级_MySQL 4到5的快速升级
- java中的後綴表達式_求Java堆栈,将中缀算术表达式转换成后缀表达式。
- 被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验
- 计算机图形学(三)——实验三:圆的生成算法
- VB2010(18)_各种对话框的使用
- java动态生成pdf 合并两个pdf文件功能三
- JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
- 付呗聚合支付快速教程 分账篇②——分账提现接收方入驻与查询
- html alert字体颜色,js里alert里的字体颜色怎么设置:字体颜色方法;fontcolor(color)...
- 基于Java+控制台实现车辆信息管理系统
- 教师学计算机内容包括哪些,中学计算机教师类论文参考文献 中学计算机教师核心期刊参考文献有哪些...
- 2021.11.25 小组加分制度的破绽
- Linux学习笔记-RH135之Apache的管理及优化
- 如何从ST官网下载STM32标准外设库
- 基于how-to-optimize-gemm初探矩阵乘法优化
- Codeforces」 Round #782 (Div. 2) A —D
- 匈牙利算法的基本原理与Python实现
- 如果银行想开挂,RPA机器人舍我其谁?
热门文章
- 如何在S/4HANA里创建Custom Business object并实现自定义逻辑
- 如何让Filddler抓包时忽略某些主机名
- TREX搜索的执行最后也是通过HTTP call来完成的
- an example of Ascii using 问号 as example
- 使用ST05 研究product extension field deletion
- why FOR ALL ENTRIES is not considered at all in one order search
- 在lean trace mode下运行function
- SAP CRM Collection wrapper的publish_current用法
- C4C的Rich text editor的JavaScript实现
- 使用nodejs将某个简书用户的文章进行导出