基于Xlinx的时序分析与约束(5)----衍生时钟约束

news2024/11/23 16:32:35

衍生时钟约束语法

        衍生时钟(Generated Clocks,又称为生成时钟)是指由设计中已有的主时钟通过倍频、分频或者相移等操作后产生的新的时钟信号,如由MMCM或PLL或由组合逻辑生成的倍、分频时钟信号。

        衍生时钟约束必须指定时钟源,在对衍生时钟进行约束时,并不指直接对其周期、相位等进行描述,而是描述其与源时钟的关系,如倍频因子、分频因子、相位关系等。衍生时钟与源时钟之间的关系可以是:

  • 简单的频率分频
  • 简单的频率倍频
  • 频率倍频与分频的组合,获得一个非整数的比例,通常由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>

  • \是换行符号
  • -name后的generated_clock_name是用于指定的衍生时钟名
  • -source后的 master_clock_source_pin_or_port 是源时钟的物理节点,源时钟可以是一个主时钟、虚拟时钟或者衍生时钟
  • -multiply_by后是衍生时钟相对于源时钟的倍频系数,值必须大于等于1.0
  • -divide_by后是衍生时钟相对于源时钟的分频系数,值必须大于等于1.0
  • <pin_or_port>是衍生时钟的物理节点

例1:2分频的衍生时钟约束

        下图中,主时钟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]


例2:-edges选项描述的2分频衍生时钟 

        除了用选项-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个边沿。通过这种边沿之间的对应关系间接描述了源时钟与衍生时钟之间的倍、分频关系。


例3:-edges选项与-edge_shift描述的衍生时钟(占空比改变) 

        下图是一个用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}共同表示:

  • 衍生时钟的第一个上升沿在源时钟的第1个边沿并加上2.5ns的相移,即其在0+2.5=2.5ns处
  • 衍生时钟的第一个下降沿在源时钟的第2个边沿并加上0ns的相移,即其在5+0=5ns处
  • 衍生时钟的第二个上升沿在源时钟的第3个边沿并加上2.5ns的相移,即其在10+2.5=2.5ns处

例4:同时使用-divide_by 和 -multiply_by

        假设例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

        代码主要实现的功能:

  • 输入时钟50M的sys_clk,经PLL后倍频到100M的pll_clk
  • 100M的pll_clk使用组合逻辑2分频到50M的clk_div2

(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:


  • 📣博客主页:wuzhikai.blog.csdn.net
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵
  • 📣您有任何问题,都可以在评论区和我交流📞!
  • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

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

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

相关文章

【高级篇04】MySQL逻辑架构

文章目录第四章&#xff1a;逻辑架构逻辑架构SQL执行流程数据库缓冲池第四章&#xff1a;逻辑架构 逻辑架构 第一层&#xff1a;连接层。客户端访问MySQL服务器&#xff0c;首先建立TCP连接&#xff0c;经过三次握手建立连接成功后&#xff0c;MySQL服务器对TCP传输过来的账号…

各个集合比较

1、 Queue与Deque的区别 引言&#xff1a; 在研究java集合源码的时候&#xff0c;发现了一个很少用但是很有趣的点&#xff1a;Queue以及Deque&#xff1b; 平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用&#xff0c;但是一直都不知道Queue的作用&#x…

微信小程序入门

目录 一&#xff0c;简介 二&#xff0c;小程序开发环境搭建 1.申请账号 2.安装开发工具 3.小程序工具使用 三&#xff0c;目录结构以及json配置 1.目录结果 2.json配置 3.JSON 语法 4.WXML 5.wxss 6.JS 逻辑交互 四&#xff0c;小程序宿主环境 1.程序与页面 2.组件…

DFMEA之严重度/频度/探测度/风险优先系数

文章目录介绍严重度频度探测度风险优先系数介绍 在实施DFMEA阶段中&#xff0c;要求、潜在失效模式、潜在失效后果、潜在失效原因和现有设计控制措施等 5 个为基础项, 它们的分析是决定 DFMEA实施成功与否的关键&#xff1b;严重度&#xff08;S&#xff09;&#xff0c;频度&a…

4.2、网络层提供的两种服务

1、面向连接的虚电路服务 虚电路服务的核心思想&#xff1a;可靠通信由网络自身来保证\color{red}可靠通信由网络自身来保证可靠通信由网络自身来保证 当两台计算机进行通信时&#xff0c;必须建立网络层的连接\color{red}网络层的连接网络层的连接----虚电路VC\color{red}虚…

centos7搭建DNS服务(use)

参考&#xff1a;centos7搭建DNS服务完整版 CentOS 7 配置DNS服务 Centos7 DNS 服务器配置步骤 --use DNS服务类型 主机记录记录类型记录值ns1A192.168.1.1ns2A192.168.1.2wwwA192.168.1.100bbsCNAMEwwwftpA192.168.1.110mailMX 10192.168.1.120 一、服务配置 1.1 关闭SELi…

模型实战一之YOLOv7实例分割、模型训练自己数据集

模型实战一之YOLOv7实例分割、模型训练自己数据集 1.环境准备 下载yolov7实例分割模型&#xff1a; git clone https://github.com/WongKinYiu/yolov7.git -b mask yolov7-maskcd yolov7-mask安装环境 #查看已安装环境 conda info --envs #查看安装了哪些包 conda list#创建…

IMX6ULL学习笔记(15)——GPIO输出接口使用【官方SDK方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同&#xff0c;例如 GPIO1 拥有 32 个引脚&#xff0c; GPIO2 拥有 22 个引脚&#xff0c; 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

市级数字政府电子政务大数据中心项目建设和运营方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;不得作商业用途。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1 大…

【QTimeEdit | QDateEdit | QDateTimeEdit | QCalendarWidget | QLCDNumber】

【QTimeEdit | QDateEdit | QDateTimeEdit | QCalendarWidget | QLCDNumber】【1】UI界面设计【2】相关头文件【3】构造函数初始化【4】setDate | setTime | setDateTime | currentDate | currentTime | currentDateTime【5】maximumDate | maximumTime | minimumDate | minimu…

基于Java+SpringBoot+vue等疫情期间网课管理系统详细设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅收藏&#x1f447;&…

使用Prometheus和Grafana监控Apache Doris

目录1. 介绍2. Prometheus和Grafana的简单使用3. 配置Prometheus的prometheus.yml4. 下载Doris Dashboard模板1. 介绍 Doris的FE和BE通过http端口metrics路径&#xff0c;将监控数据暴露出来&#xff0c;以key-value的文本形式对外展现&#xff0c;每个key还可能有不同的Label…

Nacos注册中心

【Spring Cloud Alibaba】 1. Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud …

微信小程序开发—入门到跑路(五)

文章目录1. 今日目标2. 使用 npm2.1 小程序对 npm 的支持和限制问题2.2 了解什么是 vant Weapp2.3 安装 Vant 组件库问题2.4 使用 Vant 组件问题2.5 定义和使用 CSS 变量问题2.6 使用 CSS 变量定制 Vant 的主题样式问题2.7 什么是小程序 API 的 Promise 化2.8 安装并构建 minip…

运输层协议概述(计算机网络-运输层)

目录 运输层协议的位置 运输层为相互通信的应用进程提供了逻辑通信 应用进程之间的通信 客户-服务器通信模式 互联网的运输层协议 UDP 与 TCP 运输层的复用与分用 运输层端口的概念 端口在进程之间的通信中所起的作用 端口号 运输层协议的位置 从通信和信息处理的角度…

2022年终总结(脚踏实地,仰望星空)

2022年终总结 回忆录 2022年焦虑和快乐是这一年中最大的两种情绪了。焦虑主要是因为心里的三块石头&#xff0c;从年初就开始悬着。第一块石头&#xff0c;科研论文录用&#xff0c;第二个石头&#xff0c;拿到国奖&#xff0c;第三个石头是拿到满意的offer。目前只剩下最后一…

网络实验之EtherChannel技术实践

一、EtherChannel简介 EtherChannel简单来说就是将多个物理端口绑定为一个逻辑端口&#xff0c;通过多个端口绑定&#xff0c;能充分利用现有端口来增加带宽。构成etherchannel的端口必须配置成相同的特性&#xff0c;如双工模式、速度、同为FE或GE端口、native VLAN,、VLAN ra…

C++11标准模板(STL)- 算法(std::inner_product)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 计算两个范围的元素的内积…

十七、Docker Compose容器编排第二篇

在上一篇中我们讲解了容器编排是什么、能干什么、怎么安装、使用步骤&#xff0c;如果没有看的大家可以先看下&#xff1a;https://blog.csdn.net/u011837804/article/details/128335166&#xff0c;然后继续看这一篇&#xff0c;好了&#xff0c;我们继续。 1、Docker Compons…

gl-Camera

我的服务原文访问&#xff1a;Camera 1.创建摄像机的坐标系&#xff0c;&#xff08;创建原理&#xff0c;两条直线求其法向量&#xff09; Z轴:在世界坐标中指向摄像机的向量&#xff08;D&#xff09; X轴&#xff1a;随便找一个向上量和Z向量求出的法向量就是X轴&#xf…