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

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

3天内不再提示

异步fifo详解

h1654155355.6033 来源:未知 作者:朱常 2022-12-12 14:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

异步fifo详解

一. 什么是异步FIFO

FIFO即First in First out的英文简称,是一种先进先出的数据缓存器,与普通存储器的区别在于没有外部读写的地址线,缺点是只能顺序的读取和写入数据(对于大型数据存储,在性能上必然缓慢),其数据地址是由内部读写指针自动加一完成的,不能像普通的存储器一样,由地址线决定读取或者写入某个特定地址的数据,按读写是否为相同时钟域分为同步和异步FIFO,这里主要介绍异步FIFO,主要用于跨时钟域传输数据。

FIFO是一种数据缓冲器,用来实现数据先入先出的读/写方式。FIFO有一个写端口和一个读端口,外部无需使用者控制地址,使用方便。FIFO与普通的Block RAM有一个很明显的区别就是使用Block RAM来做数据缓存处理,使用者必须自己控制读和写地址的管理,必须保证写的数据不把Block RAM中未被读出的内容覆盖掉从而造成数据错误,同时保证读的时候要读出未被写入的地址。而采用FIFO时,只需要关注FIFO控制器给出的空满状态信号即可知道当前有没有错误的操作了FIFO,使FIFO的数据写溢出或读空。

异步FIFO读写分别采用相互异步的不同时钟,使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据

FIFO的常见参数

FIFO的宽度:即FIFO一次读写操作的数据位;

FIFO的深度:指的是FIFO可以存储多少个N位的数据(如果宽度为N)。

满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。

空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。

读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。

写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。

二、设计原理

2.1结构框图

如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的读指针rd_ptr采集到写时钟(wr_clk)域,然后和写指针wr_ptr进行比较从而产生或撤消写满标志位wr_full;类似地,同步模块synchronize to read clk的作用是把写时钟域的写指针wr_ptr采集到读时钟域,然后和读指针rd_ptr进行比较从而产生或撤消读空标志位rd_empty。

另外还有写指针wr_ptr和写满标志位wr_full产生模块,读指针rd_ptr和读空标志位rd_empty产生模块,以及双端口存储RAM模块。

2.2 二进制计数器存在的问题

异步FIFO读写指针需要在数学上的操作和比较才能产生准确的空满标志位,但由于读写指针属于不同的时钟域及读写时钟相位关系的不确定性,同步模块采集另一时钟域的指针时,此指针有可能正处在跳变的过程中,如下图所示,那么采集到的值很有可能是不期望的值,当然,不期望的错误结果也会随之发生。

上图中,rd_ptr2sync 3和4以及4和5之间的中间态是由于到各寄存器的时钟rd_clk存在偏差而引起的。二进制的递增操作,在大多数情况下都会有两位或者两以上的bit位在同一个递增操作内发生变化,但由于实际电路中会存在时钟偏差和不同的路径延时,二进制计数器在自增时会不可避免地产生错误的中间结果,如下图。

由于rd_clk上升沿到达三寄存器的时间各不相同,这就导致了rd_ptr2sync的值从3’b011跳变3’b100的过程中经历了3’b111和3’b101,直到最后一个时钟(rd_clk0)沿的到来后rd_ptr2sync才跳变到正确结果3’b100。中间结果的持续的时间虽然相对短暂,但是这些不正确的中间结果完全有可能被其它时钟域的同步模块采集到而产生错误的动作,见上图。

由此可见,要避免中间结果的产生,其中一个可行的方案就是使被同步模块采集的数据递变时,每次只有一个bit位发生改变格雷码计数器就是一个不错的选择。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • fifo
    +关注

    关注

    3

    文章

    406

    浏览量

    45480
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    从底层解读labview的TDMS高级异步写入的工作原理

    在 LabVIEW 的 TDMS 高级异步写入中,“异步写入”指的是 写入操作的调用方式 ,而不是指允许多个线程同时直接操作同一个文件的物理内容。 理解这个概念需要区分几个层面: 异步调用 vs.
    发表于 08-14 17:05

    cy7c68013a slave fifo写数据出现异常的原因?怎么解决?

    Hi all, 我使用68013A和MCU采用Slave Fifo 异步方式进行通讯,EP2为AUTOOUT,EP6为AUTOIN,16位。现在有一个奇怪的现象出现,当通过mcu发送0x00 00
    发表于 06-04 08:22

    cy7c68013a异步slave fifo模式,外部mcu无法读写fifo怎么解决?

    cy7c68013a 异步slave fifo 模式,外部mcu无法读写fifo 上位机发送bulk数据,flag标志是对的,SLCS也拉低了,是设置的低有效, 检测到了flag不为空的标志后
    发表于 06-03 10:49

    MAX3107SPI/I²C UART,具有128字FIFO技术手册

    MAX3107是一款高级通用异步收发器(UART),接收、发送通道具有128字长的先入/先出(FIFO)数据缓冲器,可通过I²C或高速SPI™接口控制。2倍速和4倍速模式支持最高24Mbps的数据
    的头像 发表于 05-22 11:24 777次阅读
    MAX3107SPI/I²C UART,具有128字<b class='flag-5'>FIFO</b>技术手册

    MAX14830四通道串行UART,具有128字FIFO技术手册

    MAX14830是一款先进的四通道通用异步收发器(UART),每路UART带有128字先入/先出(FIFO)接收和发送缓存器,以及高速串行外设接口(SPI™)或I²C控制器接口。PLL和分数波特率发生器为波特率编程和参考时钟选择提供了极大灵活性。
    的头像 发表于 05-22 10:14 796次阅读
    MAX14830四通道串行UART,具有128字<b class='flag-5'>FIFO</b>技术手册

    MAX3108 SPI/I²C UART,具有128字FIFO,WLP封装技术手册

    MAX3108为小尺寸通用异步收发器(UART),每路接收和发送FIFO具有128个字,通过串行I²C或SPI控制器接口控制。自动休眠和关断模式有助于降低待机功耗。500µA (最大)低电源电流
    的头像 发表于 05-22 10:00 657次阅读
    MAX3108 SPI/I²C UART,具有128字<b class='flag-5'>FIFO</b>,WLP封装技术手册

    MAX3109双通道串行UART,带有128字FIFO技术手册

    MAX3109先进的双通道通用异步收发器(UART)具有128字收发先进/先出(FIFO)堆栈和高速SPI™或I²C控制器接口。2倍速和4倍速模式允许工作在最高24Mbps数据速率。锁相环(PLL)和分数波特率发生器允许灵活设置波特率、选择参考时钟。
    的头像 发表于 05-22 09:26 590次阅读
    MAX3109双通道串行UART,带有128字<b class='flag-5'>FIFO</b>技术手册

    智多晶FIFO_Generator IP介绍

    FIFO_Generator是智多晶设计的一款通用型FIFO IP。当前发布的FIFO_Generator IP是2.0版本,相比之前的1.1版本主要新增了非等比输入输出数据位宽支持和异步
    的头像 发表于 04-25 17:24 1457次阅读
    智多晶<b class='flag-5'>FIFO</b>_Generator IP介绍

    基于FPGA的FIFO实现

    FIFO(First in First out)为先进先出队列,具有存储功能,可用于不同时钟域间传输数据以及不同的数据宽度进行数据匹配。如其名称,数据传输为单向,从一侧进入,再从另一侧出来,出来的顺序和进入的顺序相同。
    的头像 发表于 04-09 09:55 1166次阅读
    基于FPGA的<b class='flag-5'>FIFO</b>实现

    AXI接口FIFO简介

    AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式:AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的应用外,AXI FIFO
    的头像 发表于 03-17 10:31 1769次阅读
    AXI接口<b class='flag-5'>FIFO</b>简介

    解锁TSMaster fifo函数:报文读取的高效方法

    前言:TSMaster目前有两种读取报文的模式:回调函数模式和fifo模式。fifo函数是TSMaster近期新增的函数,本文将重点介绍fifo模块。关于回调函数的使用方法可以参考帮助模块的《快速
    的头像 发表于 03-14 20:04 928次阅读
    解锁TSMaster <b class='flag-5'>fifo</b>函数:报文读取的高效方法

    SDRAM控制器的设计——Sdram_Control.v代码解析(异步FIFO读写模块、读写SDRAM过程)

    前言 SDRAM控制器里面包含5个主要的模块,分别是PLL模块,异步FIFO 写模块,异步FIFO读模块,SDRAM接口控制模块,SDRAM指令执行模块。 其中
    的头像 发表于 03-04 10:49 2173次阅读
    SDRAM控制器的设计——Sdram_Control.v代码解析(<b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>读写模块、读写SDRAM过程)

    使用SCL编写FIFO功能块

    一、 导读    前几天一位搞电气的朋友问S7-1200中如何做个先入先出的功能,说原来用S7-200SMART的时候有填表指令和FIFO指令可以实现该功能,现在S7-1200中找了一圈都没有
    的头像 发表于 02-09 10:27 1138次阅读
    使用SCL编写<b class='flag-5'>FIFO</b>功能块

    FIFO IP核的使用教程

    在数字设计中,利用FIFO进行数据处理是非常普遍的应用,例如,实现时钟域交叉、低延时存储器缓存、总线位宽调整等。下图给出了FIFO生成器支持的一种可能配置。
    的头像 发表于 01-03 09:36 4012次阅读
    <b class='flag-5'>FIFO</b> IP核的使用教程

    DAC3482内部的FIFO作用是什么?

    我现在正在使用DAC3482芯片,想请教一下其内部的FIFO作用是什么? FIFO读写指针分别由DATACLK和DACCLK(或其分频)来驱动,用于“缓冲”的作用,我有两种理解: 1.只能缓冲读写
    发表于 12-23 07:06