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

一文读懂【FIFO】 8bit位宽的异步FIFO,一个package的大小为4※1024/8=512Word,100MHz的输入时钟,传送一个Word需要的时间为1/100MHz,则发送一个package需要的时间T=512/100MHz,95MHz的输出时钟,接受一个Word需要的时间为1/95MHz,发送一个package的时间所能接受的数据量为(512※95)/100word=486.4word,所以FIFO的深度至少为512-486.4=25.6=26。同时由于格雷码的引入,使得FIFO的深度只能是2的幂次方。 阅读详情

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来达到数据匹配的目的。

 

  FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作,它主要有几方面的功能:

  1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;

  2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;

  3)允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。


  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的空/满标志产生问题。

  在用到触发器的设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料)。在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。其中的一个方法就是使用格雷码。格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。这就会避免计数器与时钟同步的时候发生亚稳态现象。但是格雷码有个缺点就是只能定义2n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的各雷码了。第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为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的做法使得该码在两处:01001000,11000000有两位码元发生变化,故该码以不是真正的格雷码。增加的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)

  先进先出法是指根据先入库先发出的原则,对于发出的存货以先入库存货的单价计算发出存货成本的方法.采用这种方法的具体做法是:先按存货的期初余额的单价计算发出的存货的成本,领发完毕后,再按第一批入库的存货的单价计算,依此从前向后类推,计算发出存货和结存货的成本.

  先进先出法是存货的计价方法之一。它是根据先购入的商品先领用或发出的假定计价的。用先进先出法计算的期末存货额,比较接近市价。

  先进先出法是以先购入的存货先发出这样一种存货实物流转假设为前提,对发出存货进行计价的一种方法。采用这种方法,先购入的存货成本在后购入的存货成本之前转出,据此确定发出存货和期末存货的成本

 

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

相关推荐

深入学习FIFO

深入理解FIFO、同步FIFO和异步FIFO、FIFO设计的难点以及FIFO深度计算

好好学习,天天向上 2646

FIFO(二):FIFO工作原理

FIFO工作原理 根据FIFO工作的时钟域分为同步/异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟在时钟沿来临时同时发生读写。异步FIFO读写时钟不一致,读写相互独立。 1.读写指针的工作原理 读指针:总是指向下一个将要读取的单元,复位时指向第一个单元(编号为0); 写指针:总...

风中少年的博客 6万+

RA8D2 ADC16H FIFO机制深度解析:从寄存器配置到数据流实战

在嵌入式系统开发中,模数转换器(ADC)是实现模拟信号数字化的核心组件,其性能直接影响系统的感知精度与实时性。ADC的工作原理是将连续的模拟电压信号,通过采样、量化和编码,转换为微控制器可处理的数字值。为了提升数据采集效率并降低CPU负载,现代高性能ADC模块(如RA8D2的ADC16H)普遍集成了硬件FIFO(先进先出)缓冲机制。该机制通过硬件队列管理转换结果,允许开发者设置中断阈值,在数据积累到一定程度时触发批量搬运,从而将CPU从频繁的中断服务中解放出来,实现高效、稳定的数据吞吐。这项技术在需要高采样

weixin_33946605的博客 357

FIFO原理及其应用

1 FIFO原理 FIFO(First In First Out,即先入先出),是一种数据缓冲器。先被写入的数据会按顺序先被读出。FIFO可看做一个管道,有数据写入端口和 数据读取端口: 如图,数据写入端口从1~10依次写入数据,则数据读取端口也从1~10依次读取数据。输出端口每读出一位数据,FIFO中的后一位数据就向前移一位。如读取端口读出1、2、3后FIFO输出端口的第一位变为4。 1.1 FIFO的使用 写数据端口: w_clk : 写数据时钟信号 w_req : 写...

jac_chao的博客 2万+

SPI FIFO中断机制深度解析:从原理到实战,规避TX_UNDERFLOW与RX_OVERFLOW

在嵌入式系统与外设通信中,SPI(串行外设接口)协议因其简单高效而广泛应用。其核心原理是通过主从设备间的同步串行通信实现数据交换。为了提升CPU效率并优化数据传输,现代SPI控制器普遍引入了FIFO(先进先出)缓冲区机制。该机制的技术价值在于通过批量处理数据,显著减少中断频率,从而释放CPU资源以处理其他任务。然而,若管理不当,则可能引发数据丢失错误,典型表现为TX_UNDERFLOW(发送下溢)和RX_OVERFLOW(接收溢出)。这些错误事件在从设备模式下尤为关键,直接关系到通信的鲁棒性。应用场景涵盖各

weixin_31476015的博客 345

页面置换实验深度解析:从FIFO到LRU的缺页率博弈

在操作系统内存管理中,页面置换是处理物理内存不足的核心机制。当进程访问的页面不在内存且页框已满时,系统必须按某种策略选择淘汰页面,这一决策直接决定缺页率的高低。局部性原理是各类置换算法的理论基础:时间局部性认为最近访问的页面很可能再次被访问,空间局部性则体现了进程对连续地址的集中访问。基于这些原理,FIFO、LRU、OPT与Clock等经典算法以不同数据结构实现调度逻辑,在实现成本与命中效果间做出权衡。页面置换不仅广泛用于操作系统课程设计,也是面试中对内存调度理解的高频考点。掌握引用串生成、缺页率统计与算法

weixin_30846347的博客 304

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

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

weixin_30410999的博客 167

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6036

深入理解FIFO

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

anwu0979的博客 225

Qt Location实战:5分钟搞定地图插件切换与卫星图源加载(附完整代码)

本文是Qt Location开发系列教程的实战指南,详细讲解如何在Qt应用中快速实现地图插件(如Esri、OSM、MapboxGL)的动态切换与卫星图源的加载。通过清晰的代码示例,帮助开发者理解插件机制,解决常见配置问题,并在5分钟内构建出具备交互式地图切换功能的应用程序。

kafka6courier的博客 523

Xilinx的DDR4 IP

Xilinx的DDR4 IP

weixin_39896700的博客 4456

异步fifo_异步FIFO(一)

在进入主题前,先介绍两个概念,亚稳态和格雷码亚稳态的介绍:对于采样电路中,一个信号在过渡到另一个时钟域时,如果仅仅用一个触发器将其锁存,那么采样的结果将可能是亚稳态。因为触发器存在建立时间和保持时间(数字电路中0和1之间的相互转化不是理想的一瞬间),一旦违反这个建立时间和保持时间,那么触发器就可能会处于亚稳态,所谓的亚稳态就是既不是0也不是1的状态,那么因为亚稳态的原因很可能产生设计错误...

weixin_39973009的博客 684

不带DDR的ZYNQ使用OCM加载程序运行的方法

软件版本:Vivado Vitis2019.2 第一步: 在Vivado的ZYNQ Block Design时候不配置DDR 第二步: 在Vitis中: 1、 在Vitis中新建Platform,选择xsa文件: 2、 在xparameters.h中添加DDR的地址空间定义,如下: 3、 修改链接文件,修改每个段都到ram_0,因为ram_1空间全部给到应用程序 4、 修改fsbl工程的main.c,增加XPAR_PS7_DDR_0条件编译 5、 修改fsbl.h,重定义DDR_EN

hpf247的博客 5533

切面是异步还是同步操作‘_面试必杀技:异步FIFO(上) -- CDC的那些事(5)

这一篇老李终于要开始聊异步FIFO(Asynchronous FIFO)了。在知乎上曾经老李见过一个问题:硕士生找工作的时候把异步fifo写成一个项目经历,是不是显得很low啊?下面回答很有意思,老李发现那些回答很low的以在校学生和刚毕业的应届生居多,大家都觉得简历里面一定要写上什么无线接收机,USB控制器等等才显得高大上。而几个来自真正工业界大佬的回答反而不说low,比如下面的这个回答来自海思...

weixin_39550587的博客 523

YOLOv13涨点改进 | 全网独家创新、HyperACE改进、注意力改进篇 | CVPR 2025| 引入LRSA局部区域自注意力模块,能提升其在细节捕捉、小目标检测和长距离依赖建模方面的能力

本文提出将LRSA(局部区域自注意力)模块集成到YOLOv13中,通过局部特征交互增强细节捕捉能力、小物体检测精度和长距离依赖建模。LRSA模块采用重叠图像块处理策略,在保持计算效率的同时提升复杂背景下的检测性能。文章详细介绍了模块结构、原理优势,并提供了三种改进方案:1)在主干网络添加LRSA层;2)将关键模块替换为DSC3k2_LRSA;3)采用HyperACE_LRSA结构。配套提供了完整的PyTorch实现代码和YAML配置文件,展示了该模块如何通过局部注意力机制平衡检测精度与推理速度。

Ai缝合怪、助力小伙伴高效发论文 344

【YOLO26实战全攻略】09——YOLO26多目标跟踪实战宝典:从原理到智慧园区人流统计全流程

多目标跟踪(MOT)是视频分析的核心技术,解决了单帧检测无法关联目标身份的痛点。本文基于YOLO26轻量化检测模型与ByteTrack跟踪算法,从新手视角出发,系统讲解多目标跟踪的核心原理、环境搭建、实操步骤与工程落地。内容涵盖ByteTrack分层关联策略解析、YOLO26集成跟踪的一行代码实现、配置参数调优、区域计数、轨迹数据提取与热力图可视化,最终通过智慧园区人车流量统计虚拟案例,完整呈现从技术原理到实际应用的全流程。本文注重实用价值,所有代码可直接复现,参数配置附带场景化建议,帮助新手快速上手。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 354

瑞萨RA8D1 USBHS寄存器深度解析:从TESTMODE到FIFO与中断实战

在嵌入式系统开发中,USB接口作为高速、通用的通信标准,其底层硬件控制是确保稳定数据传输的关键。USB控制器通过寄存器直接管理物理层信号、数据缓冲与事件响应,理解其工作原理是进行性能优化和深度调试的基础。从技术价值看,直接操作寄存器能突破协议栈库的限制,实现对USB 2.0高速模块的精细控制,从而在信号完整性验证、高吞吐数据传输和实时事件处理等场景中发挥核心作用。本文聚焦瑞萨RA8D1微控制器的USBHS模块,深入解析TESTMODE、FIFO端口及中断控制等核心寄存器组,通过实际调试案例与驱动框架,详解如

478

标题:Stata17安装后遇到Java安装问题解决方法

设置JAVA_HOME环境变量:在Windows上,您需要设置JAVA_HOME环境变量以告诉Stata Java的安装路径。d. 输入变量名为JAVA_HOME,变量值为Java安装路径。注意:请确保您的Java版本与Stata兼容,并使用正确的Java安装路径。设置Stata的Java安装路径:现在,您需要告诉Stata Java的安装路径。如果您看到Java版本信息,则表示Java已成功安装。如果没有安装,请先下载并安装Java。确认Java已安装:首先,请确保您的计算机上已经正确安装了Java。

CyberSparkZ的博客 2867

深入理解FPGA跨时钟域:亚稳态、两级同步器与异步FIFO设计

在FPGA与数字系统设计中,跨时钟域(CDC)是可靠性问题的核心挑战之一。当信号跨越时钟域时,触发器可能因不满足建立/保持时间而进入亚稳态,导致不确定的输出和逻辑错乱。工程上,采用两级同步器可有效降低单比特电平信号的亚稳态发生概率,而多比特高速数据流则需要基于格雷码指针的异步FIFO来实现安全传输。从慢速控制信号的握手协议,到高速数据通路的DPRAM方案,不同的传输场景需要匹配不同的CDC策略。深入理解这些同步机制,不仅能预防偶发故障,更是构建稳定多时钟域系统的必备技能。

weixin_34160277的博客 310

Steam崩溃:ntdll.dll报错0xc0000374...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1156

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: C语言 共享库(动态库)制作
下一篇: USB 2.0高速和全速的区别
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值