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

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

3天内不再提示

标签 > fifo

fifo

+关注 0人关注

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

文章: 242
视频: 82
浏览: 43003
帖子: 730

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空满信号的产生位置

格雷码的事聊完了,后面顺理成章的就是读写通路模块的设计。不过在读写控制通路之前还要明确下另一个问题,就是空满信号的产生位置的事情。

2024-03-19 标签:fifo格雷码时钟域 137 0

为什么格雷码可以辅助解决多bit跨时钟域的问题​?求解

为什么格雷码可以辅助解决多bit跨时钟域的问题​?求解

单bit通过两级同步打拍可以有效的解决亚稳态问题。

2024-03-08 标签:二进制fifoRTL 492 0

如何从SD卡读取音频文件并将其输出到扬声器上?

如何从SD卡读取音频文件并将其输出到扬声器上?

在上一篇教程中,创建了一个 I2S 发送器用来发送来从FPGA内部 ROM 的音频数据。下一步,我们向该 I2S 发送器添加 AXI-Stream 接口...

2024-01-22 标签:音频扬声器SD卡 1135 0

跨时钟域的解决方案

跨时钟域的解决方案

在很久之前便陆续谈过亚稳态,FIFO,复位的设计。本次亦安做一个简单的总结,从宏观上给大家展示跨时钟域的解决方案。

2024-01-08 标签:FPGA设计fifoCDC 334 0

谈一谈FIFO的深度

谈一谈FIFO的深度

最近加的群里面有些萌新在进行讨论**FIFO的深度**的时候,觉得 **FIFO的深度计算比较难以理解** 。所

2023-11-28 标签:IC设计fifo时钟源 360 0

如果IP已经采用OOC综合那么是否可以将其修改为Global综合方式?

如果IP已经采用OOC综合那么是否可以将其修改为Global综合方式?

相比于Project模式,Vivado Non-Project模式可以提供用户更多的控制权,进而用户可以自主管理整个编译流程

2023-11-16 标签:fifoCLKVivado 361 0

基于STM32F407的FreeRTOS学习笔记(5)

基于STM32F407的FreeRTOS学习笔记(5)

在数据结构中有一种很重要的数据结构叫做队列,其特点是数据先进先出。在FreeRTOS中也有一类队列,我们利用这类队列在FreeRTOS中实现任务与任务间...

2023-11-07 标签:fifoFreeRTOS数据结构 346 0

如何使用硬件FIFO来减少接收中断次数

如何使用硬件FIFO来减少接收中断次数

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

2023-11-06 标签:单片机fifo定时器 238 0

FIFO为什么不能正常工作?

FIFO为什么不能正常工作?

FIFO为什么不能正常工作?复位信号有效长度不够,接口时序不匹配,可看下面这篇文章。 本文将介绍: 非DFX工程如何确保异步FIFO自带的set_max...

2023-11-02 标签:fpgaFPGA设计fifo 495 0

异步FIFO设计之格雷码

异步FIFO设计之格雷码

相邻的格雷码只有1bit的差异,因此格雷码常常用于异步fifo设计中,保证afifo的读地址(或写地址)被写时钟(或读时钟)采样时最多只有1bit发生跳变。

2023-11-01 标签:fifo格雷码异步FIFO 801 0

查看更多>>

fifo资讯

请问异步FIFO的溢出操作时怎么样判断的?

请问异步FIFO的溢出操作时怎么样判断的? 异步FIFO是数据传输的一种常用方式,在一些储存器和计算机系统中,常常会用到异步FIFO。作为一种FIFO,...

2023-10-18 标签:fifo计数器 309 0

同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO各在什么情况下应用

同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO各在什么情况下应用? 1. 同步FIFO和异步FIFO的区别 同步FIFO和异步FIFO在处...

2023-10-18 标签:fifo 830 0

为什么异步fifo中读地址同步在写时钟域时序分析不通过?

为什么异步fifo中读地址同步在写时钟域时序分析不通过? 异步FIFO中读地址同步在写时钟域时序分析不通过的原因可能有以下几个方面: 1. 读地址同步在...

2023-10-18 标签:时钟缓冲器fifo 320 0

fpga跨时钟域通信时,慢时钟如何读取快时钟发送过来的数据?

fpga跨时钟域通信时,慢时钟如何读取快时钟发送过来的数据? 在FPGA设计中,通常需要跨时钟域进行数据通信。跨时钟域通信就是在不同的时钟域之间传输数据...

2023-10-18 标签:FPGA设计fifo缓存器 601 0

芯教程|平头哥助力昊芯HX2000系列芯片专题SCI串口通讯奇偶校验(二)SCI增强FIFO

芯教程|平头哥助力昊芯HX2000系列芯片专题SCI串口通讯奇偶校验(二)SCI增强FIFO

自昊芯推出专题讲解SCI串口通讯奇偶校验,分为两期讲解,上期主要讲解标准SCI模式下的奇偶校验,本期主要讲解增强FIFO模式下的奇偶校验。HX2000系...

2022-11-08 标签:芯片fifo 387 0

异步fifo详解

异步fifo详解 一. 什么是异步FIFO FIFO即First in First out的英文简称,是一种先进先出的数据缓存器,与普通存储器的区别在于...

2022-12-12 标签:fifo 2842 0

如何设计异步时钟之间的接口电路

  一、FIFO简介   FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读...

2022-11-15 标签:芯片存储器fifo 510 0

同步FIFO之Verilog实现

FIFO的分类根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生...

2022-11-01 标签:fifoVerilog缓存器 1320 0

为什么异步FIFO中需要用到格雷码

Push信息产生的连续写指针wpt, 通过同步后,在rclk域与rpt进行比较,以产生rclk域的Empty信号。

2022-09-02 标签:数据传输fifo编码 2507 0

FullCAN和BasicCAN是什么?有何区别

FullCAN和BasicCAN是什么?有何区别

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

2022-08-29 标签:CANRAMfifo 1.2万 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/语言教程专题