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

本文摘自《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.rhkb.cn/news/313392.html

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

相关文章

【Proteus】51单片机对直流电机的控制

直流电机&#xff1a;输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机&#xff0c;电能转换为机械能&#xff1b;作发电机运行时是直流发电机&#xff0c;机 械能转换为电能。 直流电机的控制&#xff1a; 1、方向控制…

手撕AVL树(map和set底层结构)(1)

troop主页 今日鸡汤&#xff1a;Action may out always bring happiness;but there is no happiness without action. 行动不一定能带来快乐&#xff0c;但不行动一定不行 C之路还很长 手撕AVL树 一 AVL树概念二 模拟实现AVL树2.1 AVL节点的定义 三 插入更新平衡因子&#xff0…

vim相关指令

vim的各种模式及其转换关系图 vim 默认处于命令模式&#xff01;&#xff01;&#xff01; 模式之间转换的指令 除【命令模式】之外&#xff0c;其它模式要切换到【命令模式】&#xff0c;只需要无脑 ESC 即可&#xff01;&#xff01;&#xff01; [ 命令模式 ] 切换至 [ 插…

联合体共用体--第二十三天

1.结构体元素有各自单独的空间 共用体元素共享空间&#xff0c;空间大小由最大类型确定 2.结构体元素互不影响&#xff0c;共用体赋值会导致覆盖

javaWeb智能医疗管理系统

简介 在当今快节奏的生活中&#xff0c;智能医疗系统的崛起为医疗行业带来了一场革命性的变革。基于JavaWeb技术开发的智能医疗管理系统&#xff0c;不仅为医疗机构提供了高效、精准的管理工具&#xff0c;也为患者提供了更便捷、更个性化的医疗服务。本文将介绍一个基于SSM&a…

一些重新开始面试之后的八股文汇总

一、内存中各项名词说明 1、机器内存概念说明 linux中的free命令可以查看机器的内存使用情况&#xff0c;vmstat命令也可以 其中不容易被理解的是&#xff1a; 内存缓冲/存数&#xff08;buffer/cached&#xff09; 1.buffers和cache也是RAM划分出来的一部分地址空间 2.buff…

SQL优化——统计信息

文章目录 1、统计信息1.1、表的统计信息1.2、列的统计信息1.3、索引的统计信息 2、统计信息重要参数设置3、检查统计信息是否过期4、扩展统计信息5、动态采样6、定制统计信息收集策略 只有大表才会产生性能问题&#xff0c;那么怎么才能让优化器知道某个表多大呢&#xff1f;这…

移动硬盘故障解析:NTFS属性0字节,双击无法访问的数据恢复之道

一、故障现象&#xff1a;移动硬盘NTFS属性0字节&#xff0c;双击无法访问 在日常使用移动硬盘的过程中&#xff0c;有时我们会遇到一个令人困惑的问题&#xff1a;移动硬盘在接入电脑后&#xff0c;显示其属性为NTFS格式&#xff0c;但容量却显示为0字节&#xff0c;且双击无…

【Delphi 爬虫库 1】GET和POST方法

文章目录 1.最简单的Get方法实现2.可自定义请求头、自定义Cookie的Get方法实现3.提取响应协议头4.Post方法实现单词翻译 爬虫的基本原理是根据需求获取信息并返回。就像当我们感到饥饿时&#xff0c;可以选择自己烹饪食物、外出就餐&#xff0c;或者订外卖一样。在编程中&#…

airtest-ios真机搭建实践

首先阅读4 ios connection - Airtest Project Docs 在Windows环境下搭建Airtest对iOS真机进行自动化测试的过程相对复杂&#xff0c;因为iOS的自动化测试通常需要依赖Mac OS系统&#xff0c;但理论上借助一些工具和服务&#xff0c;Windows用户也可以间接完成部分工作。下面是…

软考中级工程师网络技术第二节网络体系结构

OSPF将路由器连接的物理网络划分为以下4种类型&#xff0c;以太网属于&#xff08;25&#xff09;&#xff0c;X.25分组交换网属于&#xff08;非广播多址网络NBMA&#xff09;。 A 点对点网络 B 广播多址网络 C 点到多点网络 D 非广播多址网络 试题答案 正确答案&#xff1a; …

数据结构初阶:二叉树(二)

二叉树链式结构的实现 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在对二叉树结构掌握还不够深入&#xff0c;为了降低学习成本&#xff0c;此处手动快速创建一棵简单的二叉树&#xff0c;快速进入二…

学习Rust的第5天:控制流

Control flow, as the name suggests controls the flow of the program, based on a condition. 控制流&#xff0c;顾名思义&#xff0c;根据条件控制程序的流。 If expression If表达式 An if expression is used when you want to execute a block of code if a condition …

list基础知识

list 1.list 的定义和结构 list 是双向链表&#xff0c;是C的容器模板&#xff0c;其接收两个参数&#xff0c;即 list(a,b) 其中 a 表示指定容器中存储的数据类型&#xff0c;b 表示用于分配器内存的分配器类型&#xff0c;默认为 list <int>; list 的特点&#xff1a;…

springboot中mongodb连接池配置-源码分析

yml下spring.data.mongodb 以前mysql等在spring.xxx下配置&#xff0c;现在springboot新版本&#xff08;小编3.2.3&#xff09;在spring.data.xxx下了&#xff0c;如下所示&#xff0c;mongodb的配置在spring.data.mongodb下&#xff1a; 连接池相关参数配置-源码分析 拼接在…

STM32应用开发——BH1750光照传感器详解

STM32应用开发——BH1750光照传感器详解 目录 STM32应用开发——BH1750光照传感器详解前言1 硬件介绍1.1 BH1750简介1.2 硬件接线 2 软件编程2.1 软件原理2.1.1 IIC设备地址2.1.2 IIC读写2.1.3 BH1750指令集2.1.4 BH1750工作流程2.1.5 BH1750测量模式 2.2 测试代码2.3 运行测试…

学习了解大模型的四大缺陷

由中国人工智能学会主办的第十三届吴文俊人工智能科学技术奖颁奖典礼暨2023中国人工智能产业年会于2024年4月14日闭幕。 会上&#xff0c;中国工程院院士、同济大学校长郑庆华认为&#xff0c;大模型已经成为当前人工智能的巅峰&#xff0c;大模型之所以强&#xff0c;是依托了…

Java 设计模式系列:模板方法模式

简介 模板方法模式是一种行为型设计模式&#xff0c;它定义一个操作中的算法骨架&#xff0c;将一些步骤推迟到子类中。模板方法模式使得子类可以不改变一个算法的结构&#xff0c;即可重定义该算法的某些特定步骤。 在模板方法模式中&#xff0c;抽象类中定义了一系列基本操…

48.基于SpringBoot + Vue实现的前后端分离-雪具销售系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的雪具销售系统设计与实现管理工作系统…

精通技术写作:如何写出高质量技术文章?

CSDN 的朋友你们好&#xff0c;我是未来&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第 7 篇文章“如何撰写高质量技术文章”。本文深入探讨了如何写好一篇技术文章。文章给出了好的技术文章的定义和分析&#xff0c;并提供了从选题、…