异步FIFO
1、一个模块(module)里面最好存在一个clk;因此在fifo_mem模块内只使用w_clk时钟,不使用r_clk时钟。
2、为判断FIFO的空(empty)、满(full)状态,需将写操作指针(w_ptr)、读操作指针(r_ptr)进行比较,因此需要将w_ptr同步到r_ptr时钟域,以及将r_ptr同步到w_ptr时钟域;使用常用的两级寄存器进行寄存。
3、读写地址(w_addr、r_addr)使用二进制,读写指针(w_ptr、r_ptr)因为需要同步到异步时钟域上,因此使用格雷码。
4、由二进制转换为格雷码的逻辑:gray_code = (bin_code << 1) ^ bin_code。
5、空(empty)、满(full)状态的判断都是同步比较w_ptr与r_ptr是否相同;为了确定是empty还是full,w_ptr、r_ptr需要比w_addr、r_addr多一位;当w_ptr与r_ptr所有位都相同时,则表明FIFO为empty,当w_ptr与r_ptr最高位(MSB)和次高位(2'MSB)不同,其余位都相同时,则表明FIFO为full。
6、异步FIFO的原理框图如下: