0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

标签 > fifo

fifo

+关注 0人关注

First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。

文章: 243
视频: 82
浏览: 43069
帖子: 733

fifo简介

 在计算机中,先入先出队列是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令(指令就是计算机在响应用户操作的程序代码,对用户而言是透明的)。如图1所示,当CPU在某一时段来不及响应所有的指令时,指令就会被安排在FIFO队列中,比如0号指令先进入队列,接着是1号指令、2号指令……当CPU完成当前指令以后就会从队列中取出0号指令先行执行,此时1号指令就会接替0号指令的位置,同样,2号指令、3号指令……都会向前挪一个位置,这样解释大家清楚了吧?

fifo百科

  First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。

  FIFO简介

  在计算机中,先入先出队列是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令(指令就是计算机在响应用户操作的程序代码,对用户而言是透明的)。如图1所示,当CPU在某一时段来不及响应所有的指令时,指令就会被安排在FIFO队列中,比如0号指令先进入队列,接着是1号指令、2号指令……当CPU完成当前指令以后就会从队列中取出0号指令先行执行,此时1号指令就会接替0号指令的位置,同样,2号指令、3号指令……都会向前挪一个位置,这样解释大家清楚了吧?

  

  图1 先进先出队列FIFO是队列机制中最简单的,每个接口上都存在FIFO队列,表面上看FIFO队列并没有提供什么QoS(Quality of Service,服务质量)保证,甚至很多人认为FIFO严格意义上不算做一种队列技术,实则不然,FIFO是其它队列的基础,FIFO也会影响到衡量QoS的关键指标:报文的丢弃、延时、抖动。既然只有一个队列,自然不需要考虑如何对报文进行复杂的流量分类,也不用考虑下一个报文怎么拿、拿多少的问题,而且因为按顺序取报文,FIFO无需对报文重新排序。简化了这些实现其实也就提高了对报文时延的保证。FIFO关心的就是队列长度问题,队列长度会影响到时延、抖动、丢包率。因为队列长度是有限的,有可能被填满,这就涉及到该机制的丢弃原则。常见的一个丢弃原则叫做Tail Drop机制。简单地说就是该队列如果已经满了,那么后续进入的报文被丢弃,而没有什么机制来保证后续的报文可以挤掉已经在队列内的报文。在这种机制中,如果定义了较长的队列长度,那么队列不容易填满,被丢弃的报文也就少了,但是队列长度太长了会出现时延的问题,一般情况下时延的增加会导致抖动也增加。如果定义了较短的队列,时延的问题可以得到解决,但是发生Tail Drop的报文就变多了。

  FIFO队列原理简述

  FIFO队列不对报文进行分类,当报文进入接口的速度大于接口能发送的速度时,FIFO按报文到达接口的先后顺序让报文进入队列,同时,FIFO在队列的出口让报文按进队的顺序出队,先进的报文将先出队,后进的报文将后出队。FIFO队列具有处理简单,开销小的优点。但FIFO不区分报文类型,采用尽力而为的转发模式,使对时间敏感的实时应用(如VoIP)的延迟得不到保证,关键业务的带宽也不能得到保证。

  使用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的宽度:也就是英文资料里常看到的THE WIDTH,它指的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM32位等等,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工作的可靠。

查看详情

fifo知识

展开查看更多

fifo技术

fifo存储器芯片型号有哪些

fifo存储器芯片型号有哪些

本文主要介绍了fifo存储器芯片型号有哪些?FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作,它主要有几方面的功能:1)...

2018-04-08 标签:存储器fifo 2.4万 0

fifo算法原理及fifo置换算法

fifo算法原理及fifo置换算法

fifo先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。即先进先出队列。在超市购物之后会提着我们满满的购物车来...

2017-12-15 标签:cpufifo程序代码 2.1万 0

FIFO芯片和单片机实现的图像采集系统

FIFO芯片和单片机实现的图像采集系统

在单片机应用系统中,由于图像采集速度、程序存储器和数据存储器的寻址空间的限制,要完整存储30 fps、640480像素大小的一幅图像是相当困难的。本文运...

2012-05-10 标签:单片机FIFOFIFO芯片 2.1万 2

c语言实现fifo算法及代码

c语言实现fifo算法及代码

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运...

2017-12-15 标签:fifoc语言编程语言 1.7万 0

FPGA的FIFO实现过程

FIFO队列有两个位置指示指针。一个是写指针,指向队列的第一个存储单元。一个读指针,指向队列的最后一个存储单元。当有写命令的时候,数据写入写指针指向的存...

2018-06-29 标签:fpga仿真fifo 1.6万 0

【紫光同创国产FPGA教程】【第二十七章】千兆以太网视频传输实验

【紫光同创国产FPGA教程】【第二十七章】千兆以太网视频传输实验

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处( http://www. alinx.com ...

2021-04-12 标签:fpga以太网摄像头 1.3万 0

异步FIFO设计方案详解 异步FIFO设计的难点在哪里

异步FIFO设计方案详解 异步FIFO设计的难点在哪里

一般而言,处理跨时钟域的方法有这么几种(大家在网上也都能找到资料,这些资料大都来自几篇经典的论文,中文方面的资料大都是翻译过着理解这几篇论文而来):少量...

2018-09-10 标签:fifo数据通讯 1.2万 0

fifo存储器是什么_fifo存储器有什么特点

fifo存储器是什么_fifo存储器有什么特点

FIFO( First In First Out)简单说就是指先进先出。由于微电子技术的飞速发展,新一代FIFO芯片容量越来越大,体积越来越小,价格越来...

2017-12-06 标签:fifofifo存储器 1.0万 0

FIFO队列原理简述 拥塞避免原理

FIFO队列原理简述 拥塞避免原理

拥塞管理是指网络在发生拥塞时,如何进行管理和控制。FIFO队列不对报文进行分类,按报文到达接口的先后顺序让报文进入队列,采用尽力而为的转发模式,PQ队列...

2018-02-23 标签:fifo拥塞计算机数据通信 9448 0

MCU的10个常用基础知识详细资料介绍

1MCU有串口外设的话,在加上电平转换芯片,如MAX232、SP3485就是RS232和RS485接口了。

2018-10-03 标签:MCURS485FIFO 8626 0

查看更多>>

fifo资讯

超全面解析FIFO的原理及应用

First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。是一种...

2021-05-29 标签:单片机存储器数据传输 2.5万 0

MPU6050移植读取数据时出现FIFO溢出问题解析

MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间。为什么F...

2017-11-29 标签:陀螺仪fifompu6050 1.7万 0

FIFO具体有什么作用

FIFO具体有什么作用

First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。在计算...

2017-12-06 标签:fifoad数据采集 1.3万 0

FullCAN和BasicCAN是什么?有何区别

FullCAN和BasicCAN是什么?有何区别

诊断报文:一般选择配置成BASIC CAN类型(结合FIFO Buffer使用),因为诊断报文的请求/响应不能错序,需按照顺序处理,且数据不能覆盖;

2022-08-29 标签:CANRAMfifo 1.3万 0

FPGA编程时的一些实际问题阐述及解决方案详解

FPGA编程时的一些实际问题阐述及解决方案详解

问题: 随着NI的FPGA产品的广泛使用,很多同事和客户都碰到了一些FPGA编程时遇到的问题。由于FPGA不能实时调试,每次修改一点代码之后都要编译很长...

2017-11-18 标签:fpgafifo 1.1万 0

使用硬件FIFO来优化串口的数据收发

本文在探讨传统数据收发不足之后,介绍如何使用带FIFO的串口来减少接收中断次数,通过一种自定义通讯协议格式,给出帧打包方法;之后介绍一种特殊的串口数据发...

2017-11-15 标签:fifo串口 1.0万 0

异步FIFO的设计分析及详细代码

异步FIFO的设计分析及详细代码

本文首先对异步 FIFO 设计的重点难点进行分析,最后给出详细代码。 一、FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(...

2017-11-15 标签:fifo 8053 0

LabVIEW FPGA模块实现FIFO深度设定

LabVIEW FPGA模块实现FIFO深度设定

为了解决基于LabVIEWFPGA模块的DMAFIFO深度设定不当带来的数据不连续问题,结合LabVIEWFPGA的编程特点和DMA FIFO的工作原理...

2011-09-26 标签:FPGALabVIEWFIFO 6979 0

在FPGA设计中FIFO的使用技巧

FIFO是在FPGA设计中使用的非常频繁,也是影响FPGA设计代码稳定性以及效率等得关键因素。在数据连续读取时,为了能不间断的读出数据而又不导致FIFO...

2021-09-09 标签:fpgaXilinxfifo 6361 0

全面介绍ZYNQ-AXI互联IP

全面介绍ZYNQ-AXI互联IP

学习内容 近期设计需要用到AXI总线的IP,所以就对应常用的IP进行简要的说明,本文主要对AXI互联IP进行介绍。 基础架构IP 基础的IP是用于帮助组...

2021-05-11 标签:控制器数据IP 5719 0

查看更多>>

fifo数据手册

相关标签

相关话题

换一批
  • Protues
    Protues
    +关注
    Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
  • 静电防护
    静电防护
    +关注
    为防止静电积累所引起的人身电击、火灾和爆炸、电子器件失效和损坏,以及对生产的不良影响而采取的防范措施。其防范原则主要是抑制静电的产生,加速静电泄漏,进行静电中和等。
  • Altium Designer
    Altium Designer
    +关注
  • FPGA芯片
    FPGA芯片
    +关注
    FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
  • ArduBlock
    ArduBlock
    +关注
    ArduBlock软件是Arduino官方编程环境的第三方软件,目前必须依附于Arduino软件下运行,区别于Arduino文本式编程环境,ArduBlock是以图形化积木搭建的方式编程的,这样的方式会使编程的可视化和交互性加强,编程门槛降低,即使没有编程经验的人也可以尝试给Arduino控制器编写程序。
  • AD10
    AD10
    +关注
  • 识别
    识别
    +关注
  • FPGA开发板
    FPGA开发板
    +关注
    FPGA开发板在基于MCU、定制ASIC和体积庞大的电线束来实现引擎及控制电子的系统方案已发展至接近其技术和应用极限,汽车工业正面临新的设计挑战。过去汽车电子产品的开发周期是漫长的,而许多汽车制造商现正致力于在更短的时间内,装备消费者所需的新一代汽车。
  • PCB封装
    PCB封装
    +关注
    pcb封装就是把 实际的电子元器件,芯片等的各种参数(比如元器件的大小,长宽,直插,贴片,焊盘的大小,管脚的长宽,管脚的间距等)用图形方式表现出来,以便可以在画pcb图时进行调用。
  • QUARTUS II
    QUARTUS II
    +关注
    Quartus II 是Altera公司推出的综合性CPLD/FPGA开发软件,软件支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
  • PCB封装库
    PCB封装库
    +关注
  • 语音交互
    语音交互
    +关注
  • AD09
    AD09
    +关注
  • PDN
    PDN
    +关注
  • QuickPcb
    QuickPcb
    +关注
  • Artix-7
    Artix-7
    +关注
      Artix-7 系列:相对于 Spartan-6 系列而言,Artix-7 系列功耗降低了一半, 成本降低了 35%,采用小型化封装、统一的 Virtex 系列架构,能满足低成本大批量市场的性能要求,这也正是此前 ASSP、ASIC 和低成本 FPGA 所针对的市场领域。
  • VHDL代码
    VHDL代码
    +关注
  • Protel 99 se
    Protel 99 se
    +关注
  • powerlink
    powerlink
    +关注
  • candence
    candence
    +关注
  • 面包板
    面包板
    +关注
    面包板是由于板子上有很多小插孔,专为电子电路的无焊接实验设计制造的。由于各种电子元器件可根据需要随意插入或拔出,免去了焊接,节省了电路的组装时间,而且元件可以重复使用,所以非常适合电子电路的组装、调试和训练。
  • 特性阻抗
    特性阻抗
    +关注
    特性阻抗又称特征阻抗,它不是直流电阻,属于长线传输中的概念。特性阻抗是射频传输线影响无线电波电压、电流的幅值和相位变化的固有特性,等于各处的电压与电流的比值,用V/I表示。在射频电路中,电阻、电容、电感都会阻碍交变电流的流动,合称阻抗。电阻是吸收电磁能量的,理想电容和电感不消耗电磁能量。
  • AXI
    AXI
    +关注
    AXI是一种总线协议,该协议是ARM公司提出的AMBA3.0协议中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持Outstanding传输访问和乱序访问,并更加容易进行时序收敛。AXI是AMBA中一个新的高性能协议。
  • FPGA教程
    FPGA教程
    +关注
  • 驱动电流
    驱动电流
    +关注
  • Kintex-7
    Kintex-7
    +关注
      Kintex-7系列:Kintex-7 系列是一种新型 FPGA,能以不到 Virtex-6 系列一半的价格实现与其相当性能,性价比提高了一倍,功耗降低了一半。
  • 时钟源
    时钟源
    +关注
    时钟源用来为环形脉冲发生器提供频率稳定且电平匹配的方波时钟脉冲信号。它通常由石英 晶体振荡器和与非门组成的正反馈振荡电路组成,其输出送至环形脉冲发生器。
  • 红外触摸屏
    红外触摸屏
    +关注
  • Protel DXP
    Protel DXP
    +关注
  • AD采样
    AD采样
    +关注
      AD转换采样频率指完成一次从模拟转换到数字的AD转换所需时间的倒数,模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号;而AD分辨率指数字量变化一个最小量时模拟信号的变化量。

关注此标签的用户(3人)

一只想飞的猪 W1Z1 小可_0ec

编辑推荐厂商产品技术软件/工具OS/语言教程专题