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

本文摘自《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;…

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; 成熟…

网络安全:绕过 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 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上…

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

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

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

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

【智能算法】花朵授粉算法(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;它允许你在…

pnpm - Failed to resolve loader: cache-loader. You may need to install it.

起因 工作原因需要研究 vue-grid-layout 的源码&#xff0c;于是下载到本地。因为我习惯使用 pnpm&#xff0c;所以直接用 pnpm i 安装依赖&#xff0c;npm run serve 启动失败。折腾了一番没成功。 看到源码里有 yarn.lock&#xff0c;于是重新用 yarn install 安装依赖&…

使用Unity 接入 Stable-Diffusion-WebUI的 文生图api 并生成图像

使用Unity 接入 Stable-Diffusion-WebUI 文生图生成图像 文章目录 使用Unity 接入 Stable-Diffusion-WebUI 文生图生成图像一、前言二、具体步骤1、启动SD的api设置2、unity 创建生图脚本3、Unity 生图交互配置步骤 1: 创建sdControl步骤2&#xff1a;生成后图片画布步骤3&…

Groovy程序设计-【第一部分Groovy起步】-02-面向Java开发者的Groovy

前言&#xff1a; 知识点记录来源于【Groovy程序设计】一书中&#xff0c;本文仅作知识点记录供日后使用查询&#xff0c;不做教程使用。 groovy支持java语法&#xff0c;并且保留了java的语义&#xff0c;所以我们可以随心所欲的混用两种语言。 1.从Java到Groovy 先看一个…

从「宏大叙事」到「生活叙事」,小红书品牌种草的的“正确姿势”

不同于抖音和微博&#xff0c;在小红书上&#xff0c;品牌营销的基调应该是怎样的&#xff1f;品牌怎样与小红书用户对话&#xff1f;什么样的内容&#xff0c;才能走进小红书用户的心中&#xff1f;本期&#xff0c;小编将带大家洞察品牌在小红书营销的“正确姿势”。从「小美…

Table表格(关于个人介绍与图片)

展开行&#xff1a; <el-table :data"gainData" :border"gainParentBorder" style"width: 100%"><el-table-column type"expand"><template #default"props"><div m"4"><h3>工作经…

百度文心一言:官方开放API开发基础

目录 一、模型介绍 1.1主要预置模型介绍 1.2 计费单价 二、前置条件 2.1 创建应用获取 Access Key 与 Secret Key 2.2 设置Access Key 与 Secret Key 三、基于千帆SDK开发 3.1 Maven引入SDK 3.2 代码实现 3.3 运行代码 一、模型介绍 文心一言&#xff08;英文名&…