深入理解FIFO(包含有FIFO深度的解释)

admin | 世界杯足球赛事

深入理解FIFO(包含有FIFO深度的解释)

最新推荐文章于 2025-05-25 21:43:53 发布

坏坏成不坏

最新推荐文章于 2025-05-25 21:43:53 发布

阅读量10w+

收藏

651

点赞数

160

分类专栏:

STM32

文章标签:

FIFO

STM32

专栏收录该内容

12 篇文章

订阅专栏

深入理解FIFO(包含有FIFO深度的解释) FIFO: 一、先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。 1.什么是FIFO? FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。 2.什么情况下用FIFO? FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。 3.FIFO的一些重要参数 FIFO的宽度:也就是英文资料里常看到的THE WIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。 FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。 满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。 空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。 读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。 写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。 读指针:指向下一个读出地址。读完后自动加1。 写指针:指向下一个要写入的地址的,写完自动加1。 读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。 4.FIFO的分类 根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。异步FIFO是指读写时钟不一致,读写时钟是互相独立的。 5.FIFO设计的难点 FIFO设计的难点在于怎样判断FIFO的空/满状态。为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满/空就成了FIFO设计的核心问题。由于同步FIFO几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。 在用到触发器的设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料)。在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。其中的一个方法就是使用格雷码。格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。这就会避免计数器与时钟同步的时候发生亚稳态现象。但是格雷码有个缺点就是只能定义2^n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2^n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的各雷码了。第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为P的平方。但这回导致延时的增加。亚稳态的发生会使得FIFO出现错误,读/写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。由于考虑延时的作用,空/满标志的产生并不一定出现在FIFO真的空/满时才出现。可能FIFO还未空/满时就出现了空/满标志。这并没有什么不好,只要保证FIFO不出现overflow or underflow 就OK了。 很多关于FIFO的文章其实讨论的都是空/满标志的不同算法问题。 在Vijay A. Nebhrajani的《异步FIFO结构》一文中,作者提出了两个关于FIFO空/满标志的算法。 第一个算法:构造一个指针宽度为N+1,深度为2^N字节的FIFO(为便方比较将格雷码指针转换为二进制指针)。当指针的二进制码中最高位不一致而其它N位都相等时,FIFO为满(在Clifford E. Cummings的文章中以格雷码表示是前两位均不相同,而后两位LSB相同为满,这与换成二进制表示的MSB不同其他相同为满是一样的)。当指针完全相等时,FIFO为空。这也许不容易看出,举个例子说明一下:一个深度为8字节的FIFO怎样工作(使用已转换为二进制的指针)。FIFO_WIDTH=8,FIFO_DEPTH= 2^N = 8,N = 3,指针宽度为N+1=4。起初rd_ptr_bin和wr_ptr_bin均为“0000”。此时FIFO中写入8个字节的数据。wr_ptr_bin =“1000”,rd_ptr_bin=“0000”。当然,这就是满条件。现在,假设执行了8次的读操作,使得rd_ptr_bin =“1000”,这就是空条件。另外的8次写操作将使wr_ptr_bin 等于“0000”,但rd_ptr_bin 仍然等于“1000”,因此FIFO为满条件。 显然起始指针无需为“0000”。假设它为“0100”,并且FIFO为空,那么8个字节会使wr_ptr_bin =“1100”,, rd_ptr_bin 仍然为“0100”。这又说明FIFO为满。 在Vijay A. Nebhrajani的这篇《异步FIFO结构》文章中说明了怎样运用格雷码来设置空满的条件,但没有说清为什么深度为8的FIFO其读写指针要用3+1位的格雷码来实现,而3+1位的格雷码可以表示16位的深度,而真实的FIFO只有8位,这是怎么回事?而这个问题在Clifford E. Cummings的文章中得以解释。三位格雷码可表示8位的深度,若在加一位最为MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也就是说格雷码的0100表示表示7,而1100仍然表示7,只不过格雷码在经过一个以0位MSB的循环后进入一个以1为MSB的循环,然后又进入一个以0位MSB的循环,其他的三位码仍然是格雷码,但这就带来一个问题,在0100的循环完成后,进入1000,他们之间有两位发生了变换,而不是1位,所以增加一位MSB的做法使得该码在两处:0100~1000,1100~0000有两位码元发生变化,故该码以不是真正的格雷码。增加的MSB是为了实现空满标志的计算。Vijay A. Nebhrajani的文章用格雷码转二进制,再转格雷码的情况下提出空满条件,仅过两次转换,而Clifford E. Cummings的文章中直接在格雷码条件下得出空满条件。其实二者是一样的,只是实现方式不同罢了。 第二种算法:Clifford E. Cummings的文章中提到的STYLE #2。它将FIFO地址分成了4部分,每部分分别用高两位的MSB 00 、01、 11、 10决定FIFO是否为going full 或going empty (即将满或空)。如果写指针的高两位MSB小于读指针的高两位MSB则FIFO为“几乎满”, 若写指针的高两位MSB大于读指针的高两位MSB则FIFO为“几乎空”。 在Vijay A. Nebhrajani的《异步FIFO结构》第三部分的文章中也提到了一种方法,那就是方向标志与门限。设定了FIFO容量的75%作为上限,设定FIFO容量的25%为下限。当方向标志超过门限便输出满/空标志,这与Clifford E. Cummings的文章中提到的STYLE #2可谓是异曲同工。他们都属于保守的空满判断。其实这时输出空满标志FIFO并不一定真的空/满。 说到此,我们已经清楚地看到,FIFO设计最关键的就是产生空/满标志的算法的不同产生了不同的FIFO。但无论是精确的空满还是保守的空满都是为了保证FIFO工作的可靠。 ==================================================================================================================== 二、先进先出法 (first in,first out ,FIFO) 先进先出法是指根据先入库先发出的原则,对于发出的存货以先入库存货的单价计算发出存货成本的方法.采用这种方法的具体做法是:先按存货的期初余额的单价计算发出的存货的成本,领发完毕后,再按第一批入库的存货的单价计算,依此从前向后类推,计算发出存货和结存货的成本. 先进先出法是存货的计价方法之一。它是根据先购入的商品先领用或发出的假定计价的。用先进先出法计算的期末存货额,比较接近市价。 先进先出法是以先购入的存货先发出这样一种存货实物流转假设为前提,对发出存货进行计价的一种方法。采用这种方法,先购入的存货成本在后购入的存货成本之前转出,据此确定发出存货和期末存货的成本

确定要放弃本次机会?

福利倒计时

:

:

立减 ¥

普通VIP年卡可用

立即使用

坏坏成不坏

关注

关注

160

点赞

651

收藏

觉得还不错?

一键收藏

知道了

10

评论

分享

复制链接

分享到 QQ

分享到新浪微博

扫一扫

举报

举报

专栏目录

FIFO模式及其作用

m0_47532508的博客

04-01

709

FIFO设置读,写地址指针,FIFO初始化的时候 读指针和写指针都指向地址为0的位置, 当往FIFO里面每写一个数据,写地址指针自动加1指向下一个要写入的地址。其实可以把FIFO比作一个单向行驶的隧道,隧道两端都有一个门进行控制,FIFO宽度就是这个隧道单向有几个车道,FIFO的深度就是一个车道能容纳多少辆车,当隧道内停满车辆时,这就是FIFO的写满状态,当隧道内没有一辆车时,这便是FIFO的读空状态。同步FIFO在实际应用中比较少见,常用的是异步FIFO,但基于学习的目的,下文对两种FIFO都进行讲解。

10 条评论

您还未登录,请先

登录

后发表或查看评论

fifo.rar_FIFO 深度_FIFO深度计算_fifo_fifo 深度计算

09-19

详细介绍了fifo深度计算的方法,fifo深度的计算是面试中常被问到的问题!

异步fifo读空、写满分析(附完整异步fifo代码)

热门推荐

争取早日成为硅农

03-02

5万+

FIFO 是 First-In, First-Out 的缩写,即“先进先出”,是一种常见的数据结构,类似于排队服务。在 FIFO 结构中,最先进入的数据项首先被取出,后进入的数据项则会在队列中等待。FIFO 在计算机科学和电子工程中被广泛使用,用于数据存储和传输。特点数据按照先进先出的顺序进行存储和检索。支持两个基本操作:入队(enqueue)将数据放入队列尾部,出队(dequeue)从队列头部取出数据。FIFO 可以用数组或链表等数据结构来实现。应用领域数据缓冲。

Verilog:同步FIFO、异步FIFO

2303_76814451的博客

10-20

4130

简单介绍FIFO的原理,并用Verilog实现同步/异步FIFO设计和仿真

FIFO的工作原理及其设计

Jackiezhang1993的博客

03-21

2万+

FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个口是存储器的输入口,另一个口是存储器的输出口。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。触发导向传输结构的FIFO是由寄存器阵列构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成。FIFO与普通RAM存储器的是没有外部读写地址线(指针),使用方便,但。

什么是FIFO?

weixin_56912944的博客

07-31

3万+

FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。...

FIFO(转)

hduzhang的专栏

12-16

2575

FIFO: 一、先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。 1.什么是FIFO? FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据

FIFO

weixin_34216196的博客

04-22

112

FIFO(First In First Out)先进先出数据缓存器。

作用是作为不同速度的芯片间的缓存,或者是不同宽度数据间的缓存/匹配。

FIFO的宽度:WIDTH(宽度),指的是一次读写操作的数据位,有的芯片中是固定的,也有可选的,用FPGA实现的时候是可以自己选择的。

FIFO的深度:THE DEEPTH,指的是FIFO可以存储多少个N位的数据(N表示上边的宽度)。

FI...

FIFO是什么

xuhao0258的博客

01-28

3434

FIFO用于不同时钟域之间多bit数据传输,比如FIFO的一端是AD数据采集,另一端是PCI总线.其中AD数据采集的速率为16位100SPS,PCI总线的速度位33MHz,总线宽度为32bit,最大传输速率为1056Mbps,这两个不同时钟域间数据传输可以用FIFO作为数据缓冲.另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。

...

fifo

BigLee1986的专栏

10-25

688

fifo_write.c

#include

#include

#include

#include

#include

#include

#include

#define FIFO "/tmp/myfifo"

main(int argc,char** argv)

{

/*参数为即将写入的字节数*/

int fd;

char w_buf[100];

int

FIFO 开发过程详解及代码

08-20

FIFO 开发资料,FIFO是队列机制中最简单的,每个接口上都存在FIFO队列,表面上看FIFO队列并没有提供什么QoS(Quality of Service,服务质量)保证,甚至很多人认为FIFO严格意义上不算做一种队列技术,实则不然,FIFO是其它队列的基础,FIFO也会影响到衡量QoS的关键指标:报文的丢弃、延时、抖动。既然只有一个队列,自然不需要考虑如何对报文进行复杂的流量分类,也不用考虑下一个报文怎么拿、拿多少的问题,而且因为按顺序取报文,FIFO无需对报文重新排序。简化了这些实现其实也就提高了对报文时延的保证。

fifo.rar_FIFO 深度_VHDL语言fifo_verilog 深度 fifo_verilog编写fifo

09-19

首先,我们要理解FIFO的基本工作原理。FIFO内部由一组存储单元(如RAM或SRAM)组成,数据从一端(写端)进入并从另一端(读端)出去。当写入速度大于读取速度时,FIFO会存储多余的数据;反之,如果读取速度较快,...

fifo.rar_fifo_fifo_16_16_fifo异步_fifo深度16_异步FIFO

09-23

异步FIFO(First-In-First-Out)是一种在数字系统中常见的存储结构,它用于数据的缓冲和传输。在设计中,FIFO通常用于解决不同速度的...理解和实现这样的FIFO涉及到对数字逻辑、时序控制以及Verilog编程的深入理解。

FPGA_FIFO深度与宽度的配置及验证_程序

09-29

本文将深入探讨FPGA FIFO的深度与宽度配置以及验证方法,结合Quartus II工具进行实践。 首先,FPGA FIFO的深度是指FIFO内可以存储的数据项数量,通常以字(Word)为单位。深度的选择直接影响到FIFO的延迟特性和系统...

深入理解FIFO:异步数据缓存器解析

FIFO的关键参数包括宽度(WIDTH)和深度(DEPTH)。WIDTH定义了FIFO一次可以读写的数据位数,而DEPTH则指定了FIFO能存储的WIDTH位数据的总数。例如,一个WIDTH为8位,DEPTH为128的FIFO能存储128个8位的数据。在...

同步FIFO和异步FIFO总结

HackEle的博客

06-05

681

点击蓝字关注我们关注、星标公众号,精彩内容每日送达

来源:网络素材1. FIFO简介FIFO是一种先进先出数据缓存器,它与普通存储器的区别是没有外部读写地址线,使用起来非常简单,缺点是只能顺序读写,而不能随机读写。2. 使用场景数据缓冲:也就是数据写入过快,并且间隔时间长,也就是突发写入。那么通过设置一定深度的FIFO,可以起到数据暂存的功能,且使得后续处理流程平滑。时钟域的隔离:主要用异步FIF...

FPGA的Verilog设计(二)——异步FIFO

weixin_51116586的博客

12-08

2500

在上篇文章同步FIFO中简要介绍了FIFO的基本概念以及同步FIFO的实现。本篇文章将重点介绍异步FIFO的工作原理以及硬件实现。

FPGA笔记之FIFO

最新发布

weixin_58616976的博客

05-25

9

FIFO用于缓存数据,特点是先进先出,当需要访问随机地址时,采用RAM作为存储器,当不需要随机访问,只需顺序读取时则可采用FIFO作为存储器。FIFO可分为同步FIFO和异步FIFO同步FIFO:读时钟和写时钟为同一个时钟,在时钟沿来临时,同时发生读操作;异步FIFO:读时钟和写时钟为不一致,读写时钟是相互独立的。将空标志:almost_empty,FIFO即将被读空。