热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

异步FIFO(一)

​一、FIFO简单讲解FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,可分为同步FIFO和异步FIFO,

​一、FIFO简单讲解

FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,可分为同步FIFO和异步FIFO,同步FIFO是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作,常常用于交互数据缓冲。异步FIFO是指读写时钟不一致,读写时钟是互相独立的,异步FIFO常用于跨时钟域交互

重要参数

  • FIFO的深度:通俗地说,就是异步FIFO可以存多少个数据的意思!

  • FIFO的宽度:上面说FIFO的深度是表示能存放多少数据的概念,那宽度便是每个数据有多少位,也就是我们通常所说的数据有多宽!

  • FIFO空:表示FIFO里面数据被读完了;

  • FIFO满:表示FIFO里面填满了数据;

  • FIFO写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0);

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

  • FIFO读时钟:表示读取数据使用的时钟,一般设计时钟的上升沿为有效沿,有效沿读取数据;

  • FIFO写时钟:表示写入数据时使用的时钟,一般上升沿为有效沿,当然也可以设计下降沿为有效沿。

    (同步FIFO的读写时钟一致)

先从简单的同步FIFO讲起,以和异步FIFO的设计做比较。

同步FIFO的设计根据空满信号判断的方式主要分为两种:

一:利用计数器来判断空满。

二:将FIFO的地址位拓展一位,用最高位来判断空满

一:利用计数器来判断空满

空满检测逻辑:

为产生FIFO空满标志,引入FIFO Counter计数器,FIFO Counter寄数器用于指示FIFO内部存储数据个数;

  1)当只有写操作时,FIFO Counter加1;只有读操作时,FIFO Counter减1;其他情况下,FIFO Counter不变;

  2)当FIFO Counter=0时,说明FIFO为空,fifo_empty置位;

  3)当FIFO Counter=FIFO_DEPTH时,说明FIFO已满,fifo_full置位;

读写控制逻辑

 在clk上升沿时,读使能且FIFO非空(empty=0)时,进行一次读操作,rp加1(即顺序读出),将读指针rp对应地址处的数据读出至dout;

 在clk上升沿时,写使能且FIFO不满(full=0)时,进行一次写操作,wp加1(即顺序存储);将din写入写指针wp对应地址处;

设计代码如下:

二:将FIFO的地址位拓展一位,用最高位来判断空满。

空满检测逻辑:

空:扩展位相同,有效地址位也相同。

满:扩展位不同,有效地址为不同。

如何理解?

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

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

需要注意的是:在系统正确工作的前提下,读地址不可能超前于写地址。

为了区分到底是满状态还是空状态,需要:在地址指针中添加一个额外的位。

--如果两个指针的MSB不同,说明写指针比读指针多折回了一次;如r_addr=000,而w_addr = 100,FIFO为满

--如果两个指针的MSB相同,则说明两个指针折回的次数相等。其余位相等,说明FIFO为空;

给出图以供理解:假设FIFO深度为4,有效地址为2位。

设计代码如下:

文章同步发布在微信公众号:IC码农。分享日常所学和基础知识,分享历年大厂笔试题,EDA工具和培训视频,学习交流群,欢迎关注。




推荐阅读
author-avatar
一个不需要幸福的男人丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有