FIFO工作原理

根据FIFO工作的时钟域分为同步/异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟在时钟沿来临时同时发生读写。异步FIFO读写时钟不一致,读写相互独立。

1.读写指针的工作原理

读指针:总是指向下一个将要读取的单元,复位时指向第一个单元(编号为0);

写指针:总是指向当前要被读出的数据,复位时,指向第一个单元(编号为0);

2. FIFO的“空/满”检测

  FIFO设计的关键:产生可靠的FIFO读写指针和生成FIFO“空/满”状态标识。

很明显,当FIFO写满时,就不能再写新数据了,否则就导致数据的溢出;而在空状态即之前写入的数据已经读完,就不能再读取了,否则读出的数据就是无效数据。

2.1读空信号(rd_empty)

一般情况当读写指针相等时,表明FIFO为空,这种情况发生在 复位操作时 或者当读指针读出FIFO中最后一个字后,追赶上写指针时,此时读空信号有效。

发生如下图所示:

2.2写满信号(wr_full)

当读写指针再次相等时,表明FIFO为满,这种情况发生在,当写指针转了一圈折回来(wrapped around)又追上了读指针,如下图:

以上FIFO的读写状态是基于读写指针的比较,而问题是两者的判断条件都是读写指针相等,区别在于写满状态是在写指针写满一圈后重新追上读指针,这该如何取表示呢???

如何区分到底是满状态还是空状态呢??

2.3 FIFO读写状态的判断方法

可以采用以下两种方法:

1extra bit

一般情况下深度为N=2^n的FIFO其地址的位宽为n,其读写地址的位宽也为n。共有N个存储单元,若数据位宽为W则该FIFO的容量即为N*W bit。

现在在指针中添加额外的位(extra bit,即地址的MSB)变为n+1bit,该extra bit用于指示写指针是否递增并越过最后一个FIFO地址,若越过则将该MSB加1,其它位清零。对读指针也进行同样的操作。如对于深度为8的FIFO,需要采用3+1bit是计数器:0000-1000、1001-1111,MSB作为折回标志,而低3位作为地址指针。

那么判断机制为:

*如果两个指针的MSB不同,就说明写指针比读指针多折回一次:如r_addr=0000,且w_addr=1000,为满;

*如果两个指针的MSB相同,就说明两个指针折回次数相等。再者其余位相等(则说明FIFO为空。

2)设置数据计数器

设置一个data_counter, 当写使能有效时每写入一个data计数器同时加1;读操作时,每读出一个data时该计数器减1。如此,当data_counter为0时FIFO空,当data_counter计数至FIFO深度deep时,表示FIFO写满。

由于计数器会占用额外的资源,当FIFO较大时,可能会降低FIFO的读写速度。

3 读写指针的表示

读写指针的编码有多种,上述提到的指针采用二进制码形式表示。

3.1二进制FIFO指针

将一个二进制的计数值从一个时钟域同步到另一个时钟域的时候很容易出现问题,因为采用二进制计数器时所有位都可能同时变化,在同一个时钟沿同步多个信号的变化会产生亚稳态问题。而使用格雷码只有一位变化,因此在两个时钟域间同步多个位不会产生问题。所以需要一个 二进制到gray码的转换电路  ,将地址值转换为相应的gray码,然后将该gray码同步到另一个时钟域进行对比,作为空满状态的检测。

3.2 gray码表示指针

使用gray码解决了一个问题,同时也带来另一个问题,即格雷码如何判断空与满?

空的判断

依然依据二者完全相等(包括MSB);

满的判断

如下图,由于gray码除了MSB外具有镜像对称的特点,当读指针指向7,写指针指向8时,除了MSB其余位都相同,不能说它为满。因此不能单纯地检测最高位了,在gray码上判断为满必须同时满足以下3条:

wptr 和同步过来的rptr的MSB不相等,因为wptr必须比rptr多折回一次;

wptr与rptr的次高位不相等;如上图位置7和和位置15,转化为2进制:0111和1111. 。MSB不同说明多折回一次,111相同代表同一个位置。

FIFO(二):FIFO工作原理_风中少年的博客-CSDN博客_fifoFIFO工作原理 根据FIFO工作的时钟域分为同步/异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟在时钟沿来临时同时发生读写。异步FIFO读写时钟不一致,读写相互独立。1.读写指针的工作原理读指针:总是指向下一个将要读取的单元,复位时指向第一个单元(编号为0);写指针:总...https://blog.csdn.net/qq_26652069/article/details/90765269 异步FIFO设计(非常详细,图文并茂,值得一看!)

本文由EETOP论坛帖子编辑修改而来

作者:ThinkSpark

原文://bbs.eetop.cn/thread-308169-1-1.html

一、概述

在大规模ASIC或FPGA设计中,多时钟系统往往是不可避免的,这样就产生了不同时钟域数据传输的问题,其中一个比较好的解决方案就是使用异步FIFO来作不同时钟域数据传输的缓冲区,这样既可以使相异时钟域数据传输的时序要求变得宽松,也提高了它们之间的传输效率。此文内容就是阐述异步FIFO的设计。

二、设计原理

2.1结构框图

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

Fig. 2.2.1

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

Fig.2.2.2

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

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

2.3格雷码计数器的实现

2.3.1格雷码的表现形式

格雷码一个最大的特点就是在递增或递减的过程中,每次只变化一位,这是它最大的优点。同时它也有自己的局限性,那就是循环计数深度必须是2的n次幂,否则就失去了每次只变化一位的特性。深度为16的二进制及格雷码递变表如下:

Binary Gray

0 0000 0000

1 0001 0001

2 0010 0011

3 0011 0010

4 0100 0110

5 0101 0111

6 0110 0101

7 0111 0100

8 1000 1100

9 1001 1101

10 1010 1111

11 1011 1110

12 1100 1010

13 1101 1011

14 1110 1001

15 1111 1000

0 0000 0000

2.3.2二进制和格雷码的相互转换

1、二进制到格雷码:

2.3.3格雷码计数器的实现

如下图fig.2.3.1所示,指向存储器的地址指针由二进制计数器产生,而用于跨时钟域传播的格雷码指针是对二进制指针的实时转换并用寄存器采集获得的。这里要注意的是,计数器的位宽比实际所需的位宽要多出一位,这样做的目的是方便判断FIFO的空或满,这一点下文中将会介绍。

Fig.2.3.1格雷码计数器结构图

2.4空满标志位的产生

异步FIFO最核心的部分就是精确产生空满标志位,这直接关系到设计的成败。本文采用比较读写指针来判断FIFO的空满,如果FIFO的深度是n-1位线所能访问到的地址空间,那么此设计所要用的指针位宽就比实际多出一位,也就是n位,这样做有助于判断FIFO是空还是满。

2.4.1读空标志位的产生

当读地址rd_ptr赶上写地址wr_ptr,也就是rd_ptr完全等于wr_ptr时,可以断定,FIFO里的数据已被读空,而且只有在两种情况下,FIFO才会为空:第一种是系统复位,读写指针全部清零;另一种情况是在FIFO不为空时,数据读出的速率快于数据写入的速率,读地址赶上写地址时FIFO为空。空标志位的产生需要在读时钟域里完成,这样不至于发生FIFO已经为空了而空标志位还没有产生的情况,但是可能会发生FIFO里已经有数据了而空标志位还没有撤消的情况,不过就算是在最坏情况下,空标志位撤消的滞后也只有三个时钟周期,这个问题不会引起传输错误;还有一种情况就是空标志比较逻辑检测到读地址和写地址相同后紧接着系统产生了写操作,写地址增加,FIFO内有了新数据,由于同步模块的滞后性,用于比较的写地址不能及时更新,这样,一个本不应该有的空标志信号就产生了,不过这种情况也不会导致错误的发生,像这种FIFO非空而产生空标志信号的情况称为“虚空”。

Fig. 2.4.1.1空标志产生逻辑

如图Fig. 2.4.1.1空标志产生逻辑,写时钟域的写指针通过两级寄存被同步到读时钟域之后与读指针进行比较,如果完全相等,则会产生空标志信号;同步模块用两级寄存器来实现是为了消除可能的亚稳态,正如前面所述,因为wr_ptr_gray是用格雷码实现的,即使同步模块是在wr_ptr_gray跳变的时刻进行采集,其采集到的所有可能值也只有两个,一个是跳变之前的值,一个是跳变之后的值,它们只相差1,最坏情况也只是产生了“虚空”信号,而这不会引起错误传输。

Fig. 2.4.1.2空标志产生时序

2.4.2写满标志位的产生

和读空标志位产生机制一样,写满标志位也是通过比较读写地址产生的。读写指针的关系就好比A,B两个田径运动员在一环形跑道上赛跑一样,当B运动员领先A并整整超前一圈时,A,B两人的地点相同,此种情况对应于读写指针指向了同一地址,但写指针超前整整一圈,FIFO被写满。和读空标志产生一样,写满标志也是读写指针相同时产生。但是如果地址的宽度和FIFO实际深度所需的宽度相等,某一时刻读写地址相同了,那FIFO是空还是满就难以判断了。所以读写指针需要增加一位来标记写地址是否超前读地址(在系统正确工作的前提下,读地址不可能超前于写地址),比如FIFO的深度为8,我们需要用宽度为4的指针。

Fig. 2.4.2.1格雷码指针和存储空间的映射关系

如果读指针的最高位为0,而写指针的最高位为1,说明写指针超前于读指针,这时如果读写指针指向同一存储空间,参照Fig. 2.4.2.1 , 则可判断为FIFO被写满。写满标志位产生逻辑只需关心格雷码指针最高位不同(写超前于读)且它们指向同一存储空间的情况,那么怎么通过比较两格雷码指针来判断这种情况的发生呢?首先,最高位相异(因为读指针不可能超前于写指针,所以只可能是写指针超前于读指针);其次,如果把最高位为1的所有格雷码指针的次高位均取反后,除去最高位不看,则指向同一存储空间的两指针相同,从而得出第二个条件是:次高也相异。

Fig. 2.4.2.2写满标志位产生逻辑

三、总结

前文讲述了异步FIFO的应用需要、实现原理,并重点阐述了空满标志信号的产生方法以及可能会发生的“虚空”和“虚满”现象。理解了这些关键信号的产生原理,设计一个异步FIFO也就不难了。

异步FIFO设计(非常详细,图文并茂,值得一看!)_wyj_2016的博客-CSDN博客_异步fifo

FIFO工作原理以及读写完成标识和判断方法相关推荐

  1. FIFO(二):FIFO工作原理

    FIFO工作原理 根据FIFO工作的时钟域分为同步/异步FIFO.同步FIFO是指读时钟和写时钟为同一个时钟在时钟沿来临时同时发生读写.异步FIFO读写时钟不一致,读写相互独立. 1.读写指针的工作原 ...

  2. 74HC595工作原理及FPGA实现数码管驱动方法

    74HC595,移位寄存器,串行输入,8位并行输出,一般用于数码管电路以减少使用的IO口数量. 管脚介绍: Q0~Q7 :八位并行输出位 Q7'       :  级联位,若输入位数大于8位,先进入的 ...

  3. 步进电机工作原理与编程

    步进电机工作原理与编程 本章将介绍在嵌入式平台UP-NETARM2410-S中步进电机的实现.步进电机在各个领域诸如机器人.智能控制.工业控制等方面都有着广泛的应用空间,本章着重介绍步进电机的工作原理 ...

  4. Cache组成及工作原理

        很多程序员认为Cache是透明的,处理器可以很聪明地安排他们书写的程序.他们非常幸运,可以安逸着忽略Cache,也安逸着被Cache忽略,日复一日,年复一年,机械地生产着各类代码.All of ...

  5. ntnub原理怎么看_电锤只转不冲击怎么回事?看懂了工作原理,你也可以动手解决...

    电锤是我们在装修中常用到的电动工具,主要用来在混凝土.楼板.砖墙和石材上钻孔,下面我们来看看电锤的工作原理和常见的故障以及修理方法. 电锤内部结构动图 电锤工作原理动图 电锤工作时电机一方面通过齿轮减 ...

  6. Android中AMS工作原理,Android AMS启动详解

    启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...

  7. 【转】视频分割器的工作原理及异常解决

    在有多个视频源组成的视频系统中,通常采用视频切换器使多路图像在一台显示设备上轮流显示.但有时为了让监控人员能同时看到所有监控点的情况,往往采用多视频分割器使得多路图像同时显示在一台显示设备上.当采用几 ...

  8. 朗强:HDMI视频画面分割器基本工作原理和性能

    在有多个摄像机组成的电视监控系统中,通常采用视频切换器使多路图像在一台监视器上轮流显示.但有时为了让监控人员能同时看到所有监控点的情况,往往采用多画面分割器使得多路图像同时显示在一台监视器上.当采用几 ...

  9. TYPE-C接口的工作原理图文详解

    TYPE-C接口的工作原理图文详解 发表于 2018-01-29 09:53:53 电子常识 +关注 2016年,有一个名词在手机上非常火,几乎所有的旗舰手机都会提到这个名词,说到这,大家应该都够猜到 ...

最新文章

  1. 语法分析生成器 - LEX
  2. flex vue 垂直居中居上_移动开发-flex 布局
  3. CF-1207 G.Indie Album(Trie上跑AC自动机)
  4. 线程入门-使用Thread类
  5. pytorch | Softmax->Log->NLLLoss->CrossEntropyLoss
  6. 前端学习(3000):vue+element今日头条管理--封装请求模块
  7. java循环队列_Java版-数据结构-队列(循环队列)
  8. 开放集合目标检测任务 Open-set Detection
  9. 【不读唐诗,不足以知盛世】盛唐诗坛的璀璨明星们
  10. 使用软件测试路由器性能报告,路由器软件测试报告.doc
  11. 竞品分析 | 不背单词、百词斩
  12. 未转变者服务器组队教程,未转变者怎么创建联机服务器及创建方法介绍
  13. 东方财富 自动止损程序
  14. Redis客户端Lettuce深度分析介绍
  15. Windows Server 2012 和 System Center 2012 SP1,Virtual Machine Manager 中启用的软件定义的网络
  16. STM32F4时钟系统
  17. MX_Player_Pro_专业精简版AC3/DTS/EAC3 By.SOLDIER-就要应用网91apps.cn
  18. Angular导出功能(excel导出功能、文件数据流导出功能、图片的下载导出功能)
  19. 基于C++的视频点播系统
  20. B端与C端产品有何不同?

热门文章

  1. 生信小白学习日记Day3——NGS基础 NGS分析注解(质量分析软件)
  2. 649. Dota2 参议院
  3. 一对一视频直播源码实现网络中一对一视频聊天
  4. 作为测试负责人接手一个新业务,怎么干?
  5. 耗纸古文风之五--伊人恋
  6. 欲跳槽先了解大佬们需要什么人 ---2014 IOS招聘
  7. 单文本分析--词频统计
  8. 如何判断一个数是不是素数?
  9. 自定义室内地图以及路径规划
  10. 1030 : 判断直角三角形(C语言判断是否为直角三角形 )