异步FIFO的设计原理如图:
其中主要的难点在于空满标志的产生,这里采用方法(1),其中地址宽度较FIFO深度所需地址宽度宽1位:
空标志产生:将写地址waddr--> 转换为格雷码waddr_gray-->两级同步至读时钟rclk waddr_gray_rclk -->将同步之后的写格雷码转换为二进制waddr_bin_rclk
比较waddr_bin_rclk与读时钟rclk下的读地址raddr,两者完全相等,则空标志有效。
满标志产生:将读地址raddr--> 转换为格雷码raddr_gray--> 两级同步至写时钟wclk raddr_gray_wclk -->将同步之后的写格雷码转换为二进制raddr_bin_wclk
比较raddr_bin_wclk与写时钟wclk下的写指针waddr,MSB位相反,其它位都相等,则满标志有效。
格雷码 --> 二进制码
bin(n-1) = gray(n-1)
bin(i) = gray(i) 异或 bin(i+1) 其中 i < n-1
二进制 --> 格雷码
gray(n-1) = bin(n-1)
gray(i) = bin(i) 异或 bin(i+1) 其中 i < n-1
代码如下:
FIFO模型采用寄存器数组实现
module FIFO_MEM #(parameter DATASIZE = 32,parameter ADDRSIZE = 4)
(
//INPUTS
WCLK,
RCLK,
RSTn,
WEN,
WADDR,
WDATA,