FPGA Asynchronous FIFO设计思路(2)编码
首先讨论格雷码的编码方式:spa
先看4bit的格雷码,当MSB为0时,正向计数,当MSB为1时,即指针已经走过一遍了,最高位翻转,此时的格雷码是反向计数,这其中整套数据以最大值(深度)为对称中心,每个数均符合格雷码的要求,即下一个状态比上一个状态只有1bit的变化。设计
3bit的格雷码,在最高位反向后,即指针达到了FIFO最后一个地址,低位开始从新计数,此时存在一个问题是,在最高位跳转的地方,有两bite的数据发生变化,违背了格雷码的规律。3d
以上为一种利用格雷码来产生数据指针的模型,使用格雷码来传递FIFO指针数据,那么FIFO的深度必定是pow2,以上模型中,指针ptr先经过gray to binary comb logic 模块,将格雷码转化成二进制数据,而后进行加一操做,获得bnext,而后经过binary to gray comb logic 将bnext转化为gnext, 而后gnext经过寄存器输出获得新的数据指针ptr.再经过gnext的最高位和次高位,计算出addrmsb.指针
以上是第二种数据指针生成模型,首先是,数据地址即指针去掉最高位后,参与加一运算,获得新的数据地址,采用二进制的形式。blog
而后加一获得的新数据地址进行格雷码转换,获得gnext的值,而后经过寄存器输出,即此模型同时输出数据指针(采用的格雷码)和数据地址值(采用二进制)。it
以上为FIFO的一种总体设计模型。二进制
实际操做中,空满标志位信号生成的问题im
具体逻辑不用多说d3
关于空信号的生成,最高位,以及数据地址彻底相等,便可以判断为空。
关于满信号的生成即复杂一些:
若是采用之前的判断依据,指针的最高位不一样,剩下的数据地址彻底相同,若是采用的是格雷码编码方式,就会出现问题。
满信号的判断依据中指出读指针和写指针的最高两位同时不一样,剩下的相同,便可以判断FIFO满。