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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律