FIFO深度计算问题

2023-05-16

FIFO深度计算公式:
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk

burst_length :突发数据个数
X,Y:读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
r_clk:读时钟
w_clk:写时钟

1,同步FIFO

对于同步fifo,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,fifo的深度至少为?
答:
每100个cycle可以写入80个数据,我们考虑最坏的情况,背靠背模式,空20个时钟,剩下80个时钟写80个数据,再用80个时钟写80个数据,空20个时钟,这样的结果就是连着写了160个数据,共用了200个时钟,突发数据个数是160
所以
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
同步FIFO,读写时钟相同,r_clk=w_clk;
fifo_depth = 160 - 160 *(8/10) * 1 = 160-128=32

2,异步FIFO

wclk=200mhz,100个wclk里写入40个数据,rclk=100mhz,10个rclk里读出8个数据。那么fifo深度为?
答:我们考虑最坏的情况,背靠背模式,即空60个wclk,剩下40个wclk写入有40个数据,接着40个wclk写40个数据,空60个wclk,那么突发数据个数为40+40=80
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 80 - 80 *(8/10) * 100/200 = 80-32=48

FIFO的深度一般是2的整数次幂,要符合格雷码的编码转换规则,因此我们深度一般不选择48,而是选择比它大的2的整数次幂的数,比如64或者128

在这里插入图片描述
答:可以看出,B的时钟要大于A的时钟,如果B为读时钟,那么A为写时钟,那就是读时钟大于写时钟,读的比写的快,那么不会溢出了,所以B应该是写时钟,A为读时钟
假设读clkA=100MHZ,写clkB=400MHZ, 则周期Ta=10ns ,Tb=2.5ns ,则 enB=10100=1000ns,enB的占空比为25%,即周期的25%为高电平,即为写数据的时钟时长,T_enB=100025%=250ns,T_enB/Tb=250/2.5 = 100个数据,同时在这250ns时间里面,读书数据的个数为250/Ta=250/10=25,
所以FIFO深度为100-25=75

下面举几个例子:

第一种情况:

写时钟快于读时钟写和读的过程中没有空闲周期,也即在突发(burst)过程中,读和写都在各自的时钟域内连续进行。
在这里插入图片描述

答:
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1 * 50/80 = 120 - 75 = 45
第二种方法:分析
写时钟周期Tw = 1000/80 = 12.5ns
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要的写时间为120*12.5 = 1500ns
在1500ns的时间,读了数据个数为1500/20 = 75
所以120-75 = 45

第二种情况

写时钟频率大于读时钟频率,但在读写的过程中存在空闲周期。
在这里插入图片描述
答:
两个写数据之间空一个时钟,即2个时钟写1个数据
两个读数据之间空3个时钟,即4个时钟读1个数据
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/4 * 50/80 = 120 - 18.75 =
第二种方法:分析
写时钟周期Tw = 1000/80 = 12.5ns
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要240个时钟,需要的写时间为24012.5 = 3000ns
在3000ns的时间,读了数据个数为3000/(20
4) = 37.5
最后0.5是不完整数据,取整为37,
所以120-37 = 83

第三种情况

写时钟慢于读时钟,且读写过程中没有空闲周期;
在这里插入图片描述

答: 读写没有空闲,而且写时钟慢于读时钟,所以应该是永远不会写满,即不会溢出,fifo的深度为1即可

第四种情况

写时钟频率小于读时钟频率,但读写过程中存在空闲周期;
在这里插入图片描述
答:
两个写数据之间空一个时钟,即2个时钟写1个数据
两个读数据之间空3个时钟,即4个时钟读1个数据
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/4 * 50/30 = 120 - 50 = 70
第二种方法:分析
写时钟周期Tw = 1000/30
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要240个时钟,需要的写时间为2401000/30= 8000ns
在8000ns的时间,读了数据个数为8000/(20
4) = 100
所以120-100 = 20

第五种情况

读写时钟速率相同,且无空闲时钟
在这里插入图片描述
答:
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/* 1 = 0
如果读写时钟之间没有相位差,则不需要FIFO就可以进行读写呀;
如果二者存在相位差,只需要FIFO的深度为1即可。

第六种情况

读写时钟频率一致,但在读写过程中存在空闲周期。
在这里插入图片描述
答:
两个写数据之间空一个时钟,即2个时钟写1个数据
两个读数据之间空3个时钟,即4个时钟读1个数据
第一种方法:采取公式计算
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
fifo_depth = 120 - 120 * 1/4 * 50/50 = 120 - 30 = 90
第二种方法:分析
写时钟周期Tw = 1000/50=20ns
读时钟周期Tr = 1000/50 = 20ns
突发长度是120,写120个数据,需要240个时钟,需要的写时间为24020= 4800ns
在4800ns的时间,读了数据个数为4800/(20
4) =60
所以120-60 = 60

第七种情况

特定条件下,最坏情况分析FIFO最小深度;
在这里插入图片描述
答:
100个时钟周期写80个数据,考虑最坏的情况,即背靠背的方式,空闲20个时钟,剩余80个时钟写80个数据,接着80个时钟写80个数据,空20个时钟,最后的结果就是用160个时钟要写160个数据,即突发长度是160,
每10个时钟读8个数据,160个时钟读了128个数据,
FIFO的深度=160-128 = 32

参考文献1
https://blog.csdn.net/Reborn_Lee/article/details/100127937
参考文献2
https://hardwaregeeksblog.files.wordpress.com/2016/12/fifodepthcalculationmadeeasy2.pdf

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

FIFO深度计算问题 的相关文章

  • C语言环形队列缓冲-FIFO_RingBuffer

    ring buffer h span class token macro property span class token directive hash span span class token directive keyword if
  • Python:使用装饰器模拟实现FIFO缓存

    使用装饰器模拟实现FIFO缓存 在学习python过程中找到一个非常不错的网站 xff0c 看到博主讲解装饰器的时候给出了模拟FIFO缓存的代码 xff0c 但是代码中有一些缺陷 xff0c 本文在学习该博主的代码的基础上 xff0c 修补
  • FreeRTOS内核:详解Queue队列 FIFO(GPT4帮写)

    FreeRTOS内核 xff1a 详解队列管理FIFO 1 背景2 Queue相关API2 1 xQueueCreate xff1a 创建2 2 xQueueSend xff1a 发送2 3 xQueueReceive xff1a 接收2
  • the read modes of FPGA FIFO —FWFT and Standard

    1 FWFT first word fall through 模式 xff1a 当rd en由低跳变到高电平时候 xff0c FIFO读出的数据FIFO dout 立即读出来 2 Standard 标准模式 xff1a 当rd en由低跳变
  • bsp_uart_fifo

    bsp uart fifo h 模块名称 串口中断 43 FIFO驱动模块 文件名称 bsp uart fifo h 说 明 头文件 ifndef BSP USART FIFO H define BSP USART FIFO H
  • 同步FIFO和异步FIFO1、FIFO定义FIFO是英文First In First Out的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但

    1 FIFO定义 FIFO是英文First In First Out的缩写 xff0c 是一种先进先出的数据缓存器 xff0c 他与普通存储器的区别是没有外部读写地址线 xff0c 这样使用起来非常简单 xff0c 但缺点就是只能顺序写入数
  • DSP28335使用FIFO的串口中断总结

    一 串行通信与并行通信 DSP控制器间 xff0c DSP控制器与外部设备间交换信息 xff0c 通信 xff0c 可采取的通信方式主要两大类1 串行通信 2 并行通信 并行通信一般包括多条数据线 多条控制线和状态线 xff0c 传输速度快
  • Java中队列FIFO(First-In-First-Out),栈LIFO(Last-In-First-Out)的实现

    size 61 small Deque接口定义了QUEUE First In First Out 的功能 xff0c 同时也定义了Stack Last In First Out 的功能 java util Deque lt E gt A l
  • DSP28335 SCI FIFO深度设置

    SCI工作在FIFO模式下一般是因为所传输的信息并不是以一个字节为单位 xff0c 而是以多个字节组成的一个包为单位的 如果一包数据包括10个字节 xff0c 可以设置FIFO接收中断为10个字节时产生中断 设置以后 xff0c 每接收到1
  • 转:DSP28335使用FIFO的串口中断总结

    版权声明 xff1a 本文为CSDN博主 E ROAD BY U 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https blog csdn net E R
  • fifo介绍及fifo IP核使用(工程文件获取请参考文末)

    一 fifo简介 1 fifo first in first out的缩写 先进先出数据缓存器 与普通存储器的区别 对外接口没有地址线 由此所带来的优点是 不用处理地址信号 时序较简单 缺点是 不能像普通存储器那样自由读写某个地址的数据 只
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • 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
  • 写入/读取 FIFO 文件 - linux

    我一直在尝试了解 FIFO 并提出了一个简单的服务器和客户端程序 我不想做任何花哨的事情 只是让一个进程扮演 服务器 的角色 这个进程将 监听 另一个进程传递的任何消息 客户端 这是我写的 server c include
  • Go 中的 Unix FIFO?

    有没有办法用Go语言创建unix FIFO 没有Mkfifo nor Mknod in os包 尽管我预计命名的 FIFO 主要用于 posix 操作系统 事实上 有一个创建未命名的 FIFO 管道 的函数 但没有创建命名管道的函数 我是唯
  • 完全通过 FIFO 连接到 MySQL 客户端

    在 Bash 脚本中 我想在多个顺序访问中保持 MySQL 会话打开 访问 MySQL 的常见方法是为每个 SQL 命令或命令集打开一个单独的会话 例如 mysql u user e show tables 此方法的限制是那些需要双重事务的
  • 在 C++ 中创建 Windows 命名管道

    我正在尝试在 C Windows 中创建两个进程之间的简单通信 就像 Linux 中的 FIFO 一样 这是我的服务器 int main HANDLE pipe CreateFile TEXT pipe Pipe GENERIC READ
  • 检测程序何时打开 fifo

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

    哪种 STL 容器最适合我的需求 我基本上有一个 10 个元素宽的容器 我在其中不断地push back新元素的同时pop front计算最旧的元素 大约一百万次 我目前正在使用std deque对于这项任务 但想知道是否std list会

随机推荐