FPGA时序分析与时序约束(一)

一、为什么要进行时序分析和时序约束

        PCB通过导线将具有相关电气特性的信号相连接,这些电气信号在PCB上进行走线传输时会产生一定的传播延时。

        而FPGA内部也有着非常丰富的可配置的布线资源,能够让位于不同位置的逻辑资源块、时钟处理单元、BLOCK RAM、DSP和接口模块等资源能够相互通信,完成所需功能。

        FPGA的布线同PCB的走线一样,也会由于走线的长短不同而产生或大或小的传输延时(走线延时)。FPGA信号经过逻辑门电路进行各种运算也会产生延时(逻辑延时)。那么多个信号从FPGA的一端输入,经过一定的逻辑门电路处理后从FPGA的另一端输出,如何保证各个信号的延时一致呢?这个时候就需要进行时序分析,从而进行时序约束,从而保证FPGA的信号能够相互协同正常工作

        假设有一个信号输入FPGA中,在FPGA内部经过一些逻辑处理,最后进行输出,那么这些走线和处理都需要时间(走线延时和逻辑延时)。例如下图,输入信号到达逻辑处理A需要5ns,进行处理需要1ns,然后到逻辑处理C需要7ns,进行处理需要2ns,最后达到输出需要3ns,这条路径是所有路径中耗时最短的。但是FPGA不知道这条路径耗时最短,如果不对其进行时序约束,很可能会随便选一条路径进行布线,此时如果对系统的延时有要求,就可能出现信号错乱的情况

        

二、什么是时序分析和时序约束

        FPGA的时序分析与约束需要设计者根据实际的系统功能,通过时序约束的方式提出时序要求;FPGA编译工具根据设计者的时序要求,进行布局布线;编译完成后,FPGA编译工具还需要针对布局布线的结果,套用特定的时序模型,给出最终的时序分析和报告;设计者通过查看时序报告,确认布局布线后的时序结果是否满足设计要求。

        因此时序分析就是遍历电路存在的所有时序路径,计算信号在这些路径上的传播延时,使用特定的时序模型,针对特定的电路进行分析系统时序是否满足要求。

        时序约束就是对设计的电路提出时序上的要求,一般来说其可以细分为内部时钟约束 、IO口时序约束、偏移约束、静态路径约束和例外路径约束等。

三、时序约束的基本路径

从前面知道了时序分析是遍历电路存在的所有时序路径,那么就需要知道都有哪些路径

FPGA 时序约束所覆盖的时序路径主要有4种:

1.FPGA内部寄存器之间的时序路径,即reg2reg
2.输人引脚到FPGA内部寄存器的时序路径,即pin2reg
3.FPGA内部寄存器到输出引脚的时序路径,即reg2pin
4.输入引脚到输出引脚之间的时序路径(不通过寄存器),即pin2pin

        其中reg2reg、pin2reg、reg2pin都和寄存器有关,需要进行时序约束,因为要确保数据信号在时钟锁存沿的建立时间保持时间内稳定;但pin2pin本质就是纯组合逻辑电路,一般直接约束延时范围,因为pin2pin路径的信号传输通常不通过时钟。

在4种时序路径中,

pin2reg需要经过3个延迟,例如Device A到rega需要经过Tco(寄存器输出延时)、Input Delay(输入走线延迟)、Internal Delay(FPGA内部走线延迟);

reg2reg需要经过2个延迟,例如rega到regb需要经过Tco、Data Path Delay(FPGA内部组合逻辑和数据走线延迟);

reg2pin需要经过3个延迟,例如regb到Device B需要经过Tco、Internal Delay、Output Delay(输出走线延迟);

pin2pin需要经过1个延迟,例如dinb到doutb需要经过Data Path Delay。

四、时序分析与约束的基本概念

知道有哪些路径之后, 就要明白时序分析、约束具体在分析约束什么数据或者参数,因此就需要从一些基本概念入手,理清楚要根据什么去进行分析和约束

4.1 Clock Uncertainty

        时钟不确定性(Clock Uncertainty)主要由时钟抖动(Clock Jitter)和时钟偏差(Clock Skew)构成。

       一个理想的时钟是占空比为50%且周期固定的方波,但实际上这样的时钟是不存在的,一定会有超前或者滞后的偏移,即时钟抖动

        时钟偏差是指同一个时钟域内的时钟信号到达数字电路各个部分(一般指寄存器)所用时间的差异。 

        

        所以要对Clock Uncertainty进行约束,使时钟更加贴合实际。

4.2 建立时间和保持时间

        建立时间( Setup Time,Tsu),在时钟上升沿之前数据必须稳定的最短时间。若不满足 setup time,数据无法进入寄存器,数据采样失败。

        保持时间(Hold Time,Th),即在时钟上升沿之后数据必须稳定的最短时间。若不满足 hold time,数据也无法进入寄存器,数据采样失败。

        寄存器采样需要同时满足建立时间和保持时间才能保证采样成功,因此也要对建立时间和保持时间进行约束。

4.3 发起沿和采样沿

        寄存器发送数据和接收数据需要在时钟边沿进行,因此都有一个发起沿和一个采样沿。通常情况下这两个边沿会有一个时钟周期的差别。
        发起沿(Launch edge)是发送数据的时钟边沿,通常选择上升沿。发起沿是源寄存器采样的时间点,也是时序分析路径的起点。
        采样沿(Capture edge)是采样到该数据的时钟边沿,通常也是上升沿。采样沿是目的寄存器采样的时间点,也是时序分析路径的终点。

4.4 数据到达时间和时钟达到时间

        源寄存器rega在clk的上升沿发送数据,要经过一个时间才能到达目的寄存器regb(原因就是有走线、寄存器输出、逻辑处理延时),而这个时间则被称为数据到达时间(Data Arrival Time)。    

        通常选择发送沿Launch edge作为零时刻基准,数据经过Tclka(时钟信号从起点到寄存器时钟端口的时钟延时)、Tco时间,到达Q端口点,再从rega的Q端口经过组合逻辑以及布线的线延时(Tdata)到达接收端的D端口。


因此有公式:

Data Arrival Time = Launch Edge + Tclka + Tco + Tdata

        目的寄存器对数据进行采样,4.3中提到通常情况下发送沿和采样沿会有一个时钟周期的差别,因此采样沿时间Capture Edge就是发送沿Launch edge+一个时钟周期clkb。 

        所以时钟到达时间(Clock Arrival Time)为

Clock Arrival Time=Capture time + Tclkb

4.5 建立时间下的数据需求时间

        前面我们知道在时钟上升沿之前数据必须稳定的最短时间为建立时间,那么对于reg2来说,要想满足建立时间,就必须要在建立时间之前接收到reg1的数据,这个时间就是建立时间下的数据需求时间(Data Required Time - Setup)

因此

        Data Required Time= Clock Arrival Time- T_{su}-Setup Uncertainty 

4.6 保持时间下的数据需求时间

        同理,时钟上升沿之后数据必须稳定的最短时间为保持时间,那么当regb采样到数据之后要满足保持时间,那么这个时间就是保持时间下的数据需求时间(Data Required Time - Hold)

因此 

Data Required Time= Clock Arrival Time+ T_{su}+Setup Uncertainty

4.7 建议时间裕量

        在4.5中得到了寄存器满足建立时间下数据接收时间,例如时钟到达时间为5ns,建立时间Tsu为2ns,暂且将时钟不确定忽略,那么上一级数据到达最晚为5-2=3ns,因此上一级数据可以在1ns、2ns的时候到达。

        如果数据在1ns到达目标寄存器,那么建立时间裕量(Setup slack)就是3-1=2ns。

4.8 保持时间裕量

        保持时间裕量(Hold slack)同理。

参考文献:

《FPGA时序约束与分析》
《正点原子FPGA静态时序分析与时序约束》 
《Intel Quartus Prime Standard Edition用户指南: Timing Analyzer》
《Vivado Design Suite 用户指南: 设计分析与收敛技巧 (UG906)》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线性回归 numpy实现线性回归

手写线性回归 使用numpy随机生成数据 import numpy as np import matplotlib.pyplot as plt# 生成模拟数据 np.random.seed(42) X 2 * np.random.rand(200, 1) y 4 3 * X np.random.randn(200, 1)# 可视化数据 plt.scatter(X, y) plt.xlabel(X) plt.ylabel(y) plt.title(…

MFC发送ZPL指令控制斑马打印机

1、参考1:用Python操控斑马打印机的技术总结 - 重拾初心的青年人 - 博客园 (cnblogs.com) 参考2:VC斑马打印机_vc zpl-CSDN博客 参考3:斑马打印机ZPL语言编程实战_梅长酥的博客-CSDN博客 参考4:关于斑马打印机开发的几种方式_斑马…

人工智能的新篇章:深入了解大型语言模型(LLM)的应用与前景

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…

pbootcms建站

pbootcms建站 一、下载pbootcms二、安装1、进入宝塔面在网站栏,新建站点,将该址里面文件全部清再将下载的pbootcms上传至该地址。 三、修改关联数据库1、在根目录下/config打开database.php照如下修改这里我使用mysqli数据库。修改并使用自已创建的数据库…

JAVA-作业7-画一个笑脸

要求如题 代码如下: SmileFace01: import java.awt.Color; import java.awt.Graphics;import javax.swing.JPanel;public class SmileFace01 extends JPanel {Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);int width getWidth(…

基于springboot+vue的景区民宿预约系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

代码随想录day5 哈希表part 01 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 哈希碰撞:1、拉链法:其实拉链法就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内存,也不会因为链表太长而在查找上浪费太多时…

Stable Diffusion AI绘画系列【13】:毛茸茸的可爱动物们

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

cmd查看进程信息 终止进程

cmd查看进程信息 终止进程 1、cmd查看进程信息2、终止进程 1、cmd查看进程信息 tasklist命令 描述: 该工具显示在本地或远程机器上当前运行的进程列表。 tasklist /?查看本机所有进程列表 tasklist /V根据进程名 查看jmeter进程 tasklist /V |findstr /i jmeter2、终止进程…

分享全球顶尖的AIGC文生图资源

1 引言 人工智能正在改变许多行业的格局,而其中改变最直观和影响最大的就是AIGC领域的图像创作。文生图技术作为AIGC的一个重要分支,展现了人工智能在视觉创作领域的巨大潜力。发展至今已经有很多AI文生图平台,这是一次革命性的突破&#xf…

C++实现顺序栈的基本操作(扩展)

#include <stdio.h> typedef char ElemType; #define StackSize 100 /*顺序栈的初始分配空间*/ typedef struct { ElemType data[StackSize]; /*保存栈中元素*/int top; /*栈顶指针*/ } SqStack; void InitStack(SqStack &st) {st.top-1; } …

语音识别从入门到精通——1-基本原理解释

文章目录 语音识别算法1. 语音识别简介1.1 **语音识别**1.1.1 自动语音识别1.1.2 应用 1.2 语音识别流程1.2.1 预处理1.2.2 语音检测和断句1.2.3 音频场景分析1.2.4 识别引擎(**语音识别的模型**)1. 传统语音识别模型2. 端到端的语音识别模型基于Transformer的ASR模型基于CNN的…

Java代码生成统计图

引入依赖 <!-- https://mvnrepository.com/artifact/org.knowm.xchart/xchart --> <dependency><groupId>org.knowm.xchart</groupId><artifactId>xchart</artifactId><version>3.8.6</version> </dependency>如果在Li…

gitlab-jenkins-shell-helm-chart-k8s自动化部署微服务

1.准备好编译环境的容器&#xff0c;所有容器的镜像制作在gemdale-dockerfile这个代码库里面&#xff0c;也可以直接拉取官方镜像部署 docker run --name node1420-patternx -v /data/var/www/:/data/var/www/ -v /var/jenkins_home/:/var/jenkins_home/ -v /mnt/hgfs/:/mnt/h…

WEB渗透—反序列化(十一)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

ESP32-Web-Server编程-通过 Web 下载文本

ESP32-Web-Server编程-通过 Web 下载文本 概述 当你希望通过网页导出设备的数据时&#xff0c;可以在 ESP32 上部署一个简单的文件 Web 服务器。 需求及功能解析 本节演示如何在 ESP32 上部署一个最简单的 Web 服务器&#xff0c;来接收浏览器或者 wget 指令请求文件数据。…

java 之 继承与多态的详细介绍

文章目录 类的继承1. 基本语法2. 继承的特点3. 方法的重写&#xff08;方法的覆盖&#xff09;super 关键字1. 调用父类的构造器2. 访问父类的成员变量3. 调用父类的方法4. 在构造器中调用父类方法封装性以及访问修饰符抽象方法1. 声明抽象类2. 抽象方法3. 继承抽象类4. 抽象类…

Zabbix自定义监控内容

自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息 1.在客户端创建自定义key //明确需要执行的 linux 命令 who | wc -l//创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key vim /etc/zabbix/zabbix_ag…

com.mongodb.MongoSocketOpenException: Exception opening socket

估计mongodb数据库没开启&#xff0c;或者链接错误了&#xff0c;谁又改了&#xff0c;唉 2023-11-29 16:19:45.818 INFO 39552 --- [127.0.0.1:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server 127.0.0.1:27017…

浅析Hotspot的经典7种垃圾收集器原理特点与组合搭配

# 浅析Hotspot的经典7种垃圾收集器原理特点与组合搭配 HotSpot共有7种垃圾收集器&#xff0c;3个新生代垃圾收集器&#xff0c;3个老年代垃圾收集器&#xff0c;以及G1&#xff0c;一共构成7种可供选择的垃圾收集器组合。 新生代与老年代垃圾收集器之间形成6种组合&#xff0c…