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

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之间延迟的原因有扇出,组合逻辑综合后的电路结构是串形的(尽量用操作符去优化让其综合合成并行的电路),优先级问题。或者去使用插入寄存器去解决(加一级流水)


http://www.kler.cn/news/288856.html

相关文章:

  • sickos 靶机渗透(wolf cms 渗透,squid 代理)
  • 【软件造价咨询】AI大模型能不能替代软件工程造价师完成软件造价?
  • RabbitMQ和Kafka的区别
  • python-A-B数对
  • WPF MVVM如何在ViewModel直接操作控件对象
  • 【数学建模国赛思路预约】2024高教社杯全国大学生数学建模竞赛助攻——思路、可运行代码、成品参考
  • 【数据结构】Set的使用与注意事项
  • 正则表达式实现括号替换
  • 【机器学习】CNN在计算机视觉中的应用
  • 数学建模学习(130):神经网络预测—模型选择与实战案例解析
  • LeetCode—string练习
  • etcdctl defrag 剔除、添加etcd节点
  • 调用k8s api实现添加用户并授权
  • 【Hot100】LeetCode—33. 搜索旋转排序数组
  • 台球助教APP小程序的前端交互设计
  • Redis的内存淘汰策略
  • 正则表达式实现带有条件的爬取
  • 动态规划-最大子数组和
  • [解决]Prometheus 与 Grafana进行组合,但是不显示数据与图像
  • 【王树森】Transformer模型(1/2): 剥离RNN,保留Attention(个人向笔记)
  • Java开发学习Kotlin 笔记
  • 每天学习一个基础算法之插入排序
  • 谷歌地图广告指南
  • P1438 无聊的数列
  • React 实现PDF预览(数据源使用文件流而不是url)
  • 哪些好用的待办事项清单值得推荐:待办任务清单app
  • (二十八)STL set(集合)
  • 前端vue中怎么判断接口请求返回的时长
  • 【量化交易的数学基础】文科生也能搞懂的线性代数基础:矩阵和向量的那些事儿
  • 学习日志29