时序约束进阶三:Create_clock与Create_Generated_Clock详解

目录

一、前言

二、生成时钟

2.1 示例设计

2.2 主时钟约束

1)约束对象解析

2)约束到非时钟位置

2.3 生成时钟约束

1)无约束

2)倍频约束

3)生成时钟的主时钟约束不正确

4)使能时钟控制的约束

5)通过时钟边沿设置生成时钟

6)非整数倍频生成时钟

三、参考资料


一、前言

        时序约束中,使用Create_clock约束来生成主时钟,主时钟可以说是设计的心脏。主时钟是来自FPGA芯片外部的时钟,通过时钟输入端口或高速收发器GT的输出引脚进入FPGA内部。对于赛灵思7系列的器件,主时钟必须手动定义到GT的输出,对于Ultrascale和Ultrascale+系列的器件,定时器会自动地接入到GT的输出

        生成时钟通常来源于设计内部的时钟管理单元,如MMCM,PLL等,生成时钟是与主时钟(使用create_clock创建的时钟)相关,其来源来自主时钟或其他生成时钟。因此,需先定义主时钟,再定义生成时钟。优点是主时钟变化时生成时钟会同步进行变化

        生成时钟与主时钟关系可以是分频,倍频,非整数倍频率,相移,占空比切换,以及上述关系的组合。

二、生成时钟

2.1 示例设计

下面用于示例的设计代码如下

module all_timing(CLKIN1,CLKIN2,CLKINSEL,CLKFBIN,clk1,rst,d1,ff2,ff2_pll);
input CLKIN1,CLKIN2,CLKINSEL,CLKFBIN,clk1,rst,d1;
output ff2,ff2_pll;
reg ff1,ff2,ff1_pll,ff2_pll;
wire CLKOUT0;
PLLE2_ADV #(.BANDWIDTH("OPTIMIZED"),  // OPTIMIZED, HIGH, LOW.CLKFBOUT_MULT(2),        // Multiply value for all CLKOUT, (2-64).CLKFBOUT_PHASE(0.0),     // Phase offset in degrees of CLKFB, (-360.000-360.000).// CLKIN_PERIOD: Input clock period in nS to ps resolution (i.e. 33.333 is 30 MHz)..CLKIN1_PERIOD(0.0),.CLKIN2_PERIOD(0.0),// CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT (1-128).CLKOUT0_DIVIDE(4),.CLKOUT1_DIVIDE(2),.CLKOUT2_DIVIDE(4),.CLKOUT3_DIVIDE(5),.CLKOUT4_DIVIDE(1),.CLKOUT5_DIVIDE(1),// CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT0_DUTY_CYCLE(0.4),.CLKOUT1_DUTY_CYCLE(0.5),.CLKOUT2_DUTY_CYCLE(0.5),.CLKOUT3_DUTY_CYCLE(0.5),.CLKOUT4_DUTY_CYCLE(0.5),.CLKOUT5_DUTY_CYCLE(0.5),// CLKOUT0_PHASE - CLKOUT5_PHASE: Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT0_PHASE(0.0),.CLKOUT1_PHASE(0.0),.CLKOUT2_PHASE(0.0),.CLKOUT3_PHASE(0.0),.CLKOUT4_PHASE(0.0),.CLKOUT5_PHASE(0.0),.COMPENSATION("INTERNAL"),   // ZHOLD, BUF_IN, EXTERNAL, INTERNAL.DIVCLK_DIVIDE(1),        // Master division value (1-56)// REF_JITTER: Reference input jitter in UI (0.000-0.999)..REF_JITTER1(0.0),.REF_JITTER2(0.0),.STARTUP_WAIT("FALSE")    // Delay DONE until PLL Locks, ("TRUE"/"FALSE"))PLLE2_ADV_inst (// Clock Outputs: 1-bit (each) output: User configurable clock outputs.CLKOUT0(CLKOUT0),   // 1-bit output: CLKOUT0.CLKOUT1(CLKOUT1),   // 1-bit output: CLKOUT1.CLKOUT2(CLKOUT2),   // 1-bit output: CLKOUT2// Feedback Clocks: 1-bit (each) output: Clock feedback ports.CLKFBOUT(CLKFBOUT), // 1-bit output: Feedback clock// Clock Inputs: 1-bit (each) input: Clock inputs.CLKIN1(CLKIN1),     // 1-bit input: Primary clock.CLKIN2(CLKIN2),     // 1-bit input: Secondary clock// Control Ports: 1-bit (each) input: PLL control ports.CLKINSEL(CLKINSEL), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2.RST(rst),           // 1-bit input: Reset// Feedback Clocks: 1-bit (each) input: Clock feedback ports.CLKFBIN(CLKFBIN)    // 1-bit input: Feedback clock);// End of PLLE2_ADV_inst instantiationalways@(posedge CLKOUT0,negedge rst)if(!rst)beginff1_pll<=1'b0;endelse beginff1_pll<=d1;endalways@(posedge CLKOUT0,negedge rst)if(!rst)ff2_pll<=1'b0;else beginff2_pll<=ff1_pll;endalways@(posedge clk1,negedge rst)if(!rst)ff1<=1'b0;else beginff1<=d1;end
always@(posedge clk1,negedge rst)if(!rst)ff2<=1'b0;else beginff2<=ff1;endendmodule 

2.2 主时钟约束

    主时钟的约束较为简单,设置时钟名Clock name,约束对象Source objects,波形设置Waveform,同一个对象设置多条约束是否不被覆盖Add this clock to the existing clock。

1)约束对象解析

约束对象可为port,net,pin三种类型,当约束在input为时钟的port上时,port和net效果相同,约束在pin上时,则port和net上的约束会失效。

如对clk1的port和net同时约束

create_clock -period 10.000 -name clk1_port -waveform {0.000 5.000} -add [get_ports clk1]
create_clock -period 10.000 -name clk1_net -waveform {0.000 5.000} -add [get_nets clk1]

查看时序分析结果,两者的分析结果一致

在上述约束的基础上,在添加对pin的约束,约束如下

create_clock -period 4.000 -name clk1_port -waveform {0.000 2.000} -add [get_ports clk1]
create_clock -period 10.000 -name clk1_net -waveform {0.000 5.000} -add [get_nets clk1]
create_clock -period 10.000 -name clk1_pin -waveform {0.000 5.000} -add [get_pins clk1_IBUF_inst/I]

时序分析结果此时只有clk1_pin,不存在clk1_port和clk1_net,原因是clk1_pin在前两者传输的路径上,因此前面两者的时钟传播中断到clk1_IBUF_inst/I

2)约束到非时钟位置

create_clock -period 10.000 -name port_d1 -waveform {0.000 5.000} -add [get_ports d1]

此时约束不生效,但不会有相关提示

2.3 生成时钟约束

1)无约束

对于设计中有PLL、MMCM单元时,如果用户未设置生成时钟约束,软件会自动创建生成时钟,以上述工程为例,如果没有对clkout设置create_generated_clock约束时,查看时序报告,对于clkout0存在2个生成时钟CLKOUT0_1和CLKOUT0,对应的主时钟分别是clkin2和clkin1,同时在Intra-clock Paths中有对应的时序路径

对应自动生成的生成时钟,看频率都是主时钟的二分频,该配置怎么来的?查看设计会发现在配置中存在,集CLKOUT0_DIVIDE和CLKBOUT_MULT,分别是分频系数和倍频系数,先4分频再2倍频,最终是2分频

除了示例中的pll外,MMCM/BUFR,以及在UltraScale器件中,还包括GT_COMMON/GT_CHANNEL/IBUFDS_GTE3,ISERDESE3,BITSLICE_CONTROL / RX*_BITSLICE的时钟输出端口都能自动产生生成时钟

2)倍频约束

clkin2的周期为5ns,占空比为80%,gen_clkout0为clkin2的2倍频时钟

create_clock -period 5.000 -name clkin2 -waveform {0.000 4.000} -add [get_nets CLKIN2]
create_generated_clock -name gen_clkout0 -source [get_pins PLLE2_ADV_inst/CLKOUT1] -multiply_by 2 -add -master_clock clkin2 [get_pins PLLE2_ADV_inst/CLKOUT0]

查看结果,gen_clkout0为clkin2的等比例缩小

3)生成时钟的主时钟约束不正确

下面对Pll的clkin2输入端口设置生成时钟,源时钟为clk1,但实际设计中clk1和clkin2完全是独立的

create_generated_clock -name gen_clkin2 -source [get_ports clk1] -multiply_by 2 -add -master_clock clk1_port [get_ports CLKIN2]

如果生成时钟的主时钟非实际主时钟,在Tcl Console窗口将会有如下告警提示,下方还有相应的解决方法Resolution

CRITICAL WARNING: [Timing 38-249] Generated clock gen_clkin2 has no logical paths from master clock clk1_port.

4)使能时钟控制的约束

    对于下图所示,触发器的输出作为时钟,来源都是clk1,这种结构的优点是时钟和数据的路径相同,从而传输延迟相同。此时对于下一级的时钟需要设置生成时钟约束,同时需勾选-combinational。

create_generated_clock -name ff_genclk -source [get_ports clk1] -multiply_by 1 -combinational -add -master_clock clk1_port [get_pins clk_div_reg/Q]

时钟报告中ff_genclk如下

5)通过时钟边沿设置生成时钟

 通过源时钟的边沿设置生成时钟,以下图为例。

对应的命令为create_generated_clock -name gen_clk -source [get_pins clk_IBUF_BUFG_inst/O] -edges {1 3 4} -edge_shift {2.0 0.0 1.0} -add -master_clock [get_clocks  "*"] [get_pins {shiftr_reg[13]/C}]

含义解释:-edge {1,3,4}即生成时钟的第1个上升沿位置,第1个下降沿位置,第2个上升沿位置分别对应源时钟的第1,3,4个变化边沿,-edge_shift的3个值为在源时钟基础上的偏移。假设源时钟clk周期为10ns,占空比为50%,从0时刻开始,统计了边沿变化的数目,-edge {1,3,4}如中间波形所示,对应了clk第1,3,4的边沿;Generate clk即为各个边沿的偏移值,分别是0+2,10+0,15+1,即为Generate clk的波形。

示例如下图

a.二分频的生成时钟实现用寄存器实现

主时钟周期为10ns,对应的约束命令为

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]  #创建生成时钟

b.边沿生成时钟

时钟边沿设置生成时钟,对应命令为,由波形可看出生成时钟的3个边沿刚好对应主时钟的第1,3,5,因为无偏移,故不需要-edge_shift,

create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5}  [get_pins REGA/Q]

生成时钟的波形clkdiv2如下图所示

6)非整数倍频生成时钟

    通过同时设置倍频和分频可以设置非整数倍的生成时钟频率,如果需要生成一个4/3倍频的生成时钟,先用倍频参数multiply_by 4,再用分频参数divide_by 3。

create_generated_clock -name clk43 -source [get_pins mmcm0/CLKIN] -multiply_by 4 -divide_by 3 [get_pins mmcm0/CLKOUT]

三、参考资料

《ug903-vivado-using-constraints-en-us-20232.pdf》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142703.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

格式化u盘选择FAT还是NTFS U盘和硬盘格式化两者选谁

Mac用户在将U盘或硬盘进行格式化时&#xff0c;选择FAT还是NTFS往往是一个让人纠结的问题。很多用户不知道这两个格式之间有什么区别&#xff0c;更不知道在格式化时如何做出选择。本文将为大家介绍Mac选择FAT还是NTFS&#xff0c;并为大家推荐U盘和硬盘格式化两者选谁。 一、…

OpenCVHaar级联器实现人脸捕捉和微笑检测

概念 Haar 级联分类器是由多个简单分类器组成的复杂分类器&#xff0c;每个简单分类器都由 Haar 特征训练得到。Haar 级联器因其简单和快速而被应用于某些场景。OpenCV 提供多种预训练的 Haar 特征级联分类器&#xff0c;其已经在大量图像上进行了训练&#xff0c;并且针对特定…

【程序员写的诗】《悔思践》日期:2017-05-20 作者:橙 附:AI豆包点评和解释

悔思践 《悔思践》 日期&#xff1a;2017-05-20 作者&#xff1a;橙 问君心&#xff0c;愁几何。 望空杯&#xff0c;颜现愁。 苦衷苦&#xff0c;鸿志立。 乐中乐&#xff0c;断践行。 不践行&#xff0c;愁中悔。 悔中望&#xff0c;年已高。 鸿志行&#xff0c;行中思。 苦…

SH17:个人防护设备检测数据集(猫脸码客 第189期)

SH17 Dataset for PPE Detection 一、引言 在当今快速发展的工业社会中&#xff0c;工作场所事故仍频繁发生&#xff0c;对人类安全构成重大威胁&#xff0c;尤其是在建筑、制造等高风险行业中。为了有效减少这些事故带来的伤害&#xff0c;个人防护设备&#xff08;Personal…

不止于纸上谈兵,用代码案例分析如何确保RabbitMQ消息可靠性?

文章目录 文章导图可靠性分析-RabbitMQ 消息丢失的三种情况生产者发送可靠性消息实现2种方式1、采用事务消息事务消息投递方案设计1、本地库创建一个消息表(t_msg)2、事务消息投递的过程知识点拓展&#xff1a;Spring事务同步器 3、异常情况4、消息投递补偿job 核心代码讲解发送…

PyQt5-loading-圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…

2024ICPC网络赛1: C. Permutation Counting 4

题意&#xff1a; 给定 n n n个区间 [ L i , R i ] [L_i,R_i] [Li​,Ri​]设集合 A { { p i } ∣ p i 为排列&#xff0c; L i < p i < R i } A\{ \{ p_i\} | p_i为排列&#xff0c;Li<p_i<R_i\} A{{pi​}∣pi​为排列&#xff0c;Li<pi​<Ri​}&#xff…

Facebook直播限流是什么原因?是ip地址导致的吗

随着社交媒体和直播行业的蓬勃发展&#xff0c;Facebook直播已成为众多企业和个人进行品牌推广、产品展示和互动交流的重要平台。然而&#xff0c;在享受直播带来的便利与效益的同时&#xff0c;不少用户也面临着直播限流的困扰。本文将探讨Facebook直播限流的原因&#xff0c;…

京东App秒级百G日志传输存储架构设计与实战

本文作者&#xff1a;平台业务研发部-武伟峰&#xff0c;数据与智能部-李阳 背景 在日常工作中&#xff0c;我们通常需要存储一些日志&#xff0c;譬如用户请求的出入参、系统运行时打印的一些info、error之类的日志&#xff0c;从而对系统在运行时出现的问题有排查的依据。 …

8.1 溪降技术:横渡绳

目录 8.1 横渡绳将其置于上下文中&#xff1a;观看视频课程电子书&#xff1a;横渡绳一级横渡绳&#xff1a;识别使用横渡绳固定到横渡绳V7提示&#xff1a;保持张力中间点通过横渡绳上的中间点固定到锚点总结 8.1 横渡绳 绳上移动 横渡绳是一条水平安全绳&#xff0c;探险者可…

Leetcode—移除链表元素

题目描述 思路 创建新链表&#xff0c;将原链表中的值不为val的结点尾插到新链表中 画图解释 定义一个指针pcur去遍历原链表&#xff0c;创建一个空链表&#xff0c;newHead和newTail在初始情况指向空。 pcur遍历原链表不为val的结点尾插到新链表中 完整代码 /*** Definitio…

分治算法归并排序

分治算法 基本概念 把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并。 分治法的基本步骤 分治法在每一层递归上都有三个步骤&#xff1a; step1分…

Linux内核(Kernel)启动过程分析

文章目录 Linux内核&#xff08;Kernel&#xff09;启动过程一、内核启动的基本流程1. 启动加载程序 (Bootloader)2. 内核解压阶段3. 内核启动&#xff08;Kernel Startup&#xff09;4. start_kernel函数5. 启动初始进程 二、内核文件加载及解压缩1.为什么是压缩文件2.文件类型…

找搭子是什么意思?有没有找搭子的平台?靠谱找搭子软件推荐!

“找搭子” 指寻找在特定活动或兴趣方面有共同爱好的伙伴。比如饭搭子一起吃饭&#xff0c;运动搭子共同健身。它满足人们在特定场景下的社交需求&#xff0c;让生活更丰富有趣&#xff0c;是一种新型社交方式。以下是国内排名靠前的找搭子平台 1. 咕哇找搭子小程序&#xff1a…

Bio-Linux-shell详解-2-基本Shell命令快速掌握

Bio-Linux-shell详解-1-从0开始-CSDN博客 想了解基本知识可以先看上文&#xff0c;本次我们讲述一些Shell的基本命令。 目录 1.shell输入命令 2.man命令查看说明文档 3.文件查看命令 &#xff08;1&#xff09;linux文件结构 &#xff08;2&#xff09;cd切换工作目录 &…

SOCKS4和SOCKS5的区别是什么?

SOCKS4和SOCKS5是两种常用的网络代理协议&#xff0c;它们在功能、性能和应用场景上存在一些关键的区别。以下是对这两种协议区别的详细解析&#xff1a; 1. 支持的协议类型 SOCKS4&#xff1a;只支持TCP协议&#xff08;传输控制协议&#xff09;。这意味着SOCKS4代理只能用…

春秋云境靶场之CVE-2022-29464

一.靶场环境 1.下载靶场 根据题目提示&#xff0c;存在文件上传漏洞 2.启动靶场 打开之后&#xff0c;页面显示 然后就跳转到一个登录页面 二.登录页面 1.尝试登录 我们尝试弱口令登录admin,admin&#xff0c;跳转到连接超时页面 当我们再次点击这个链接后&#xff0c;就会…

旋转链表问题(python3)

旋转链表 问题描述解题思路代码实现 问题描述 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 链表中节点的数目在范围 [0, 500] 内-100 < Node.va…

队列-------

队列总览 队列的定义 队列的基本操作 队列回顾 顺序队列总览 队列的顺序实现 队列的初始化 入队操作&#xff0c;rear&#xff0c;后面的&#xff0c;下一个队列元素要插入的位置。front&#xff0c;前面的&#xff0c;当前队列的第一个元素。 循环队列入队操作 循环…

基于windows的mysql5.7安装配置教程

目录 0.写在前面的话 1.下载安装包 2.进行目录选择和解压操作 3.配置环境变量 4.创建my.ini文件 5.管理员运行终端 6.安装mysqld 7.初始化数据库 8.启动mysql服务 9.进入mysql管理终端 10.修改root密码 11.刷新权限 12.注销内容 13.重启mysql 14.输入密码测试 1…