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

news2024/11/27 12:36:50

本文摘自《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)
begin
        if(rst_n == 1'b0)begin
                clk_div_d1 <= 1'b0;
        end
        else begin
                clk_div_d1 <= clk_div;
        end
end

//------------------------------------------------------------
//------------------------------------------------------------
always@(posedge clk or negedge rst_n)
begin
        if(rst_n == 1'b0)begin
                led <= 1'b0;
        end
        else if(clk_div_d1 == 1'b0 && clk_div == 1'b1 )begin
                led <= ~led;
        end
        else begin
                led <= 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.coloradmin.cn/o/1603956.html

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

相关文章

爬楼梯(c)

文章目录 描述分析思路关键代码运行结果 描述 给定一个整数数组 cost &#xff0c;其中 cost[i]是从楼梯第i 个台阶向上爬需要支付的费用&#xff0c;下标从0开始。-旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶 要求&#xff1a;请你计算并返回达到楼梯顶部的…

每天五分钟计算机视觉:基于卷积操作完成滑动窗口的图片分类?

本文重点 我们前面学习了使用不同大小的滑动窗口来滑动图片,然后切分成许多小的图片,然后依次应用到我们已经训练好的图像分类模型中,但是这种方式效率太低了,本节课程我们学习一种新的方式,来看一下如何并行识别这些剪切的图片。 原始结构 首先我们先来看一下,如何把…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题8

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题8 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

【C++】二维数组传参方式

最近刚开始刷剑指offer&#xff0c;刚做到第三题的时候&#xff0c;发现C二维数组的传参方式和C语言略有些不同&#xff0c;所以在这篇博客中&#xff0c;会列出C/C常见的二维数组传参方式。&#xff08;本方式和代码都是基于vs环境所编写&#xff09; 一.C语言二维数组传参方式…

[入门]测试层级-ApiHug准备-测试篇-005

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 这里的测…

K8s的亲和、反亲和、污点、容忍

1 亲和与反亲和 亲和性的原理其实很简单&#xff0c;主要利用label标签结合nodeSelector选择器来实现 1.1 Pod和Node 从pod出发&#xff0c;可以分成亲和性和反亲和性&#xff0c;分别对应podAffinity和podAntiAffinity。从node出发&#xff0c;也可以分成亲和性和反亲和性&…

注塑机自动喷雾程序 报警自动关机

/***参数设置,开模数计数,秒脉冲计时***************/ /***实现功能:检测报警信号,脱模剂开模数计数信号***/ /***参数:1:脱模剂开模数 2:喷雾时间 3:延时时间 ***/ /***串口接收触摸屏参数设置字符串,接收并保存******/ /***端子输入口读开模数,比较设定值后输出到电磁阀**/ /…

Verilog仿真跨模块调用内部信号的方法

在Verilog仿真时如果需要调用某子模块中的信号在本模块中使用可以使用层次化引用的方法&#xff0c;而不需要在rtl部分用端口引出来。 引用方式&#xff1a;当前例化模块名.子例化模块名.子子例化模块名.参数 将需要的信号引出。 注意是用例化模块名而不是用子模块名&#xff…

记录一下我102连不上MySQL的问题 NotBefore

【背景描述】我在102上是能登录上MySQL的&#xff0c;但是用客户端&#xff08;DataGrip、SQLyog就连不上&#xff09; 【解决方案】 加个这个?useSSLfalse&serverTimezoneUTC 【另外的小问题】如果直接输mysql 上面这个不是报错&#xff0c;不用管 再输mysql -uroot -p…

json diff patch

文件和图片的比对靠字符串 目录 流程 安装 效果 使用 自适应 数组&#xff1a;最长公共子序列(LCS) 数组中的对象&#xff0c;给定id&#xff0c;类似dom tree的比较 流程 安装 npm install jsondiffpatch import * as jsondiffpatch from jsondiffpatch; const jsond…

ASP.NET医院手麻信息系统源码 .NET6.0+VUE

目录 麻醉记录单 复苏记录单 麻醉文书 手术麻醉信息 1、 体征监控记录 2、 麻醉用药信息 3、 手术事件登记 4、 手术状态变更 5、 麻醉医师交接 6、 其他辅助操作 手麻信息系统是以服务围术期临床业务工作的开展为核心&#xff0c;通过与床边监护设备以及医院H…

Github 2024-04-18 Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-18统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Vue项目1TypeScript项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个…

C语言结构体与公用体

结构体 概述 有时我们需要将不同类型的数据组合成一个有机的整体&#xff0c;如&#xff1a;一个学生有学号/姓名/性别/年龄/地址等属性这时候可通过结构体实现结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型” 可以理解为其他语言的object类型 结构体变量的定…

CSS 01

CSS层叠样式表 HTML的局限性 HTML只关注内容的语义&#xff0c;可以做简单的样式&#xff0c;却带来了无限的臃肿和繁琐。 CSS CSS是层叠样式表的简称&#xff0c;也被称之为CSS样式表或级联样式表。CSS也是一种标记语言。   CSS主要用于设置HTML页面中的文本内容(字体、大…

【第1节】书生·浦语大模型全链路开源开放体系

目录 1 简介2 内容&#xff08;1&#xff09;书生浦语大模型发展历程&#xff08;2&#xff09;体系&#xff08;3&#xff09;亮点&#xff08;4&#xff09;全链路体系构建a.数据b 预训练c 微调d 评测e.模型部署f.agent 智能体 3 相关论文解读4 ref 1 简介 书生浦语 InternLM…

SAP打印输出设置

SAP打印输入有很多方式&#xff0c;适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的&#xff0c;前端打印的出现减轻了管理员的工作量&#xff0c;用户可以选择自己电脑上的打印机输出&#xff0c;不需要所有打印机都在SAP平台中进行配置&#xff0…

学习STM32第十五天

SPI外设 一、简介 STM32F4XX内部集成硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU负担&#xff0c;可配置8位/16位数据帧&#xff0c;高位&#xff08;最常用&#xff09;/低位先行&#xff0c;三组SPI接口&#xff0c;支持DMA…

Linux 存储:NAND 写入异常案例 (1)

文章目录 1. 前言2. 案例背景3. 案例问题4. 案例分析4.1 普通文件写入流程概要4.2 dd 写 NAND 时&#xff0c;会不会使用 page cache &#xff1f;4.3 dd 写 NAND 时&#xff0c;对比 U-Boot 读 NAND&#xff0c;是否采用了相同的坏块策略 &#xff1f;4.3.1 U-Boot 读 NAND 过…

【经验总结】Jupyter 配置内核

1. 背景描述 使用 国家超算互联网中心 的服务器&#xff0c;创建 jupyterlab 容器&#xff0c;想在之前 conda 创建的环境中运行&#xff0c;可是不行&#xff0c;进入容器就直接进入 jupyterlab 2. 解决方法 配置内核 2.1 激活环境 conda activate peft2.2 安装内核 pip…

【Python基础】字典

文章目录 [toc]什么是字典键值对示例键异常 遍历列表什么是遍历遍历字典的键keys()方法 遍历字典的值values()方法 遍历字典的键值对items()方法 字典操作增加键值对修改键值对查询键值对get()方法 删除键值对delclear()方法 个人主页&#xff1a;丷从心 系列专栏&#xff1a;…