学习笔记------时序约束之时钟周期约束

本文摘自《VIVADO从此开始》高亚军

主时钟周期约束

主时钟,即从FPGA的全局时钟引脚进入的时钟或者由高速收发器输出的时钟。

对于时钟约束,有三个要素描述:时钟源,占空比和时钟周期。
单端时钟输入
这里我们新建一个工程,clk为100mhz时钟,占空比为50/50,clk1为125mhz,占空比为75/25。这里我们需要用到create_clock来创建时钟。
直接使用report clock networks发现有两个时钟,clk和clk1。

create_clock -period 10.000 -name clk -waveform {0.000 5.000} [get_ports clk]
使用creat_clock创建时钟,-period为周期,-name为时钟的名字,-waveform决定了占空比,这里上升沿在0ns处,下降沿在5ns处。
同理创建clk1时钟约束。

create_clock -period 8.000 -name clk1 -waveform {0.000 6.000} [get_ports clk1]

周期为8ns,占空比为75/25。
上述创建的时钟名字叫clk,clk1,在当时还好记住,但是时间长了确实不知道这两个时钟干啥的。
这里我在实际工程中发现有的喜欢用clk_xxmhz来命名时钟,但是在实际过程中发现,在不看约束的情况下往往会被这类时钟的名字误导,比如从pcie出来的时钟,如果采用的gen2。用于axi处理的时钟是125mhz,这里就将该时钟命名为clk_125mhz,其他模式为了统一,也就使用了该名字去写代码,但是在于实际过程中,发现gen2的速度不够,改为gen3,这时候axi时钟就来到了250mhz,往往在调试的过程中,这个时钟的名字大家都不愿意时刻修改,造成了实际使用的250mhz时钟而时钟名字又叫clk_125mhz这样的误解。所以这里我在实际使用中把这个时钟命令为clk_pcie,clk_dac,clk_ddr,clk_adc,这样可以通过名字区分该信号是处于哪一个时钟域下。
差分时钟输入约束
新增差分时钟clk_led2_p,clk_led2_n。输入为200mhz,占空比为50%。
对于差分时钟输入,我们只需要对其一端进行约束即可。

create_clock -period 5.000 -name clk_led2_p -waveform {0.000 2.500} [get_ports clk_led2_p]

时钟输入直接进入mmcm或者pll
输入clk_pll,输入时钟312.5mhz,单端。

选择信号源,如果进入pll的时钟直接从引脚上输入进来就选择single ended clock capable pin或者differential clock capable pin。如果是输入时钟先经过IBUF在进入pll则直接选择nobuffer。
进入pll或者mmcm的时钟一般不需要再进行时钟约束,可以在ip的xdc文件中找到相关的约束。

生成时钟周期约束

生成时钟分为两种,自动生成的时钟和用户逻辑生成的时钟。自动生成的时钟包括由MMCM/PLL,BUFR(7系列FPGA)和BUFGCE_DIV(Ultrascale系列FPGA)生成的时钟。对于上述的这些时钟,工具会自动的根据其与输入时钟的关系自动推断出时钟周期、占空比,以及该时钟与输入时钟的相位关系。
第二种就是用户使用逻辑生成的时钟。事实上,在FPGA设计中,只有在时钟频率很低或者扇出很小的情况下才可能使用该时钟。这是因为这类时钟通常由组合逻辑和时序逻辑生成,时钟质量很差。这类情况在逻辑中还是很常见,一些低速总线上,比如说uart,iic,spi上都存在这类使用情况。但是这些时钟作者往往不回去对其专门进行约束,这样导致了工具就会产生虚假的时序报告。
例如使用逻辑产生一个2分频时钟。生成的时钟再去控制其他信号。

使用report clock nerworks查看时钟。

发现并没有对其进行约束。因为这个clk_div是我们内部逻辑分频出来的时钟。所以这里创建生成时钟。

创建完成后可以看到自动生成了xdc约束语句在你的约束目标文件中。

create_generated_clock -name clk_div -source [get_pins clk_led2_BUFG_inst/O] -divide_by 2 [get_pins u_clk_div/clk_div_reg/Q]

使用第二种方式通过生成时钟与master clock的频率关系,以及-edges选项完成时钟周期约束。-edges指明了生成时钟的第1个上升沿,第1个下降沿和第2个上升沿对应于master clock的位置。该位置由master clock的0时刻上升沿开始计数。每遇到一个边沿即加1。-edges的三个数值正好对于生成时钟的一个周期。

create_generated_clock -name clk_div -source [get_pins clk_led2_BUFG_inst/O] -edges {1 3 5} -edge_shift {0.000 0.000 0.000} [get_pins u_clk_div/clk_div_reg/Q]

然而在实际的逻辑中往往不使用直接逻辑分频的时钟进always,而是使用采沿的方式来进行后续判断。

always@(posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)beginclk_div_d1 <= 1'b0;endelse beginclk_div_d1 <= clk_div;end
end//------------------------------------------------------------
//------------------------------------------------------------
always@(posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)beginled <= 1'b0;endelse if(clk_div_d1 == 1'b0 && clk_div == 1'b1 )beginled <= ~led;endelse beginled <= led;end
end

还有一种用户生成时钟的情形,即源同步设计中的随路时钟。随路时钟是指与数据同时生成的时钟,且同时给到接收端,以生成该数据在接收端的采样时钟。在源同步设计中,为了确保输出数据与输出时钟(随路时钟)具有相同的延迟,通常经过同意的电路单元(这里使用oserdes)后再输出。
这里笔者目前没有使用过这种情况。

creat_generated_clock -name vsf_clk \ -source [get_pins i_oserdes/CLKDIV] -divide_by 1 [get_ports vsf_clk]

对同一时钟源添加多个时钟周期约束

这里我们也是直接打开vivado的example bft工程。
这里可以看到输入端有两个时钟,wbclk和bftclk。

entity bft is 	  port ( wbClk, bftClk, reset : in std_logic;wbDataForInput :in std_logic;wbWriteOut: in std_logic;wbDataForOutput : out std_logic; wbInputData : in std_logic_vector (31 downto 0);wbOutputData : out std_logic_vector (31 downto 0);error : out std_logic);

从自带的约束中可以看到,wbclk时钟周期为10ns,频率为100mhz。bftclk时钟周期为5ns,频率为200mhz。
上面提到需要将wbclk时钟频率提高到150mhz。

create_clock -name wbClkA -period 10 [get_ports wbClk]
create_clock -name wbClkB -period 6.667 [get_ports wbClk] -add
create_clock -period 5 -name bftClk [get_ports bftClk]
set_clock_groups -physically_exclusive -name two_clk_grps \ -group wbClkA -group wbClkB
set_clock_groups -async -name my_async_clks \ -group [get_clocks "wbClkA wbClkB"] -group bftClk

在约束工作频率为150mhz的时钟,需要添加-add选项,否则,都一条约束就会被覆盖。同时两个时钟wbClkA和wbClkB不可能同时存在。这里就用到了set_clock_groups及-physically_exclusive选项。在声明跨时钟与路径存在异步时,用到了set_clock_groups以及选项-asynchronous简写为-async。

可以看到最终生成的时序报告。报告会针对每个时钟,生成一个wbClkA和wbClkB显示相应的时序路径。

调整时钟特性约束

对于时钟抖动(jitter),建议采用vivado的默认值进行设置。如果需要修改,则可以通过set_input_jitter命令来实现。对于时钟的不确定性(clock uncertainty),可以采用set_clock_uncertainty进行修改。例如现在由clk_led1取得的时序路径添加额外的时钟不确定性(500ps)

set_clock_uncertainty -from clk_led1 -to clk_led1 0.500

在最后的时序报告中可以看到clock uncertainty的数值。

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

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

相关文章

芯片灌封胶是什么?有哪些优点?

芯片灌封胶是什么&#xff1f;有哪些优点&#xff1f; 芯片灌封胶是一种液态复合物&#xff0c;通过机械或手工方式精准灌入装有电子元件、线路的器件内&#xff0c;在常温或加热条件下固化成为性能优异的热固性高分子绝缘材料。它广泛应用于电子元器件的粘接、密封、灌封和涂…

微信小程序自定义导航栏定位及胶囊按钮图解

在自定义小程序导航栏时&#xff0c;右上角的胶囊&#xff08;MenuButton&#xff09;在不同机型测试&#xff0c;会发现很难适配。 实测中 不同的手机&#xff0c;胶囊高度不一样、状态栏高度不一样。与模拟器显示的情况是不一样的。 由于小程序在不同的手机上顶部布局会发生…

解锁数据潜能:构建高效数据仓库的策略与实践

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;随着数据量的激增&#xff0c;企业面临着数据管理的诸多挑战。如何有效地利用这些数据&#xff0c;支持企业的决策和运营&#xff0c;成为每个企业都需要解答的问题。数据仓库的建设和数据的合理分层…

B1100 校庆

输入样例&#xff1a; 5 372928196906118710 610481197806202213 440684198612150417 13072819571002001X 150702193604190912 6 530125197901260019 150702193604190912 220221196701020034 610481197806202213 440684198612150417 370205198709275042 输出样例&#xff1a;…

牛油宝:小牛电动车的贴心管家,为您的骑行保驾护航!

在这个快节奏的时代&#xff0c;越来越多的人选择电动自行车和电摩作为日常出行的交通工具。作为小牛电动车的忠实用户&#xff0c;我深知骑行过程中的安全和保养的重要性。为了给大家带来更好的骑行体验&#xff0c;我今天要向大家推荐一款神奇的“黑科技”——牛油宝&#xf…

Edge的使用心得与深度探索

Microsoft Edge 是微软推出的一款网页浏览器&#xff0c;基于 Chromium 开源项目开发。从 2020 年开始&#xff0c;Edge 浏览器经历了一次重大更新&#xff0c;采用了与 Google Chrome 相同的浏览器引擎&#xff0c;这使得它在性能、兼容性和扩展支持方面都得到了显著改善。以下…

LInux shell编程之基础语法

目录 1、shell概述 1.1、查看Linux 提供的 Shell 解析器 1.2、bash 和 sh 的关系 1.3、查看系统&#xff08;centos&#xff09;默认使用的解释器 2、脚本的基础使用 2.1、脚本的格式 2.2、脚本的执行方式 方式一&#xff1a;采用 bash / sh 脚本的相对路径或绝对路径…

Intel性能分析工具Vtune安装和使用简介

一、介绍 Intel Vtune profiler是用于串行和多线程应用程序的性能分析工具&#xff0c;可以帮助软件开发人员对应用程序的性能问题进行分析&#xff0c;支持包括linux和windows在内的多种操作系统。主要功能包括&#xff1a; 性能分析&#xff1a;可以对应用程序进行深入的性…

单片机入门还能从51开始吗?

选择从51单片机开始入门还是直接学习基于ARM核或RISC核的单片机&#xff0c;取决于学习目标、项目需求以及个人兴趣。每种单片机都有其特定的优势和应用场景&#xff0c;了解它们的特点可以帮助你做出更合适的选择。 首先&#xff0c;我们说一下51单片机的优势&#xff1a; 成熟…

前端调用存储过程很慢,但是在数据库执行很快,解决方案

原因&#xff1a;选项可以指示 SQL Server 每次执行存储过程时都复用上一次编译的执行计划 。 有时候存储过程的执行计划会因为参数值的不同而产生变化 , 存储过程的执行计划会被缓存&#xff0c;如果存储过程的执行计划过多且占用了大量内存&#xff0c;可能会导致内存压力增加…

网络安全:绕过 MSF 的一次渗透测试

这次渗透的主站是 一个 Discuz!3.4 的搭建 违法招 piao 网站&#xff0c; 配置有宝塔 WAF 用 Discuz!ML 3.X 的漏洞进行攻击&#xff0c;但是没有成功 发现主站外链会有一个发卡网&#xff0c;引导人们来这充值&#xff0c;是 某某发卡网&#xff0c;而且域名指向也是主站的 ip…

数据库服务的运行与登录

打开数据库服务 数据库服务: SQL Server(MSSQLServer) 运行在服务器端的应用程序, 提供数据的存储 / 处理和事务等在使用DBMS的客户端之前必须首先打开该服务 客户端连接到服务器 关于客户端 / 服务器端的说明 客户端 : 数据库管理系统(DBMS), 应用程序服务器端 : 安装的数据…

L1-8 刮刮彩票

“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示&#xff1a; 每次游戏玩家会拿到一张彩票&#xff0c;上面会有 9 个数字&#xff0c;分别为数字 1 到数字 9&#xff0c;数字各不重复&#xff0c;并以 33 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上…

工作中使用花名的意义?

标题&#xff1a;工作中使用花名的意义 引言 在现代职场中&#xff0c;使用花名&#xff08;或化名&#xff09;已经成为一种普遍的现象。花名是指在工作场合或社交网络上&#xff0c;个人使用的非正式、非官方的名称&#xff0c;通常是与真实姓名不同的昵称或代号。这种现象…

Apache SeaTunnel社区成功入选开源之夏活动,现开启导师招募!

随着开源文化在全球范围内的蓬勃发展&#xff0c;Apache SeaTunnel社区也在不断探索如何更有效地参与并贡献于这一伟大的事业中。 最近我们收到了一个好消息&#xff0c;Apache SeaTunnel社区已成功入选参加由中国科学院软件研究所“开源软件供应链点亮计划”发起的“开源之夏…

「不羁联盟/XDefiant」4月20号开启服务器测试,游戏预下载安装教程

XDefiant》开启Alpha测试&#xff0c;这是一款免费游玩的快节奏 FPS 竞技游戏&#xff0c;可选择特色阵营&#xff0c;搭配个性化的装备&#xff0c;体验 6v6 对抗或是线性游戏模式。高品质射击竞技端游XDefiant以6v6双边对抗为核心&#xff0c;对局模式分为区域与线性两大类&a…

视频基础学习五——视频编码基础二(编码参数帧、GOP、码率等)

系列文章目录 视频基础学习一——色立体、三原色以及像素 视频基础学习二——图像深度与格式&#xff08;RGB与YUV&#xff09; 视频基础学习三——视频帧率、码率与分辨率 视频基础学习四——视频编码基础一&#xff08;冗余信息&#xff09; 视频基础学习五——视频编码基础…

@Resource 与 @Autowired区别

Resource 和 Autowired 都是用于依赖注入的注解&#xff0c;但它们有一些区别。 Resource 注解&#xff1a; 来源&#xff1a; Resource 是由 JavaEE 提供的注解&#xff0c;它不属于 Spring 框架的一部分。 装配方式&#xff1a; Resource 默认按照名称进行装配&#xff0c;如…

【智能算法】花朵授粉算法(FPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;Yang等人受到自然界花朵授粉过程启发&#xff0c;提出了鸭群算法&#xff08;Flower Pollination Algorithm, FPA&#xff09;。 2.算法原理 2.1算法思想 FPA基于自然界花朵授…

三步教你怎么把icloud照片恢复至iphone!

“我手机里面照片被优化后&#xff0c;然后不小心把所有被优化的模糊照片从手机中删除了&#xff0c;但是iCloud还有&#xff0c;我应该怎样把iCloud的照片重新放回手机&#xff1f;谢谢。” 在使用iPhone时&#xff0c;iCloud照片库是一个非常方便的功能&#xff0c;它允许你在…