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