FPGA时序约束

news/2024/9/18 14:43:50/ 标签: fpga开发

FPGA时序约束

目录

    • FPGA时序约束
  • 前言
  • 1、建立和保持时间
    • 1.1 建立时间
    • 1.2 保持时间
  • 2 时序路径
  • 2 具体约束
    • 2.1 IO约束
      • 2.1.1 管脚约束
      • 2.1.2 延迟约束
      • 2.1.3 虚拟时钟
    • 2.2周期约束,FPGA内部的时序路径
      • 2.2.1 主时钟
      • 2.2.2 衍生时钟
      • 2.2.3 主时钟之间的相互关系
      • 2.2.4 使用BUFGMUX 时钟选择的使用
    • 2.3 最大最小延迟约束
    • 2.4 两种时序例外
      • 2.4.1 多周期路径
        • 2.4.1.1 单时钟域
        • 2.4.1.2 时钟相移
        • 2.4.1.3 慢到快
        • 2.4.1.4 快到慢
      • 2.4.2 伪路径
  • 3 实战
    • 3.1 主时钟约束
    • 3.2 创建衍生时钟
    • 3.3 延迟约束
    • 3.4 伪路径
    • 3.5 多周期约束
  • 4 实际项目约束
  • 总结

前言

为什么要进行时序约束:就是告诉软件端口的输入的周期、延迟等的关系,然后更好的布局布线如果我们不加这些约束,那么软件无法知道我们的时钟周期的情况,因此布局布线之后,就不会有时序违例的警告,导致错了我们也不知道

核心在于防止出现建立或者保持时间不满足导致出现亚稳态


1、建立和保持时间

1.1 建立时间

在这里插入图片描述
看两个触发器,也就是说看两个时钟沿。
建立时间容线:数据要在第二个时钟上升沿(捕获沿)之前提前来到。

1.2 保持时间

在这里插入图片描述
保持时间,是在同一个时钟沿进行分析。从当前时钟沿数据开始保持开始,且当前时钟沿也开始发另外一个数据,但是这个数据必须在保持时间完成之后来到。也就是这个保持时间容限。

小结:建立时间和保持时间,主要的就是明白其保持和建立时间容限

2 时序路径

有4个时序路径,针对不同的时序路径会有不同的约束方式。
在这里插入图片描述

2 具体约束

2.1 IO约束

2.1.1 管脚约束

管脚和电平的约束。
这里需要注意的就是差分端接,V6芯片是需要用IBUFDS来制定端接为差分。ULTRASCALE 需要手动去指定。

2.1.2 延迟约束

输入时钟(同一个时钟下)和输入数据之间的关系:数据相对时钟的延迟最大/最小时间,set_input_delay
在这里插入图片描述
注意:延迟只是说明,告知软件有这个延迟关系,而不是去改变这个延迟

2.1.3 虚拟时钟

IO约束中的延迟约束的时候,约束的是外部输入数据时钟之间的关系,但是有一种情况,就是只有数据是从外部输入的,但是采集这个数据的时钟是FPGA内部的且不满足和主时钟为整数倍的频率关系(也就说只要捕获时钟是主时钟,或者产生的衍生时钟是和主时钟为整数倍的频率关系,在输入这一侧,就不用创建虚拟时钟),因此需要对这个内部的时钟创建为虚拟时钟,有了这个虚拟时钟,才能继续为数据和时钟设定延迟关系。
这个虚拟时钟,对输出来说,就是输出的时候没有随路时钟给到下游器件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
虚拟时钟需要在约束I/O延迟之前定义:也就是说先有时钟名,再定义延迟

小结:IO约束,一个是管脚,一个数据和时钟之间的延迟。数据和时间的延迟又分为是否为捕获时钟有还是没有(对于输入和输出都要判断),有时钟但是不满足和主时钟为整数倍的频率关系(衍生时钟)则需要虚拟时钟,否则不,对于输出也一样

2.2周期约束,FPGA内部的时序路径

在这里插入图片描述

2.2.1 主时钟

命令:create_clock
主时钟:

  • 外部时钟源,通过时钟管脚进去的。通过时钟管脚进去的,布局布线是不一样的。
  • GT时钟。在绑定GT时钟的时候,7系列需要RX、TX都要绑定。ULTRASCALE只需要绑定RX时钟

怎么查看主时钟:

  • 在这里插入图片描述
  • 在这里插入图片描述
    主时钟之间的关系:
    如果需要设定主时钟的关系,则
    在这里插入图片描述


默认是占空比为50%,0时刻出现上升沿。
只约束P端即可。

2.2.2 衍生时钟

命令:create_generated_clock
这个命令不是设定周期或者波形,而是描述时钟电路如何对上级时钟进行转换
在这里插入图片描述
-source 是只master clock,可以是主时钟,也可以是衍生时钟。
衍生时钟分为下面两种:

  • vivado自动推导的。
    vivado自动推导时钟约束

  • 用户自定义的。
    需要注意的是如果使用vivado自动推导的,可能会和自己定义始终名称产生冲突。解决方法是,重新以自动推导的名字,再自定义一下

2.2.3 主时钟之间的相互关系

命令:create_clock_group
一般大的工程,都会有多个主时钟(注意,也可以是衍生时钟),当这几个时钟是异步的时候(没有任何相位关系,如果是同步的,即MMCM产生的时钟相位是一定的,但是频率不同),则需要用下面的命令来指定时钟的关系。asychronous(即:相位关系不确定
在这里插入图片描述
这个命令的另一个作用:验证同一个时钟端口,在不同时钟频率下的时序收敛情况。如端口clk1,clk2,其中clk2为100MHZ,clk1想测量在50MHZ,100MHZ,200MHZ下的时钟情况,为了免得多次去设定综合,就可以这样去设定,同时去分析。如下图:
在这里插入图片描述
步骤:

  • 创建主时钟。同一个端口用不同时钟使用 -add
  • 设定同一个端口的主时钟之间的关系。这里同一个端口用不同时钟,这个关系用:物理上不是功用的,-physically_exclusive
  • 创建端口主时钟之间的关系:-asynchronous。其中同一个端口的哟个“ ”来囊括
    这里的时钟组包括同一个端口的时钟组不同端口的时钟组
    注意:这里时钟之间的关系,可以是衍生时钟之间的关系,也可以是主时钟之间的关系

2.2.4 使用BUFGMUX 时钟选择的使用

如果MMCM输出的衍生时钟被选择性的使用,则需要进行以下约束
在这里插入图片描述

2.3 最大最小延迟约束

在这里插入图片描述
即:
· 端口到端口

  • reg到reg之间,这里不同的reg是单独使用其自己的时钟,即异步电路。对于异步电路来说,都是通过设计来保证,而不是通过约束来保证
    在这里插入图片描述

2.4 两种时序例外

2.4.1 多周期路径

正常的时序分析都是以单周期来做分析,即发起沿和捕获沿是相邻的时钟沿。建立时间是在时刻2,保持时间的检查是在建立时间的前一个时钟沿。
在这里插入图片描述
在这里插入图片描述
具体的细节和延伸暂时讲,后续遇到了再说。

2.4.1.1 单时钟域
2.4.1.2 时钟相移
2.4.1.3 慢到快
2.4.1.4 快到慢

2.4.2 伪路径

就是该路径的的电路功能不会有问题,后者不需要加时序约束,这样可以减少工具优化时间,避免软件对这个部分进行时序约束。
在这里插入图片描述
需要注意的是,为伪路径约束是单向的。如果两个时钟(跨时钟域)之间会相互的传递信息,则需要双向约束
在这里插入图片描述

3 实战

在这里插入图片描述
梳理时钟树:
在这里插入图片描述
在这里插入图片描述
**注意:**一般以为没有任何约束,软件就不知道我们时钟周期,就不会有时序警告,但是MMCM会自动加上时序约束,这样就会有时序警告
分析时钟都有哪些:这里是2个主时钟,4个衍射时钟。其中材clk2,不是衍生时钟(衍射时钟一般是MMCM或者PLL产生的,或者用户自定义的,这里BUFG不是属于衍生时钟)。
在这里插入图片描述
MMCM会对输入的主时钟,和输出的衍生时钟进行自动约束

3.1 主时钟约束

创建主时钟:
在这里插入图片描述

3.2 创建衍生时钟

创建衍生时钟
在这里插入图片描述
注意:-name 后面是时钟输出的名字,这里的source后需要跟两个路径,第一个为该时钟的master clock的路径,第二个为该时钟的路径(就是时钟输出的位置)。
在这里插入图片描述
在这里插入图片描述
这里名字可以设定为其他名字,不一定要和自动推导的一样。
在这里插入图片描述
在这里插入图片描述

看看时钟的交互情况来设定时钟组:clk_tx和clk_rx有跨时钟域的交互,但是是同步的,所以设定为伪路径,其实异步的好像也设置为伪路径?(也就是说PLL或者MMCM出来的不同频,但是同相的,可以不去进行时序分析,又这个是跨时钟域,通过设计去优化了,更不用时序分析了,所以设置为伪路径)。。。。然后就是clk_samp和clk2之间有交互,就是异步时钟,没有明确的相位关系,那就设定为异步 asynchronous
在这里插入图片描述
这里使用get_clocks,因为我们之前已经定义好了时钟的名字了

3.3 延迟约束

在这里插入图片描述
在这里插入图片描述
输入管脚的延迟约束,除了复位信号以外,其他的都需要进行约束,因为复位是异步复位,异步是需要设置为伪路径的。
首先判断捕获时钟(无论是输入还是输出,都从捕获时钟来开始分析,这是分析数据和时钟之间的关系时钟已经创建了,就不用管时钟输入的引脚了,现在主要看数据端口)是主时钟还是衍生时钟,如果是衍生时钟且时钟频率不是主时钟的整数倍,就要创建虚拟时钟,否则可以直接用set_input_delay…(如果输入的有随路时钟,也不需要用虚拟时钟)
输出的没有随路时钟,也需要创建虚拟时钟。
(第三个创建:如果输入,判断PCB上有Clock Buffer导致时钟延迟不同,有的话创建虚拟时钟)
在这里插入图片描述

  • rxd_pin: 捕获时钟的是 clk_rx 也就是200MHZ的时钟,和主时钟是一致的,是主时钟频率的倍数(1倍),因此不需要虚拟时钟
  • txd_pin:没有随路时钟,需要虚拟时钟
  • lb_sel_pin:捕获时钟是clk_tx(166.7MHZ),不是整数倍的主时钟关系,因此需要衍生时钟
  • led_pins:捕获时钟是clk_tx(166.7MHZ),不是整数倍的主时钟关系,因此需要衍生时钟
  • spi_mosi_pin,捕获时钟是spi_clk(166.7MHZ),虽然不是整数倍的主时钟关系,但是有随路时钟,所以不需要虚拟时钟
  • dac_*,捕获时钟是spi_clk(166.7MHZ),虽然不是整数倍的主时钟关系,但是有随路时钟,所以不需要虚拟时钟

3.4 伪路径

  • 跨时钟域的数据传输设置为伪路径
  • 异步复位也需要添加为伪路径

3.5 多周期约束

暂时不管
在这里插入图片描述

4 实际项目约束

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

总结

  • 建立时间和保持时间,主要的就是明白其保持和建立时间容限
  • 记住信号的四种路径,时钟和数据的关系,时钟和时钟的关系。
  • IO约束,一个是管脚,一个数据和时钟之间的延迟。数据和时间的延迟又分为是否为捕获时钟有还是没有(对于输入和输出都要判断),有时钟但是不满足和主时钟为整数倍的频率关系(衍生时钟)则需要虚拟时钟,否则不,对于输出也一样
  • 内部时钟约束:单个时钟约束、时钟和时钟之间的约束(包括衍生时钟)
  • 端到端
  • 了解实际项目中,需要做什么约束
  • 欢迎一起交流学习,如有错误之处,还请各位指正。

参考资料

[1] FPGA系列教学


http://www.ppmy.cn/news/1516729.html

相关文章

S3协议分片上传(minio)

文章目录 前言一、minio 为例二、使用步骤1.引入库2.读入数据总结前言 目前文件存储一般采用obs存储,也就是对象存储 比较流行的有: minio 阿里云 华为云 阿里云 腾讯云 七牛云 百度云 ,对于贫穷的我来说,当然选择免费开源的minio了,但是他们有一个统一的标准也就是S3协议,相…

一文读懂 DDD领域驱动设计

DDD(Domain-Driven Design,领域驱动设计)是一种软件开发方法,它强调软件系统设计应该以问题领域为中心,而不是技术实现为主导。DDD通过一系列手段如统一语言、业务抽象、领域划分和领域建模等来控制软件复杂度&#xf…

【Rust光年纪】Rust多媒体处理库全面比较:探索安全高效的多媒体处理利器

多媒体处理不再困扰:解锁Rust语言下的六大多媒体利器 前言 随着Rust语言的快速发展,越来越多的多媒体处理库和工具集开始出现,为开发人员提供了丰富的选择。本文将对几个用于Rust语言的多媒体处理库进行介绍,并对它们的核心功能…

【算法】希尔排序、计数排序、桶排序、基数排序

1 希尔排序 2 计数排序 3 桶排序 4 基数排序 1 希尔排序 """ 希尔排序(Shell Sort)是一种插入排序算法的改进版本,得名于其发明者Donald Shell。 它通过比较一定间隔的元素来进行排序,以减少数据移动的次数&#…

Jmeter进行http接口测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤(1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径&#xf…

【HarmonyOS NEXT星河版开发实战】天气查询APP

目录 前言 界面效果展示 首页 添加和删除 界面构建讲解 1. 获取所需数据 2. 在编译器中准备数据 3. index页面代码讲解 3.1 导入模块: 3.2 定义组件: 3.3 定义状态变量: 3.4 定义Tabs控制器: 3.5 定义按钮样式: 3.6 页面显示时触发…

Java核心API——Collection集合的工具类Collections

集合的排序 int类型的排序 * 集合的排序 * java.util.Collections是集合的工具类&#xff0c;提供了很多static方法用于操作集合 * 其中提供了一个名为sort的方法&#xff0c;可以对List集合进行自然排序(从小到大) List<Integer> list new ArrayList<>();Rand…

96页PPT集团战略解码会工具与操作流程

德勤集团在战略解码过程中通常会用到以下一些具体工具&#xff1a; 一、平衡计分卡&#xff08;Balanced Scorecard&#xff09; 财务维度&#xff1a; 明确关键财务指标&#xff0c;如营业收入、利润、投资回报率等。你可以通过分析历史财务数据和行业趋势&#xff0c;确定…

设计模式24-命令模式

设计模式24-命令模式 写在前面行为变化模式 命令模式的动机定义与结构定义结构 C 代码推导优缺点应用场景总结补充函数对象&#xff08;Functors&#xff09;定义具体例子示例&#xff1a;使用函数对象进行自定义排序代码说明输出结果具体应用 优缺点应用场景 命令模式&#xf…

鸿蒙位置服务

位置服务 1、首先申请权限 在module.json5文件下申请位置权限 "requestPermissions": [{"name": "ohos.permission.LOCATION", // 权限名称,为系统已定义的权限"reason": "$string:location_reason", // 申请权限的原因,…

windows 核心编程第五章:演示作业的使用及获取统计信息

演示作业的使用及获取统计信息 演示作业的使用及获取统计信息 文章目录 演示作业的使用及获取统计信息演示作业的使用及获取统计信息 演示作业的使用及获取统计信息 /* 演示作业的使用及获取统计信息 */#include <stdio.h> #include <Windows.h> #include <tc…

HBase原理和操作

目录 一、HBase在Zookeeper中的存储元数据信息集群状态信息 二、HBase的操作Web Console命令行操作 三、HBase中数据的保存过程 一、HBase在Zookeeper中的存储 元数据信息 HBase的元数据信息是HBase集群运行所必需的关键数据&#xff0c;它存储在Zookeeper的"/hbase&quo…

ARM32开发——(七)GD32F4串口引脚_复用功能_查询

1. GD32F4串口引脚查询 TX RX CK CTS RTS USART0 PA9,PA15,PB6 PA10,PB3,PB7 PA8 PA11 PA12 USART1 PA2,PD5 PA3,PD6 PA4,PD7 PA0,PD3 PA1,PD4 USART2 PB10,PC10,PD8 PB11,PC5,PD9 PB12,PC12,PD10 PB13,PD11 PB14,PD12 UART3 PA0,PC10 PA1,PC11 …

kafka 入门

kafka 有分区和副本的概念&#xff0c;partition 3 表示有3个分区&#xff0c;replication 2 表示有2个副本 通过 --describe --topic test命令可以知道 test这个 主题的分区和副本情况&#xff0c;途中的replicas 表示 其他副本分区的情况&#xff0c;如第一条&#xff0c;t…

【运筹学】【数据结构】【经典算法】最小生成树问题及贪心算法设计

1 知识回顾 我们已经讲过最小生成树问题的基础知识&#xff0c;我们现在想要利用贪心算法解决该问题。我们再来回顾一下最小生成树问题和贪心算法的基础知识。 最小生成树问题就是从某个图中找出总权重最小的生成树。 贪心算法是一种算法设计范式&#xff0c;每一步都选…

深度学习学习经验——全连接神经网络(FCNN)

什么是全连接神经网络&#xff1f; 全连接神经网络&#xff08;FCNN&#xff09;是最基础的神经网络结构&#xff0c;它由多个神经元组成&#xff0c;这些神经元按照层级顺序连接在一起。每一层的每个神经元都与前一层的每个神经元连接。 想象你在参加一个盛大的晚会&#xf…

Vue中的this.$emit()方法详解【父子组件传值常用】

​在Vue中&#xff0c;this.$emit()方法用于触发自定义事件。它是Vue实例的一个方法&#xff0c;可以在组件内部使用。 使用this.$emit()方法&#xff0c;你可以向父组件发送自定义事件&#xff0c;并传递数据给父组件。父组件可以通过监听这个自定义事件来执行相应的逻辑。 …

问界M7 Pro这招太狠了,直击理想L6/L7要害

文 | AUTO芯球 作者 | 雷慢 李想的理想估计要失眠了&#xff0c;为什么啊&#xff1f; 前有L6悬架薄如铁片被曝光&#xff0c;被车主们骂了个狗血淋头&#xff0c; 现在又来个问界M7 Pro版&#xff0c; 24.98万的后驱智驾版就上华为ADS主视觉智驾了&#xff0c; 两个后驱&…

TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门

TMDOG的微服务之路_07——初入微服务&#xff0c;NestJS微服务快速入门 博客地址&#xff1a;TMDOG的博客 在前几篇博客中&#xff0c;我们探讨了如何在 NestJS 中的一些基础功能&#xff0c;并可以使用NestJS实现一个简单的单体架构后端应用。本篇博客&#xff0c;我们将进入…

基于改进YOLOv8的景区行人检测算法

贵向泉, 刘世清, 李立, 秦庆松, 李唐艳. 基于改进YOLOv8的景区行人检测算法[J]. 计算机工程, 2024, 50(7): 342-351. DOI: 10.19678/j.issn.10 原文链接如下&#xff1a;基于改进YOLOv8的景区行人检测算法https://www.ecice06.com/CN/rich_html/10.19678/j.issn.1000-3428.006…