【FPGA IP系列】FIFO深度计算详解
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入门到精通原创,有任何问题,都可以在评论区和我交流哦
您的支持是我持续创作的最大动力!如果本文对您有帮助,请给一个鼓励,谢谢。
相关文章:
【FPGA IP系列】FIFO深度计算详解
FIFO(First In First Out)是一种先进先出的存储结构,经常被用来在FPGA设计中进行数据缓存或者匹配传输速率。 FIFO的一个关键参数是其深度,也就是FIFO能够存储的数据条数,深度设计的合理,可以防止数据溢出,也可以节省…...
JavaScript中语句和表达式
在JavaScript编程中,Statements和Expressions都是代码的构建块,但它们有不同的特点和用途。 ● Statements(语句)是执行某些操作的完整命令;每个语句通常以分号结束。例如,if语句、for语句、switch语句、函…...
打卡力扣题目十
#左耳听风 ARST 打卡活动重启# 目录 一、题目 二、解决方法一 三、解决方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Shar…...
UniApp实现API接口封装与请求方法的设计与开发方法
UniApp实现API接口封装与请求方法的设计与开发方法 导语:UniApp是一个基于Vue.js的跨平台开发框架,可以同时开发iOS、Android和H5应用。在UniApp中,实现API接口封装与请求方法的设计与开发是一个十分重要的部分。本文将介绍如何使用UniApp实…...
利用小波分解信号,再重构
function [ output_args ] example4_5( input_args ) %EXAMPLE4_5 Summary of this function goes here % Detailed explanation goes here clc; clear; load leleccum; s leleccum(1:3920); % 进行3层小波分解,小波基函数为db2 [c,l] wavedec(s,3,db2); %进行…...
QT数据库编程
ui界面 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QButtonGroup> #include <QFileDialog> #include <QMessageBox> MainWindow::MainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::M…...
基于stm32单片机的直流电机速度控制——LZW
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、实验目的二、实验方法三、实验设计1.实验器材2.电路连接3.软件设计(1)实验变量(2)功能模块a)电机接收信号…...
实际项目中使用mockjs模拟数据
项目中的痛点 自己模拟的数据对代码的侵入程度太高,接口完成后要删掉对应的代码,导致接口开发完后端同事开发完,前端自己得加班;接口联调的时间有可能会延期,接口完成的质量参差不齐;对于数据量过大的模拟…...
【家庭公网IPv6】
家庭公网IPv6 这里有两个网站: 1、 IPV6版、多地Tcping、禁Ping版、tcp协议、tcping、端口延迟测试,在本机搭建好服务器后,可以用这个测试外网是否可以访问本机; 2、 IP查询ipw.cn,这个可以查询本机的网络是否IPv6访问…...
【iOS】Frame与Bounds的区别详解
iOS的坐标系 iOS特有的坐标是,是在iOS坐标系的左上角为坐标原点,往右为X正方向,向下为Y正方向。 bounds和frame都是属于CGRect类型的结构体,系统的定义如下,包含一个CGPoint(起点)和一个CGSiz…...
SpringBoot百货超市商城系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBoot框架开发的百货超市系统。首先,这是一个很适合SpringBoot初学者学习的项目,代…...
【实践篇】推荐算法PaaS化探索与实践 | 京东云技术团队
作者:京东零售 崔宁 1. 背景说明 目前,推荐算法部支持了主站、企业业务、全渠道等20业务线的900推荐场景,通过梳理大促运营、各垂直业务线推荐场景的共性需求,对现有推荐算法能力进行沉淀和积累,并通过算法PaaS化打造…...
持续贡献开源力量,棱镜七彩加入openKylin
近日,棱镜七彩签署 openKylin 社区 CLA(Contributor License Agreement 贡献者许可协议),正式加入openKylin 开源社区。 棱镜七彩成立于2016年,是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来&…...
Kafka的消费者如何管理偏移量?
在Kafka中,消费者可以通过管理和跟踪偏移量(offset)来确保消费者在消费消息时的准确性和可靠性。偏移量表示消费者在特定分区中已经消费的消息的位置。以下是几种常见的偏移量管理方式: 手动提交偏移量:消费者可以通过…...
IntelliJ IDEA流行的构建工具——Gradle
IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 如…...
nacos源码打包及相关配置
nacos 本地下载后,需要 install 下: mvn clean install -Dmaven.test.skiptrue -Dcheckstyle.skiptrue -Dpmd.skiptrue -Drat.skiptruenacos源码修改后,重新打包生成压缩包命令:在 distribution 目录中运行: mvn -Pr…...
【机器学习】Multiple Variable Linear Regression
Multiple Variable Linear Regression 1、问题描述1.1 包含样例的X矩阵1.2 参数向量 w, b 2、多变量的模型预测2.1 逐元素进行预测2.2 向量点积进行预测 3、多变量线性回归模型计算损失4、多变量线性回归模型梯度下降4.1 计算梯度4.2梯度下降 首先,导入所需的库 im…...
自己创建的类,其他类中使用错误
说明:自己创建的类,在其他类中创建,报下面的错误(Cannot resolve sysmbol ‘Redishandler’); 解决:看下是不是漏掉了包名 加上包名,问题解决;...
Packet Tracer – 使用 TFTP 服务器升级思科 IOS 映像。
Packet Tracer – 使用 TFTP 服务器升级思科 IOS 映像。 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 192.168.2.1 255.255.255.0 不适用 R2 G0/0 192.168.2.2 255.255.255.0 不适用 S1 VLAN 1 192.168.2.3 255.255.255.0 192.168.2.1 TFTP …...
并查集基础
一、概念及其介绍 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
