异步FIFO的RTL代码主要包含6个module:
(1)fifo_top.v、(2)fifo_mem.v、(3)sync_w2r.v、
(4)sync_r2w.v、(5)wptr_full.v、(6)rptr_empty.v
(1)fifo_top.v:顶层模块,主要例化其余各个功能模块
其中端口名:input:wclk(写时钟),wrst_n(写复位、低有效),winc(写使能、高有效),wdata(写数据),rclk(读时钟),rrst_n(读复位),rinc(读使能)
output:rdata(即wdata经过异步FIFO从rdata端口输出),wfull(写满拉高)、rempty(读空拉高)
(2)fifo_mem.v:memory存储实体
可以通过例化一个双端口的RAM实现fifo的存储功能 vendor_raw mem
也可以通过数组的方式实现:reg [7:0] mem [7:0] ------>深度为8的存储体
(3)sync_w2r.v:写时钟域的写指针同步到读时钟域
该模块功能是实现写时钟域(wclk)的写指针(写到哪儿了?)的同步,其中采用2级寄存器的同步将写指针同步到读时钟域(rclk),从而与当下读指针的地址进行对比,去判断是否读空。
(4)sync_r2w.v:读时钟域的读指针同步到写时钟域
该模块功能是实现读时钟域(rclk)的读指针(读到哪儿了?)的同步,其中采用2级寄存器的同步将读指针同步到写时钟域(rclk),从而与当下写指针的地址进行对比,去判断是否写满。
(5)wptr_full.v:写满状态位的得出
用格雷码来判断空满状态位时,还要考虑次高位。
当最高位和次高位相同,其余位相同认为是读空。
当最高位和次高位不同,其余位相同认为是写满。
(6)rptr_empty.v:读空状态位的得出
当最高位和次高位相同,其余位相同认为是读空。