【FPGA IP系列】FIFO深度计算详解

news/2024/4/27 13:19:33/文章来源:https://blog.csdn.net/mengzaishenqiu/article/details/131998523

FIFO(First In First Out)是一种先进先出的存储结构,经常被用来在FPGA设计中进行数据缓存或者匹配传输速率。

FIFO的一个关键参数是其深度,也就是FIFO能够存储的数据条数,深度设计的合理,可以防止数据溢出,也可以节省FPGA资源的消耗。

一、FIFO深度计算影响因素

影响FIFO深度计算的主要因素包括:

  • FIFO的位宽:决定了每个FIFO存储单元的大小

  • FIFO的数据字长:决定每个数据词包含多少比特有效数据

  • FIFO的总存储容量:决定最大可以存储的数据条数

以32位位宽,8位字长的FIFO为例,每个FIFO存储单元需要32/8=4个字节。

如果FIFO总容量为128字节,那么可以存储128/4=32个数据。

此外,FIFO深度还需要考虑:

  • FPGA资源约束条件:过大的FIFO会占用过多资源

  • 实际应用需求:深度过小可能导致数据丢失

  • 存储密度:选择2的整数次幂作为深度可以优化资源利用

综合考虑上述各因素后确定最佳的FIFO深度。

二、FIFO深度计算步骤

FPGA FIFO深度计算的基本步骤如下:

  • 根据传输最恶劣的情况(一段时间内缓存数据量最大的时候),计算剩余数据量(写数据量 - 读数据量)。

  • 根据剩余数据总存储容量/写位宽,计算FIFO最大可存储的数据量

  • 选择大于等于最大数据量的2的幂作为FIFO深度

  • 将FIFO深度转换为二进制表示

如果写比读慢,那就不用担心数据溢出,只有读比写慢的时候,需要考虑fifo深度设计,以防止数据溢出。

三、Verilog代码示例

下面是使用Verilog代码计算FIFO深度的示例:

// FIFO参数  
parameter DATA_WIDTH = 32; // 32位
parameter WORD_SIZE = 8;  // 8位字长 
parameter FIFO_SIZE = 128; // 总容量128字节// 每个FIFO存储单元的大小
localparam FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;// FIFO最大可存储数据量
localparam FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;  // 选择大于FIFO_MAX_WORDS的2的幂  
localparam FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ?  (2**$clog2(FIFO_MAX_WORDS)) : 1;// FIFO深度比特宽
localparam FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);

这个示例中,根据位宽32位、字长8位和容量128字节,计算出FIFO深度为32,需要5比特表示。

四、SystemVerilog代码示例

下面是使用SystemVerilog编写的等价代码:

// FIFO参数
localparam int DATA_WIDTH = 32; 
localparam int WORD_SIZE = 8;
localparam int FIFO_SIZE = 128;// 每个FIFO存储单元的大小  
localparam int FIFO_CELL_SIZE = DATA_WIDTH / WORD_SIZE;// FIFO最大可存储数据量
localparam int FIFO_MAX_WORDS = FIFO_SIZE / FIFO_CELL_SIZE;// 选择大于FIFO_MAX_WORDS的2的幂 
localparam int FIFO_DEPTH = (FIFO_MAX_WORDS > 0) ? 2**(FIFO_MAX_WORDS.log2) : 1;// FIFO深度比特宽            
localparam int FIFO_DEPTH_WIDTH = $clog2(FIFO_DEPTH);

SystemVerilog通过使用内置的log2函数可以简化代码。

五、FIFO深度计算实例

下面通过一些具体实例进一步说明FIFO深度计算过程。

1、匹配数据带宽

如果FIFO需要匹配指定的数据带宽,那么深度计算要考虑串行化因子的影响。

例如需要200MHz的串行LVDS接口,使用10位数据,那么单位时间内可以传输200MHz * 10位 = 2Gbps的数据。

如果后端接口是32位宽,100MHz,,那么其带宽为100MHz * 32位 = 3.2Gbps。为匹配带宽,前端数据需要缓存,此时FIFO深度计算如下:

后端带宽 = 3.2Gbps  
前端带宽 = 2Gbps
串行化因子 = 后端带宽/前端带宽 = 3.2/2 = 1.6  
FIFO深度 > 串行化因子 = 1.6

因此,选择FIFO深度为2才能匹配带宽需求。

2、防止数据溢出

如果写入FIFO的数据速率可能高于读取速率,那么需要增加FIFO深度来防止数据溢出。

场景1:如写入速率是100MB/s,读取速率是80MB/s,允许最大等待时间为50μs,那么需要的FIFO大小计算如下:

写入速率 = 100MB/s
读取速率 = 80MB/s 
最大等待时间 = 50μs
额外存储量 = 写入速率 × 最大等待时间  = 100MB/s × 50μs= 5000bit

因此,FIFO深度需要考虑额外存储5000bit的数据量,也就是除了正常存储量外还需要确保至少有5000bit的额外FIFO深度。

场景2:异步FIFO,写时钟100MHZ,读时钟80MHZ。读写位宽均为16bit。已知每100个写周期最多写入960bit数据,读侧每时钟读取一个数据。问:FIFO深度至少为多少?

最恶劣情况:前100个周期的后连续60个周期写入960bit数据,后100个周期的前连续60个周期写入960bit数据。写数据:最大数量为连续120个写周期内,写入数据量960*2bit = 1920 bit,用时为120/100 ns。读数据:这段时间内的数据量为 120/100 * 80 * 16bit = 1536 bit 。最大缓存数据量为 1920 - 1536 = 384 bit写数据最大缓存深度:384/16 = 24最大深度需要是2的幂次方,即为32

3、优化资源利用

有时为了优化资源利用,可能需要降低FIFO深度。

例如根据带宽计算,一个18Kb block RAM可以实现depth=512的FIFO,但考虑到资源限制,只能使用一个9Kb RAM,这时可以将FIFO设计为depth=256,节省block RAM资源。

同样,为了优化资源利用,FIFO深度通常设计为2的整数次幂,这可以减少地址解码逻辑所需资源。

六、结论

FIFO深度计算并不复杂,但需要考虑许多实际因素,如带宽匹配、防溢出和资源优化等。一般来说,根据存储需求计算出最大深度,再综合考虑资源和性能约束,选择大于等于该最大深度的2的幂次方作为最终FIFO深度,既能满足存储需求,又可以优化FPGA资源利用。


本文将不断定期更新中,码字不易,点⭐️赞,收⭐️藏一下,不走丢哦

本文由FPGA入门到精通原创,有任何问题,都可以在评论区和我交流哦

您的支持是我持续创作的最大动力!如果本文对您有帮助,请给一个鼓励,谢谢。

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

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

相关文章

QT--day5(网络聊天室、学生信息管理系统)

服务器: #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间servernew QTcpServer(this); }Widget::~Widget() {delete ui; …

texshop mac中文版-TeXShop for Mac(Latex编辑预览工具)

texshop for mac是一款可以在苹果电脑MAC OS平台上使用的非常不错的Mac应用软件,texshop for mac是一个非常有用的工具,广泛使用在数学,计算机科学,物理学,经济学等领域的合作,这些程序的标准tetex分布特产…

【雕爷学编程】MicroPython动手做(15)——掌控板之AB按键

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

MacOS Monterey VM Install ESXi to 7 U2

一、MacOS Monterey ISO 准备 1.1 下载macOS Monterey 下载🔗链接 一定是 ISO 格式的,其他格式不适用: https://www.mediafire.com/file/4fcx0aeoehmbnmp/macOSMontereybyTechrechard.com.iso/file 1.2 将 Monterey ISO 文件上传到数据…

jenkins 配置git

在linux 中输入 保证git 安装成功 git --version使用查看git 安装目录(非源码安装直接用yum 安装的) which gitjenkins 中到 系统管理–>全局工具配置–> Git installations 新建一个项目 选择自由风格 源码管理选择 git 如果使用的是码云&a…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…

PostgreSQL构建时间

– PostgreSQL构建时间 select make_timestamp(2023,7,27,7,34,16);

Docker复杂命令便捷操作

启动所有状态为Created的容器 要启动所有状态为"created"的Docker容器,可以使用以下命令: docker container start $(docker container ls -aq --filter "statuscreated")上述命令执行了以下步骤: docker container l…

基于x-scan的渲染算法

基于x-scan算法实现的z-buffer染色&#xff0c;.net core framework 3.1运行。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula getFormula();Box rect getBound();for …

【VTK】基于读取出来的 STL 模型,当用户点击鼠标左键时,程序将获取点击位置的点,显示其坐标,并设置它为模型的旋转原点

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 class PointPickedSignal : public QObjectclass MouseInteractorCommand : public vtkCommandvoid A::on_pushButtonSelected_clicked()void A::on…

谷粒商城第六天-商品服务之分类管理下的获取三级分类树形列表

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 在网页中建好目录及菜单 2.1.1 建好商品目录 2.1.2 建好分类管理菜单 ​编辑 2.2 编写组件 2.2.1 先完成组件文件的创建 2.2.2 编写组件 2.2.2.1 显示三级分类树形列表 三、后端部分 3.1 编写商品分类…

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol 0. 版本0.1 SignedMath.sol 1. 目标合约2. 代码精读2.1 max(int256 a, int256 b) && min(int256 a, int256 b)2.2 average(int256 a, int256 b)2.3 abs(int256 n) 0. 版本 [openzeppelin]&#xff1a;v…

Blazor前后端框架Known-V1.2.8

V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

python整理

Python 整理&#xff08;更新中&#xff09; 一、环境搭建 1- 下载python解析器 下载地址&#xff1a;https://www.python.org/ 2- 安装解析器: 3.pycharm 安装操作 1- 下载pycharm 下载地址: https://www.jetbrains.com/pycharm/ pycharm开发第一个Python程序 在这…

css定义超级链接a标签里面的title的样式

效果: 代码: 总结:此css 使用于任何元素,不仅仅是a标签!

Flutter 使用texture_rgba_renderer实现桌面端渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频&#xff08;本…

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接&#xff0c;需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序&#xff0c;Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…

IDEA debug总结

调试一次编程题&#xff0c;发现没有掌握debug技巧&#xff0c;确实费事&#xff0c;做一次总结&#xff0c;方便以后回顾。 Run to Cursor 跳到光标处&#xff0c;适用于快速跳过循环&#xff0c;定位到光标处&#xff0c;而不用到处打断点&#xff0c;使用断点跳转。非常实…

Cilium系列-6-从地址伪装从IPtables切换为eBPF

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx_fc1‘

问题描述 训练模型时&#xff0c;分阶段训练&#xff0c;第二阶段加载第一阶段训练好的模型的参数&#xff0c;接着训练 第一阶段训练&#xff0c;含有代码 if (train_on_gpu):if torch.cuda.device_count() > 1:net nn.DataParallel(net)net net.to(device)第二阶段训练…