异步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工具和培训视频,学习交流群,欢迎关注。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值