1.读写指针的概念
读指针:总是指向下一个将要被写入的单元,复位时指向第一个单元。
写指针:总是指向当前要被读出的数据,复位时指向第一个单元。
也就是说,复位时读写指针都指向第一个单元。向FIFO写入1个数据,写指针加1;从FIFO读出1个数据,读指针加1。FIFO设计的关键是如何产生可靠的读写指针和满空信号。
2.FIFO满空标志的产生
FIFO什么时候为空呢?假设从第一个单元写入数据,那么写指针从地址0→1,读指针不变,此时FIFO中有1个数据。接着把这个数据读出来,读指针从0→1,此时写指针为1,读指针也为1,FIFO中没有数据了,因此FIFO为空。从上面分析可以发现,判断FIFO为空很简单,只要读写指针相等就是空。但是假设一开始就复位,读写指针都在0地址,然后一直向FIFO中写入数据,当写满FIFO的时候,写指针刚好转了一圈回到了0地址,此时读写指针也相等,但是这时候FIFO却是满的。因此得到下面的判空和判满条件。
判空:读指针追上写指针的时候,两者相等,为空。(www.xing528.com)
判满:写指针追上读指针的时候,两者相等,为满。
3.如何判断读写指针空与满
通过将表示读写指针的数据位宽上再加1位来区分是满还是空。比如FIFO的深度为8,那么需要3位二进制数来表示地址,则需要在最高之前再加1位,变成4位。一开始读写都是0000,FIFO为空。当写指针增加并越过最后一个存储单元的时候,就将这个最高位取反,变成1000,这时是写地址追上了读地址,FIFO为满。同理,当读地址越过最后一个存储单元的时候把读地址的最高位也取反,可以看到当最高位相同并且剩下的位也相同的时候,FIFO为空。
4.异步时钟域下如何判断空与满
上面已经解释了如何判断FIFO的满空,即根据地址是否相等的方法。但是在上述问题中,读写时钟需要保持同步。才能判断。如果是在不同的时钟域下,显然需要将读写指针进行同步化才可以进行判断。具体就是在判断空的时候,需要将写地址同步到读时钟域下进行判断。同理,在判断满的时候需要将读时钟域下的读指针同步到写时钟域进行判断。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。