FIFO经常用在跨时钟域处理多位位宽数据,实际使用中,我们一般是直接例化FIFO的IP核,通过调用IP核来实现FIFO的控制,很少有亲自下手写FIFO的。不过掌握如何自己写FIFO更能加深自己对FIFO的工作原理的理解。
一、FIFO的设计
FIFO包括同步FIFO和异步FIFO,对于FIFO的设计最大的难点在于如何准确的产生空满信号,使其空而不读,满而不写。
对于同步FIFO来说,由于读写时钟相同,空满信号的产生就比较简单。通过判断er_en和rd_en来控制ptr的增减,当ptr=0,表示FIFO空;当ptr=FIFO的最大指针,表示FIFO满。
但是,对于异步FIFO,空满信号的判断就没有这么简单,由于异步FIFO读时钟rclk和写时钟wclk不同,因此就不能通过直接比较读指针和写指针来产生空满信号。这是因为,空信号是在读时钟域产生的,由于读写时钟不同,若要将写指针与读指针在读时钟域进行比较,需要将写指针同步到读时钟域,由于多位信号不能通过两级触发器直接同步,否则可能会产生亚稳态或中间结果。
二、异步FIFO空满信号判断
空信号的产生:当读指针追上写指针时,此时FIFO为空;
满信号的产生:当写地址追上读地址时,此时FIFO为满。
有一个问题:如何判断是写指针追上读指针还是读指针追上写指针呢?
为进行区分,在设计中,我们通过增加一位指针,来进行空满信号的判断。如对于深度为8的FIFO,我们将读写指针的位宽设置成4位,当读指针追赶上写指针时,最高位为0,当写指针追赶上读指针时,