FIFO最小深度计算

2023-11-07

FIFO最小深度计算


1、FIFO最小深度

  在数据的传输中当读速率慢于写速率时,FIFO便可被用作系统中的缓冲元件或队列,类似于水流经过一个缓冲区,上游水流速度快,下游水流速度慢,部分水就可以被缓存在中间的缓冲区,但是上游与下游的水速差距过大,就会导致流入中间缓存区的水超出了缓存区承受能力导致水的溢出,不能顺利到达下游。在上游水流速度最大,下游水流速度最小的情况下,中间缓冲区不能溢出的大小就是我们关系的问题。
在这里插入图片描述
  同理,读写速率差距过大,FIFO深度太小,就会导致一段时间内向FIFO灌输的数据超出了FIFO的承受能力,就会导致数据的丢失,该容量取决于读写数据的速率。所以在写速率最大,读速率最小时,这时正好不导致数据溢出的FIFO的深度就是我们要计算的FIFO最小深度。

FIFO写入速率快,读出速度慢模型:
请添加图片描述
最简单的写快读慢的实例,FIFO写入一个数据需要1s,读取一个数据需要2s,一共传输6个数据。(下图)

6个数据写入需要时间为:6×1=6 s
6s读取的数据为:6/2=3个
6s FIFO内剩余数据的个数:6-3=3个
6s才能读取3个数据,剩余的数据3个在FIFO中缓冲,在6s的之后的时间才能被缓慢读出。

仔细观察下图(写快读慢),FIFO中最多存在3个数据,该容量就是FIFO的最小深度。
该FIFO的最小深度 = 6 - 3 = 3(如果深度小于3,则会导致数据丢失)。

总结:要确定FIFO的深度,关键在于计算出在突发读写的这段时间内有多少数据没有被读走。也就是说FIFO的最小深度就等于没有被读走的数据个数。

请添加图片描述
FIFO写入与读取速度相同:
读数据速率比写数据快,因此FIFO只起到变换时钟域的作用,FIFO最下深度为1即可。
请添加图片描述

2、示例分析


示例一:

写入速率 > 读取速率

A/D采样率为50MHz,读A/D的速率为40MHZ,要不丢失地将10万个采样数据送入FPGA,在A/D和FPGA之间至少加多大容量(深度)的FIFO才可以?

写一个数据所需的时间为: 1 / 50 M H z = 0.02 × 1 0 − 6 s 1/50MHz=0.02×{10^{ - 6}}s 1/50MHz=0.02×106s

写完所有的数据所需的时间为: 100 , 000 × 0.02 × 1 0 − 6 = 0.002 s 100,000×0.02×{10^{ - 6}} = 0.002s 100,000×0.02×106=0.002s

读一个数据所需的时间为: 1 / 40 M H z = 0.025 × 1 0 − 6 s 1/40MHz=0.025×{10^{ - 6}} s 1/40MHz=0.025×106s
0.002S内读走的数据为: 0.002 / ( 0.025 × 1 0 − 6 ) = 0.08 × 1 0 6 = 80 , 000 0.002/(0.025×{10^{ - 6}}) = 0.08×{10^{ 6}} = 80,000 0.002/(0.025×106)=0.08×106=80,000

则FIFO的最小深度为: 100 , 000 − 80 , 000 = 20 , 000 ( 0.002 s 还 没 有 被 读 走 的 数 据 的 个 数 ) 100,000 - 80,000=20,000(0.002s还没有被读走的数据的个数) 100,00080,000=20,0000.002s

(如果读比写慢几拍,则深度比20,000略大)

示例二:

FIFO写入时钟为100MHz,读取时钟为80Mhz,分以下情况分析。


①:传输2000个数据,FIFO最小深度为多少?

100MHz时钟写入一个数据需要的时间为
1 / 100 M H z = 10 n s 1/100MHz=10ns 1/100MHz=10ns
写入2000个数据所需的时间为
2000 × 10 = 20000 n s 2000×10=20000ns 2000×10=20000ns
80MHz时钟读出一个数据所需的时钟
1 / 80 M H z = 12.5 n s 1/80MHz=12.5ns 1/80MHz=12.5ns
20000ns读出的数据个数为
20000 n s / 12.5 n s = 1600 20000ns / 12.5ns=1600 20000ns/12.5ns=1600
剩余FIFO中没读走的数据个数为
2000 − 1600 = 400 2000-1600=400 20001600=400
所以FIFO的最小深度为400。


②:100个时钟写入80个数据,1个时钟读1个数据,求FIFO的最小深度

100MHz时钟写入一个数据需要的时间为
1 / 100 M H z = 10 n s 1/100MHz=10ns 1/100MHz=10ns
80MHz时钟读出一个数据所需的时钟
1 / 80 M H z = 12.5 n s 1/80MHz=12.5ns 1/80MHz=12.5ns
100个时钟写入80个数据,可以以下理解,100个时钟包含80个有效写时钟,20个空闲时钟。
在这里插入图片描述
但是在什么情况下会出现突发写入数据最多呢,在两个100个时钟,前一个100个时钟的后80个时钟在写数据,后100个时钟的前80个数据在写数据,也就是如下所示:
在这里插入图片描述
在这种情况下,以100MHz的时钟一次写入了160个数据。

写入160个数据所需的时间为
160 × 10 n s = 1600 n s 160×10ns=1600ns 160×10ns=1600ns
1600ns读取的数据个数为
1600 n s / 12.5 n s = 128 1600ns/12.5ns=128 1600ns/12.5ns=128
FIFO内剩余的数据为
160 − 128 = 32 160-128=32 160128=32
所以FIFO最小深度为32


③:100个时钟写入80个数据,3个时钟读1个数据,求FIFO的最小深度

100MHz时钟写入一个数据需要的时间为
1 / 100 M H z = 10 n s 1/100MHz=10ns 1/100MHz=10ns
80MHz时钟读出一个数据所需的时钟
( 1 / 80 M H z ) × 3 = 12.5 × 3 n s (1/80MHz)×3=12.5×3ns (1/80MHz)×3=12.5×3ns
100个时钟写入80个数据,可以以下理解,100个时钟包含80个有效写时钟,20个空闲时钟。

在这里插入图片描述

但是在什么情况下会出现突发写入数据最多呢,在两个100个时钟,前一个100个时钟的后80个时钟在写数据,后100个时钟的前80个数据在写数据,也就是如下所示:

在这里插入图片描述

在这种情况下,以100MHz的时钟一次写入了160个数据。

写入160个数据所需的时间为
160 × 10 n s = 1600 n s 160×10ns=1600ns 160×10ns=1600ns
1600ns读取的数据个数为
1600 n s / ( 12.5 × 3 ) n s = 42.66 1600ns/(12.5×3)ns=42.66 1600ns/(12.5×3)ns=42.66
FIFO内剩余的数据为
160 − 42.66 = 117.33 160-42.66=117.33 16042.66=117.33
所以FIFO最小深度为118(FIFO一般设置为2的n次幂(128))。


④:100个时钟写入80个数据,3个时钟读2个数据,求FIFO的最小深度

100MHz时钟写入一个数据需要的时间为
1 / 100 M H z = 10 n s 1/100MHz=10ns 1/100MHz=10ns
80MHz时钟读出一个数据所需的时钟
( 1 / 80 M H z ) × 3 / 2 = 12.5 × 3 / 2 n s (1/80MHz)×3/2=12.5×3/2ns (1/80MHz)×3/2=12.5×3/2ns
100个时钟写入80个数据,可以以下理解,100个时钟包含80个有效写时钟,20个空闲时钟。
在这里插入图片描述
但是在什么情况下会出现突发写入数据最多呢,在两个100个时钟,前一个100个时钟的后80个时钟在写数据,后100个时钟的前80个数据在写数据,也就是如下所示:

在这里插入图片描述
在这种情况下,以100MHz的时钟一次写入了160个数据。

写入160个数据所需的时间为
160 × 10 n s = 1600 n s 160×10ns=1600ns 160×10ns=1600ns
1600ns读取的数据个数为
1600 n s / ( 12.5 × 3 / 2 n s ) n s = 85.33 1600ns/(12.5×3/2ns)ns=85.33 1600ns/(12.5×3/2ns)ns=85.33
FIFO内剩余的数据为
160 − 42.66 = 74.66 160-42.66=74.66 16042.66=74.66
所以FIFO最小深度为75(FIFO一般设置为2的n次幂(128))。

★★★如有错误,欢迎指导!!!

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

FIFO最小深度计算 的相关文章

  • Verilog的基础知识

    Verilog的基本介绍 硬件描述语言发展至今已有二十多年历史 当今业界的标准中 IEEE标准 主要有VHDL和Verilog HDL 这两种硬件描述语言 一个设计往往从系统级设计开始 把系统划分成几个大的基本的功能模块 每个功能模块再按一
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • AWS SQS FIFO - 如何一次获取超过 10 条消息?

    目前我们想要拉下一个整个 FIFO 队列 并处理内容 如果有任何问题 将消息释放回队列中 问题是 目前 AWS 只给我们 10 条消息 并且不会再给我们 10 条消息 这是在 SQS 中获取批量消息的方式 多个 10 条最大消息请求 直到我
  • 无法写入通过 NFS 连接的 FIFO 文件

    我正在尝试写入位于 NFS 安装上的 FIFO 文件 但它会阻塞 可能是什么问题呢 我的 etc export tmp test 10 0 0 0 24 rw no root squash async NFS 服务器和客户端上的 ls tm
  • 64 位 ALU 输出在 TestBench 波上显示高阻抗

    我必须制作一个 64 位 ALU 它接受 A 和 B 64 位输入 进位输入输入并输出 64 位结果以及 1 位进位输出 还有一个 5 位功能选择 FS 其中 FS 0 控制 B 是否反转 使用 2to1 多路复用器 F 1 对 A 执行相
  • VHDL——连接开关和LED

    我有 Xilinx Spartan6 和下一个 VHDL 代码 library ieee use ieee std logic 1164 all use ieee numeric std all entity Switches Leds i
  • VHDL:按钮去抖动(或不去抖动,视情况而定)

    我已阅读其他帖子 但似乎无法修复我的 我是 VHDL 新手 所以我确信这是一个简单的修复 简而言之 按钮没有防抖 代码编译和比特流程序 在测试台中 按下按钮可以工作 但输出 LED 不会改变 在板上 按下按钮会使随机 LED 亮起 我猜是因
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • 在 C 中操作 80 位数据类型

    我正在用 C 实现一些加密算法 其中涉及 80 位密钥 特定操作涉及将密钥旋转移位 x 个位数 我已经尝试过 long double 类型 如果我没记错的话 它是 80 位 但这不适用于位移运算符 我能想到的唯一替代方案是使用 10 个元素
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • 使用 VHDL 实例化 FPGA 中的 RAM

    我试图按照中的指导实现双端口 RAM这篇优秀的博文 http danstrother com 2010 09 11 inferring rams in fpgas 然而 ModelSim 在编译时给出以下警告 Warning fifo ra
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • 如何保证 ThreadPoolExecutor 中的 FIFO 执行顺序

    我用这行代码创建一个 ThreadPoolExecutor private ExecutorService executor new ThreadPoolExecutor 5 10 120 TimeUnit SECONDS new Arra
  • PyOpenCL 中的时间测量

    我正在 FPGA 和 GPU 中使用 PyOpenCL 运行内核 为了测量执行所需的时间 我使用 t1 time event mykernel queue c width c height block size block size d c
  • 让 readline 在 FIFO 上阻塞

    我创建一个 fifo mkfifo tofetch 我运行这个Python代码 fetchlistfile file tofetch r while 1 nextfetch fetchlistfile readline print next
  • VHDL 中的 BRAM_INIT

    我正在模拟基于处理器的设计 其中程序存储器内容保存在 BRAM 中 我正在使用 VHDL 推断 BRAM 实现程序存储器 我试图避免使用 CoreGen 因为我想保持设计的可移植性 最终该设计将进入 FPGA 我想看看是否有一种方法可以使用
  • 检测程序何时打开 fifo

    我遇到一种情况 我需要检查 fifo 的另一侧是否已打开它 但是我不能使用 open 因为否则程序将开始执行操作 为什么我必须这样做 我有一个程序 监视器 来启动服务器程序 都是我创建的 监视器使用此 fifo 进行通信 因为监视器可以在服
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • 从 OpenCV 代码到 FPGA 代码的转换是否比 Matlab 代码更容易? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想做一个关于图像处理的项目 我想知道如果我想在FPGA上实现这个项目 我应该在第一阶段选择Matla
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻

随机推荐

  • Java Precondition类

    Public final class Preconditions extends Object 通过Precondition类 你可以声明你期望为真的表达式 就像在JUnit assertTrue调用时的断言 注意 在errorMessag
  • git rebase -i

    git rebase i 是一种交互式的 rebase 方式 其中 i 是 interactive 的简写 这种方式允许你修改一系列的 commit 信息 在 rebase 过程中有选择地选择 编辑或者合并 commit 在执行 git r
  • 剑指Offer—— 最小的K个数

    题目描述 输入n个整数 找出其中最小的K个数 例如输入4 5 1 6 2 7 3 8这8个数字 则最小的4个数字是1 2 3 4 第一种方法是全排序 先把数组进行排序 排序后依次输出最小的4个 时间复杂度为nlogn 第二种方法是的原理和快
  • MES是什么?有什么作用?

    近年来 随着JIT Just In Time BTO 面向订单生产 等新型生产模式的提出 以及客户 市场对产品质量提出更高要求 MES逐渐被发现重视 同时在网络经济泡沫的破碎后 企业开始认识到要从最基础的生产管理上提升竞争力 即只有将数据信
  • php工作量,区块链扫盲篇之使用PHP实现区块链(二) - 工作量证明

    1 前言 上一篇文章我们介绍了区块链的最基本数据结构 区块 而且还构建了一个最原始的区块链 但是现在我们很容易就可以向区块链中添加区块 这样有可能导致大量的区块在同时添加到区块链中 从而导致广播风暴 而且在分布式环境中 如果并发量太大会导致
  • 【测评】PaMu Unique真无线蓝牙耳机,国潮新时尚,年轻人的标配

    本文作者为体验师 喝酸奶舔盖斯基 首发于糖纸众测 目 录 测评信息 外观设计 通话降噪 CD音质 续航持久 佩戴舒适 测评信息 产品名称 神偷奶爸小黄人系列真无线蓝牙耳机 设备型号 T6D 辅测设备 荣耀MagicBook笔记本 小米8手机
  • Unity协程和线程的区别深入理解(附实验展示)

    Unity协程和线程的区别附实验展示 写在前面 协程 进程 线程的概念 进程与线程的区别 协程与线程的区别 实验1 协程中执行普通函数 实验2 协程中开启另一个协程 实验3 协程中开启WWW请求 实验4 一个脚本中多个协程访问临界资源 实验
  • grbl控制3轴机械臂 原理 实现 (二) 之3D机械臂模拟及实现

    参考文章 https www alanzucconi com 2020 09 14 inverse kinematics in 3d 上一篇 grbl控制3轴机械臂 原理 实现 一 之2D机械臂模拟及实现 3轴机械臂几何分析 到目前为止 我
  • 应用于电力计能表的RFID仓储管理系统

    1 应用背景 电力计量中心是电力行业的电能计量检测机构 承担辖区内电能计量器具安全生命周期管理的职能 包括采购 仓储 检测 配送 安装 运行监测等各个环节 随着城网改造和居民一户一表工作的深入进行 电力新装用表数量急剧增加 传统的计量中心难
  • 夏普SHARP AR-2818 一体机驱动

    夏普SHARP AR 2818 一体机驱动是官方提供的一款一体机 打印 扫描 驱动 本站收集提供高速下载 用于解决一体机与电脑连接不了 无法正常使用的问题 本动适用于 Windows XP Windows 7 Windows 8 Windo
  • 干货分享丨Java开发稳步进阶之JVM内存区域,看完记得收藏!

    Java语言最重要的特点之一 跨平台使用 正是由于JVM的存在 想要Java开发稳步进阶 学JVM这条路绕不开 1 为什么要学JVM 我们都知道 要做Java开发 必须在你的电脑上安装JDK才行 安装JDK之后里面会有一个JRE的目录 JR
  • PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-java.lang.Exception

    转https stackoverflow com questions 29117679 spring transactional management propagation required isolation default DEBUG
  • C语言——判断密码复杂程度

    题目 编写一个函数 传入密码 判断密码复杂程度 判断密码是否包含大写 小写 数字 解题思路 我们设定若包含大写 小写 数字其中一类为简单 包含两类为中等 三类为复杂 暂时不考虑其他字符的出现 我们预先设定密码为 Maobing520 主函数
  • layui分页遇到的问题及button和input的区别

    参考文献 漂亮分页样式和代码 http layui shagua wiki layuidoc demo laypage html 按钮input和代码 http www shagua wiki project 3 p 84
  • idea 运行vue项目,修改vue代码后,不起左右。删掉.idea重新导入就好了

    这是第二次修改vue代码后不起作用了 不知道idea2019怎么搞的 删掉 idea重新导入就好了 附 要vue 3 0及以上 才有public目录 2 x没有
  • C++-Z字扫描实现(Zigzag Scan)

    Z字扫描 Zigzag Scan 将二维矩阵压缩成行输出 int index 0 for int i 0 i
  • 使用FastGithub,告别无法访问Github

    FastGithub github定制版的dns服务 解析github最优的ip 源代码开源在github 加速原理 多种渠道获取github的ip github公开的ip 各dns服务器提值的ip ipaddress com反查的ip 轮
  • JavaScript的关键字详解

    1 abstract 抽象的 2 continue 用于跳过循环中的一个迭代 并继续执行循环中的下一个迭代 3 finally 在 try 和 catch 之后无论有无异常都会执行 4 instanceof 5 private 6 fals
  • Mac流程图工具-StarUML介绍

    转载请注明来源 作者 loongshawn http blog csdn net loongshawn article details 78786685 建议读者阅读原文 确保获得完整的信息 1 背景说明 推荐一款Mac流程图工具 效果如下
  • FIFO最小深度计算

    FIFO最小深度计算 文章目录 1 FIFO最小深度 2 示例分析 1 FIFO最小深度 在数据的传输中当读速率慢于写速率时 FIFO便可被用作系统中的缓冲元件或队列 类似于水流经过一个缓冲区 上游水流速度快 下游水流速度慢 部分水就可以被