当前位置: 首页 > news >正文

FPGA速度优化

速度优化


文章目录

  • 速度优化
  • 前言
  • 一、时序优化
    • 1.1 减少关键路径上的时序
      • 1.1.1 关键路径重组
      • 1.1.2 解决扇出问题
      • 1.1.3 路径上插入寄存器
      • 1.1.4 寄存器平衡
      • 1.1.5 并行结构
      • 1.1.6 消除代码优先级
  • 总结


前言

速度优化,主要就是设计时序进行优化

  • 吞吐量:每个时钟周期能处理的数据量,多少bit,b/s。为了提高吞吐量,大量的并行的设计被使用,再对数据处理完成之后对外传输,一般使用告诉串行I/O口,使得提高速率的前提又增加了稳定性
  • 设计延时:输入数据和数据被处理后输出的时间间隔。对于吞吐量来说,只关心流水线末端下线产品的数量,很少关系数据被处理的传输延迟。即尽量采用并行操作,减少流水操作。
  • 设计时序:指设计时钟速度,两个时序单元之间的最大延迟,决定了时钟频率(速度),可以得到一个最大时钟频率

一、时序优化

tip:从核心上理解就是关键路径的延迟太大,可以从插入流出、减小扇出(扇出过大会影响布局布线)、组合逻辑重组、操作符平衡(组合逻辑存在流水,如何是这个流水变成并行的,也就是组合逻辑重组)、消除代码优先级(使用case语句,使用 if else语句不超过7级)、

1.1 减少关键路径上的时序

关键路径:时序路径上的组合逻辑都会增加路径延迟,两个寄存器之间的最大延迟就是关键路径,减少了,就优化了时序,增加了时钟频率。也就是说木桶理论。

1.1.1 关键路径重组

多用于多个路径组合的场合,将重组先后的顺序,使得寄存器之间的关键路径被拉的更近

1.1.2 解决扇出问题

**tip:**Fanout即扇出,模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为路径延时(net delay)较大,不利于时序收敛。因此,在写代码时应尽量避免高扇出的情况。

  • 适当的逻辑赋值:信号扇出过大,会造成布局布线困难,从而导致延迟过大。通过对信号的复制(面积换速度),可以分担扇出过大的问题。又分为逻辑复制寄存器复制
    **解决扇出:
    方法一:**组合逻辑复制如下:

在这里插入图片描述
方法二:在代码中可以设置信号属性,将对应信号的max_fanout属性设置成一个合理的值,当实际的设计中该信号的fanout超过了这个值,综合器就会自动对该信号采用优化手段,常用的手段其实就是寄存器复制。属性设置如下代码所示:

(* max_fanout = “3” *)reg signed [15:0] din_d;

方法三:通常BUFG是用于全局时钟的资源,可以解决信号因为高扇出产生的问题。但是其一般用于时钟或者复位之类扇出超级大的信号,此类信号涉及的逻辑遍布整个芯片,而BUFG可以从全局的角度优化布线。而且一块FPGA芯片中BUFG资源也有限,在7k325tffg900上也仅有32个,如果用于普通信号的高扇出优化也不大现实。因此,在时钟上使用BUFG是必须的,但是如果设计中遇到某些复位信号因高扇出产生的时序问题时,可以在此信号上使用BUFG来优化。

1.1.3 路径上插入寄存器

中间插入寄存器,面积换速度(插入流水线);

1.1.4 寄存器平衡

操作符平衡(组合逻辑存在流水,如何是这个流水变成并行的),使用括号来重组组合逻辑 如,z<=abcd变成z<=(ab)(cd)

1.1.5 并行结构

如out1 <= a + b +c + d变成out1 <=( a + b) +(c + d)

1.1.6 消除代码优先级

消除代码优先级(使用case语句,使用 if else语句不超过7级),if语句需要顺序去判断,所以耗时;
如果非要使用 if else 那么当if中的控制线是互斥的,就可以改写为多个if并行的方式

总结

两个ff之间的组合逻辑延迟过大,解决核心就是思考如何让两个ff之间距离更近。导致ff之间延迟的原因有扇出,组合逻辑综合后的电路结构是串形的(尽量用操作符去优化让其综合合成并行的电路),优先级问题。或者去使用插入寄存器去解决(加一级流水)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新手该如何选择与小程序定位相关的关键词
  • Yolo环境搭建(深度学习基础环境)
  • 利用优先级队列的堆排序练习
  • visual studio 2005 ( vs2005 , vc2005 ) 编译的应用程序无法运行的解决方案
  • 与PC1显著相关的基因 | p值计算
  • 个人旅游网(1)——数据库表详解
  • JVM1-初识JVM
  • 【cocos creator】养成游戏简易事件系统,每日随机事件,每日行动点重置,根据数据检测多结局
  • 【Unity输入】Input Manager 和 Input System对比
  • 实训第三十二天(学习playbook-roles,脚本创建数据库和表,mycat读写分离)
  • 2024年程序员金九银十面试宝典持续更新中.....
  • 【Spring Boot 3】【Web】同时启用 HTTP 和 HTTPS
  • 命令模式与宏命令:批量操作的高效实现
  • 探索Edge-TTS与WebSocket集成:打造实时语音交互系统
  • 【网络编程通关之路】 Tcp 基础回显服务器(Java实现)及保姆式知识原理详解 ! ! !
  • 2017-08-04 前端日报
  • Electron入门介绍
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS 颜色设置看我就够了
  • k个最大的数及变种小结
  • Python实现BT种子转化为磁力链接【实战】
  • Travix是如何部署应用程序到Kubernetes上的
  • ViewService——一种保证客户端与服务端同步的方法
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 测试如何在敏捷团队中工作?
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 计算机常识 - 收藏集 - 掘金
  • 前端js -- this指向总结。
  • 如何学习JavaEE,项目又该如何做?
  • 用Visual Studio开发以太坊智能合约
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 通过调用文摘列表API获取文摘
  • ​字​节​一​面​
  • !$boo在php中什么意思,php前戏
  • #php的pecl工具#
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (6)设计一个TimeMap
  • (CPU/GPU)粒子继承贴图颜色发射
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (javascript)再说document.body.scrollTop的使用问题
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net core 6.0 升8.0
  • .Net Core与存储过程(一)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework杂记
  • .Net(C#)常用转换byte转uint32、byte转float等
  • /proc/stat文件详解(翻译)
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [000-01-018].第3节:Linux环境下ElasticSearch环境搭建