FIFO

FIFO(first in first out),具备读写端口各一个,外部无需控制地址。

FIFO与普通RAM的区别在于FIFO外部忽略对读写地址的管理,而只需要关注空满状态。

异步FIFO设计框图

参数:时钟、数据位宽、深度、读写指针、空满判断、RAM空间大小

实质:控制信号+RAM

设计要点

  • 读、写时钟域的地址管理
  • 写地址到读时钟域的同步
  • 读地址到写时钟域的同步
  • 读时钟域的空和将空信号控制
  • 写时钟域的满和将满信号控制

判满判空

以深度为1024的FIFO为例,假设一直没有读操作,读指针停在地址0处。当写完1024个数据后,写指针又回到了地址0处,此时读写地址相等。而随写随读,读写地址也相等。所以无法通过读写地址进行判满判空。

因此可以对地址增加1个高bit,来指示是否发生了回卷。此时若读写地址相等,则为空。若最高bit不同,但其余位相同,那么则为满。

判满时,需要将读地址同步到写时钟域进行判断。判空时,需要将写地址同步到读时钟域进行判断。

为什么采用格雷码同步地址

因为FIFO的地址是逐1增加的,因此可以把逐1增加的地址编码为相邻数只有1位不同的格雷码。在实现跨时钟域信号采集时,如果数据每次只改变一位,那么就可以使用单比特跨时钟域处理方式直接采样。

二进制码和格雷码转换

B2G

二进制码右移一位,高位补0,与原二进制码按位相异或。

assign gray = (bin >> 1)^ bin

G2B

Gn = Bn;
Gi-1=Bi ^ Bi-1; ( i=1,2,n-1; )

assign bin[N-1] = gray[N-1] ;

generate
genvar  i;
    for(i=0;i<N-1;i=i+1) begin:b2g
        assign  binary[i]     =       grey[i]^binary[i+1];
    end
endgenerate

FIFIO深度

posted @   骑猪上树的少年  阅读(922)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
回到顶部
点击右上角即可分享
微信分享提示