Xilinx FPGA的约束设计和时序分析总结 (转)

2023-05-16

在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计满足我们需要的运行速度、引脚位置等要求。通常的做法是设计编写约束文件并导入到综合实现工具,在进行FPGA/CPLD的综合、实现过程中指导逻辑的映射和布局布线。下面主要总结一下Xilinx FPGA时序约束设计和分析。
  
  一、周期约束
    周期约束是Xilinx FPGA 时序约束中最常见的约束方式。它附加在时钟网线上,时序分析工具会根据周期约束来检查时钟域内所有同步元件的时序是否满足需求。周期约束会自动的寄存器时钟端的反相。如果相邻的两个元件的时钟相位是相反的,那么它们之间的延迟将被默认的限制成周期约束的一半。
  
    在进行周期约束之前,必须对电路的时钟周期明了,这样才不会出现约束过松或者过紧的现象。一般情况下,设计电路所能达到的最高运行频率取决于同步元件本身的Setup Time 和 Hold Time,以及同步元件之间的逻辑和布线延迟。周期约束一般是使用下面的约束方法:
  
  1、period_item PERIOD=period {HIGH|LOW} [high_or low_item]
  
    其中,period_item可以是NET或TIMEGRP,分别代表时钟线名称net name或元件分组名称group-name。用NET表示PERIOD约束作用到名为“net name”的时钟网线所驱动的同步元件上,用TIMEGRP表示PERIOD约束作用到TIMEGRP所定义的分组(包括FFS、LATCH和 RAM等同步元件)上。period是目标时钟周期,单位可以是ps、ns、μS和ms等。HIGH|LOW指出时钟周期中的第1个脉冲是高电平还是低电平,high or low time为HIGH LOW指定的脉冲的持续时间,默认单位是ns。如果没有该参数,时钟占空比 是50%。例如, NET SYS_CLK PERIOD=10 ns HIGH 4ns
  
  2、NET“clock net name”TNM_NET=“timing group name”;
  
  TIMESPEC“TSidentifier”=PERIOD “TNM reference”period {HIGH | LOW} [high or low item]INPUT_JITTER value;
  
    很多时候为了能够定义比较复杂的派生关系的时钟周期,就要使用该方法。其中TIMESPEC在时序约束中作为一个标识符表示本约束为时序规范;TSidentifier包括字母TS和一个标识符identifier共同作为一个TS属性;TNM reference指定了时序约束是附加在哪一个组上,一般情况下加在TNM_NET定义的分组上。HIGH | LOW 指的是时钟的初始相位表明第一个时钟是上升沿还是下降沿;high or low item 表示的是时钟占空比,即就是high或者low的时间,默认为1:1, INPUT_JITTER 表示的是时钟的抖动时间,时钟会在这个时间范围内抖动,默认单元为ps。比如周期约束:
  
  NET "ex_clk200m_p" TNM_NET = TNM_clk200_p;
  
  TIMESPEC "TS_clk200_p" = PERIOD "TNM_clk200_p" 5.000 ns HIGH 50 %;
  
    建立一个TNM_clk200_p的时序分组,包括时钟网络ex_clk200m_p驱动的所有同步元件,这些同步元件都将受到时序规范TS_clk200_p的约束。同步元件到同步元件有5ns的时间要求。占空比为1:1.
  
  二、偏移约束
    偏移约束包括OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE和OFFSET_OUT_AFTER等4种约束。属于基本的时序约束,它规定了外部时钟和数据输入输出引脚之间的时序关系,只能用于与引脚相连接。其基本的语法为:
  
  OFFSET = {IN | OUT} “offset_time” [units] {BEFORE | AFTER} “clk_name” [TIMEGRP “group_name”];
  
    其中,[IN | OUT] 说明约束是输入还是输出,”offset_time”为FPGA引脚数据变化与有效时钟之间的时间差,[BEFORE | AFTER]说明该时间差在有效时钟沿的前面还是后面,”clk_name”时钟名,[TIMEGRP “group_name”]定义约束的触发器组,缺省时约束clk_name驱动的所有触发器。
  
  1、OFFSET_IN_BEFORE、OFFSET_IN_AFTER约束
  
    OFFSET_IN_BEFORE和OFFSET_IN_AFTER都是输入偏移约束。OFFSET_IN_BEFORE说明了输入数据比有效时钟沿提前多长时间准备好。于是芯片内部与输入引脚相连的,组合逻辑的延迟不能大于这个时间,否则会发生数据采样错误。OFFSET_IN_AFTER是输入数据在有效时间沿之后多久到达芯片的输入引脚。
  
  OFFSET_IN_BEFORE对芯片内部的输入逻辑的约束,约束如下:
  
  NET data_in OFFSET = IN Time BEFORE CLK;
  
  2、OFFSET_OUT_AFTER、OFFSET_OUT_BEFORE约束
  
    这两个都是输出约束,OFFSET_OUT _AFTER规定了输出数据在有效沿之后多久稳定下来,芯片内部的输出延迟必须小于这个数值。OFFSET_OUT_BEFORE是指下一级芯片的输入数据应该在有效时钟沿之前多久准备好。从下一级的输入端的延迟可以计算出当前设计输出的数据必须在何时稳定下来。其基本的语法规则为:“NET data_out” OFFSET=OUT
  
  Time AFTER CLK“;
  
  三、专门约束
  附加约束的一般策略是首先附加整天约束,比如PERIOD、OFFSET等约束,然后对局部的电路进行约束。 专门约束包括以下几个:
  
  1、FROM_TO约束
  
  FROM_TO在两个组之间定义的约束,对二者之间的逻辑和布线延迟进行控制,这两个组可以是用户自定义的,也可以预定义的,可以使用TNM_NET、TNM和TIMEGRP定义组。其语法如下:
  
  TIMESPEC “TSname“ = FROM ”group1“ TO ”group2“ value ;
  
  其中group1和group2分别是路径的起点和终点,value为延迟时间,可以是具体的数值或者表达式。比如:TIMESPEC TS_CLK = PERIOD CLK 30ns; TIMESPEC T1_T3 = FROM T1 TO T3 60ns;
  
  2、MAXDELAY约束
  
  MAXDELAY约束定义了特定的网络线的最大延迟,其语法如:
  
  NET “net_name“ MAXDELAY = value units ; value 为延迟时间。
  
  3、MAXSKEW约束
  
  MAXSKEW是高级时序约束,通过MAXSKEW约束附加在某一网线上,可以约束该网线上的最大SKEW。MAXSKEW语法如下:
  
  NET “net_name“ MAXSKEW = allowable_skew units;
  
  比如,NET “Singal“ MAXSKEW = 3ns;
  
  四、分组约束
    在FPGA设计当中,往往包含大量的触发器、寄存器和RAM等元件,为了方便附加约束需要把他们分成不同的组,然后根据需要对某些组分别约束。
  
  1、TNM约束。
  
  使用TNM约束可以选出一个构成分组的元件,并且赋予一个名字,以便添加约束。如:{NET | INST | PIN} “object_name“ TNM= “identifier“;
  
  其中object_name为NET、INST或PIN的名称,identifier为分组名称。
  
  2、TNM_NEY约束
  
    TNM_NET约束只加在网线上,其作用与TNM约束加在网线时基本相同,即把该网线所在路径上的所有有效同步元件作为一组命名。不同之处在于TNM是加在引脚上的,而不是该网线所在路径上的同步元件,也就是说TNM约束不能穿过IBUF,用TNM_NET约束就不出现这种情况。
  
  NET “net_name“ TNM_NET = [predefined_group:] identifier;
  
  TNM_NET只能用在网线上,否则会出现警告,或者同时该约束被忽略。
  
  2、TIMEGRP约束
  
    可以通过TIMEGRP约束使已有的分组约束构成新的分组,已经有的预定义和用TNM/TIMEGRP定义。使用TIMEGRP约束可以使多个分组合并组成一个新分组。
  
  TIMEGRP “big_group1“ = ”small_group“ ”medium_group“
  
  将”small_group“ ”medium_group“合并一个新分组big_group1。
  
  五、简单的避免时序违规和补救的方法
    PERIOD 约束定义的是触发器等同步元件的时钟周期。可使用时序分析器来验证同步元件之间的所有路径是否满足设计的建立和保持时序要求。PERIOD 约束违例将以负的时序裕量显示在在时序报告,并说明到底是建立时间还是保持时间要求出现违例。应找出两个所分析的同步元件间一条较快路径,如果是多周期路径,应该采样多周期约束,或至少是某种方法来确保数据在合适时间内到达并保持足够长的时间,以便时钟脉冲边沿能够正确采样。若布局布线软件无法找到更快的路径,则可从 FPGA Editor 工具中手动进行布线。不过一般不推荐使用手工布局布线。首先应该试试重构电路来满足时序要求。比如用寄存器打一拍,有点逻辑复制的意思,这样可以增加了信号的延迟,但是却可以使电路正确的采样数据。
  
    若外部信号值在时钟脉冲边沿之前发生变化,则需使用 DCM 或 PLL 延迟时钟脉冲边沿,这样数据才能由新的延迟时钟正确采样。有一种替代方法,就是在输入/ 输出模块中使用 IDELAY 元件,将数据移到时钟有效的位置上。
  
  一般情况下,提高电路的运行速度可以尽量减少时序违规的问题。具体总结如下:
  
  1、通过设置Xilinx ISE软件在“Implement Design“点击右键,选择”属性“选择”“Optimization Strategy”栏中选择”speed“以及点击右键选择”Design Goals and Strategies“选择”Timing performance“。
  
  2、尽量使用Xilinx公司提高的专用资源,FPGA厂商都提高了一些专用的,比如进位链MUX、SRL等。
  
  3、重新分配关键路径
  
  (1) 关键路径在同一Module,这样综合时可以获得最佳的时序效果。
  
  (2) 对关键路径近LOC约束,如果发现关键路径相关的LUT距离太远,可以使用floorplanner手工布线。
  
  (3) 复制电路,减少关键路径的扇出。当一个信号网络所带的负载越多的时候,他的路径也会相应的增加,所以通过复制电路,可以有效的减少甚至消除时序违规的问题。
  
  (4) 在关键路径网络上插入buffer减少扇出,提高速度,消除时序违规。
  
  4、 进行特殊约束,通过设置Multi_Cycle_Path意义不大,因为它不会直接对关键路径产生影响,这样想法显然不对,因为它可以对非关键路径散开的作用,给关键路径节约了空间,间接的达到压缩关键路径延迟的问题,有点“曲线救国“的味道。
  
  5、 通过修改代码减少逻辑级数和分割组合逻辑。
  
   
  
   注: 一般情况下,使用比较多的都是周期约束,专门约束只是针对部分器件可能需要,一般高端FPGA是不需要这个的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xilinx FPGA的约束设计和时序分析总结 (转) 的相关文章

  • Linux上压缩文件的 5 种方法

    在 Linux 上有不少用于压缩文件的命令 最新最有效的一个方法是 xz xff0c 但是所有的方法都有节省磁盘空间和维护备份文件供以后使用的优点 在这篇文章中 xff0c 我们将比较这些压缩命令并指出显著的不同 tar tar 命令不是专
  • 新手如何从零开始学习unity

    自从 unity5发布免费过后 xff0c 有很多独立游戏开发者转向unity游戏开发 xff0c unity的优势就是多终端 跨平台打包 xff0c 入门也快 xff0c 很多人感觉自己的英文不好 xff0c 就觉得学不会 xff0c 其
  • stm32零基础入门,应学习那些知识

    1 首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解 如不理解 xff0c 请立即阅读STM32的文档 xff0c 以获取最基本的知识点 如果你手上拥有ST官方主推的STM32神舟系列的板子 xf
  • Java如何实现二维码扫码授权登陆

    如今的生活中 xff0c 登录网站也变得如此简单 xff0c 当你已经登录一微信时 xff0c 当你想要登录另一个网站时 xff0c 只需扫码便可 xff0c 可是大家知道用Java怎么实现扫码授权吗 本文讲述的就是关于如何用Java实现扫
  • Postman安装与简单使用

    Postman使用参考文档 xff1a 1 官方英文文档 2 chrome插件整理的 postman中文使用教程 Postman一款非常流行的API调试工具 其实 xff0c 开发人员用的更多 因为测试人员做接口测试会有更多选择 xff0c
  • c语言入门基础

    C语言的结构 1 Hello world 简单来说 xff0c 一个C程序就是由若干头文件和函数组成 include 包含头文件 主函数 int main printf Hello World return 0 include 就是一条预处
  • 单片机串行口介绍

    介绍 串行口是单片机与外界进行信息交换的工具 xff0c 8051单片机的通信方式有两种 xff1a 并行通信 数据的各位同时发送或接收 串行通信 数据一位一位次序发送或接收 串行通信的方式 异步通信 用一个起始位0表示字符的开始 xff0
  • 51单片机中断机制(定时器)

    单片机中断简介 52单片机一共有6个中断源 xff0c 它们的符号 xff0c 名称以及各产生的条件分别如下 xff1a INT0 外部中断0 xff0c 由P3 2端口线引入 xff0c 低电平或下降沿引起 INT1 外部中断1 xff0
  • 什么叫51单片机最小系统

    单片机最小系统 或者称为最小应用系统 是指用最少的元件组成的单片机可以工作的系统 对51系列单片机来说 最小系统一般应该包括 单片机 晶振电路 复位电路 下面给出一个51单片机的最小系统电路图 说明 复位电路 由电容串联电阻构成 由图并结合
  • 嵌入式系统C编程之错误处理

    一 错误概念 1 1 错误分类 从严重性而言 xff0c 程序错误可分为致命性和非致命性两类 对于致命性错误 xff0c 无法执行恢复动作 xff0c 最多只能在用户屏幕上打印出错消息或将其写入日志文件 xff0c 然后终止程序 而对于非致
  • 补光灯的单片机开发设计

    说到摄影灯 xff0c 相信每个人都一定听说过闪光灯和补光灯 那它们是怎么由来的呢 又是怎么达到了你想要的效果呢 不论是闪光灯还是补光灯 xff0c 它们都有一个共同点 xff0c 那就是由NY8A051D单片机开发而来 xff0c 单片机
  • 单片机C语言如何产生随机数

    单片机C语言如何产生随机数 随机数在单片机的应用中也是很多的 xff0c 当然产生随机数的方法有很多 xff0c 当中有一个就是利用单片机定时器 xff0c 取出未知的定时器THX和TLX的值 xff0c 再加以运算得到一个规定范围内的随机
  • 使用mac终端编译运行c程序

    使用mac终端编译运行c程序 本文介绍如何利用mac自带文本编辑软件编写c代码 xff0c 并在mac自带终端内用命令行编译运行c程序 1 在mac上安装c编译环境 打开mac自带的终端 在终端命令行里输入xcode select inst
  • HtmlParser 一个不错的网站爬虫工具

    有时候我们需要在网上获取自己需要的内容时 xff0c 而且需求量达到一定程度时 xff0c 就要通过代码来实现重复的操作 当用Java来帮我们解决这个问题时 xff0c 我们又如何通过Java来过滤掉多余的内容 xff0c 剩余自己想要的信
  • 因为jsoup,再见了我的htmlparser

    jsoup 一款Java 的HTML解析器 xff0c 可直接解析某个URL地址 HTML文本内容 它提供了一套非常省力的API xff0c 可通过DOM xff0c CSS以及类似于jQuery的操作方法来取出和操作数据 这里是jsoup
  • Python 当前时间是那一年第几周的周几

    isocalendar 函数 返回 xff08 XX年 xff0c 一年中的第几周 xff0c 这一天是周几 xff09 gt gt gt from datetime import datetime gt gt gt datetime no
  • 对Socket CAN的理解(1)——【CAN总线原理】

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 由于Socket CAN涉及到CAN总线协议 套接字 Linux网络设备驱动等 因此 xff0c 为了能够全面地了解Socket CAN的
  • 对Socket CAN的理解(2)——【Socket的原理及使用】

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 为了能够对Socket CAN的深入理解 xff0c 我们需要了解Socket的机制 Socket的中文翻译为 插座 xff0c 在计算机
  • 【智能家居篇】wifi网络结构(上)

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 WIFI是什么 xff0c 相信大家都知道 xff0c 这里就不作说明了 我们需要做的是深入了解其工作原理 xff0c 包括软硬件 网络结
  • 【智能家居篇】wifi网络结构(下)

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 由于WIFI网络具有移动性 xff0c 同时WIFI以无线电波作为传输媒介 xff0c 这种媒介本质上是开放的 xff0c 且容易被拦截

随机推荐

  • 【智能家居篇】wifi网络接入原理(上)——扫描Scanning

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 对于低头党来说 xff0c 在使用WIFI功能时 xff0c 经常性的操作是打开手机上的WIFI设备 xff0c 搜索到心目中的热点 xf
  • 【智能家居篇】wifi网络接入原理(下)——关联Association

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 认证完成后 xff0c 下一步就是关联 xff08 Association xff09 工作站与基站进行关联 xff0c 以便获得网络的完
  • 【智能家居篇】wifi驱动的理解(3)——usb接口在wifi模块中的角色

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 上一篇文章已经提到USB接口在wifi模块中的最重要两个函数是usb read port 和usb write port 那它们是怎么和w
  • 【智能家居篇】wifi驱动的理解(4)——usb接口在wifi模块中的角色

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 还有1天就到2017年了 xff0c 回顾整个2016年至此 xff0c 都没发表过一篇技术文章 做软件开发已有5 6年 xff0c 作为
  • mx51 TVOUT分析

    1397 static int init enable tve setup char options 1398 1399 g enable tve 61 true 1400 1401 return 1 1402 1403 setup 34
  • 2D图形加速引擎(GE2D)

    转载请注明出处 xff1a http blog csdn net Righthek 谢谢 xff01 英文原文 NUC970 Series Technical Reference Manual Chapter 5 28 一 概述 32位2D
  • Redis 安装

    安装 下载 解压 编译Redis wget http download redis io releases redis 6 0 6 tar gz tar xzf redis 6 0 6 tar gz cd redis 6 0 6 make
  • linux下 tcpdump实现原理

    linux下抓包实现原理 一 tcpdump 对于本机中进程的系统行为调用跟踪 xff0c strace是一个很好的工具 xff0c 而在网络问题的调试中 xff0c tcpdump应该说是一个必不可少的工具 xff0c 和大部分linux
  • eigen求特征值和特征向量

    Eigen Matrix2d matrix 22 matrix 22 lt lt 2 3 2 1 cout lt lt 34 matrix 61 n 34 lt lt matrix 22 lt lt endl Eigen SelfAdjoi
  • sophus库的一些使用

    首先是cmakelists cmake minimum required VERSION 2 8 project useSophus 为使用 sophus xff0c 您需要使用find package命令找到它 find package
  • OpenCV中ORB特征点检测和匹配简单用法

    cmakelists span class hljs keyword cmake minimum required span VERSION span class hljs number 3 7 span span class hljs k
  • LKflow

    cmakelists span class hljs keyword cmake minimum required span VERSION span class hljs number 3 7 span span class hljs k
  • 关于关于高博3d2d程序报错的改动

    想直接改动 xff0c 在 还是g2o初始化一些 那篇 xff0c 这篇比较啰嗦 xff0c 主要是记录自己思考的步骤 首先说明主题 xff1a 没文化真可怕 好了 xff0c 说干货 之前高博的代码 只要涉及g2o的部分 xff0c 一律
  • C++类内成员初始化

    所有标准为C11标准 xff0c 旧的就不看了 首先说一条指导规则 xff1a 通常情况下 xff0c 不应该在类内部初始化成员 xff01 xff01 无论是否为静态 是否为常量 是否为int等 xff01 xff01 统统不建议在类内初
  • RANSAC算法理解

    最早应该是十四讲上见过 xff0c 在第九章的project中src中的visual odometry cpp中 xff0c 最核心的求解3d 2d的变换中 xff1a span class hljs label 整个核心就是用这个cv s
  • 装双系统的一些记录

    小米电脑F2进入BIOS设置 xff0c F12选取启动项 启动U盘制作 ROS安装
  • ROS使用注意事项

    看到一篇总结 xff0c 感觉很有用 摘抄下来 转自 xff1a https www cnblogs com pk28 p 7625838 html
  • Python time模块 时间戳转换

    时间戳转换 时间戳获取 import time time time 时间戳转时间字符串 时间戳 gt 时间数组 gt 格式化时间字符串 时间字符串转时间戳 格式时间字符串 gt 时间数组 gt 时间数组 时间戳转换时间字符串 time st
  • 图漾深度摄像头基本使用方法

    搞到一款图漾的3d相机 xff08 型号为FM810 C xff09 有好久了 xff0c 一直也只是编译了sample代码跑起来看看样子 xff0c 并没有着手看SDK以及开发的事 近几日对照SDK以及其中的SimpleView Fetc
  • Xilinx FPGA的约束设计和时序分析总结 (转)

    在进行FPGA的设计时 xff0c 经常会需要在综合 实现的阶段添加约束 xff0c 以便能够控制综合 实现过程 xff0c 使设计满足我们需要的运行速度 引脚位置等要求 通常的做法是设计编写约束文件并导入到综合实现工具 xff0c 在进行