异步FIFO的verilog实现

在写异步FIFO之前先搞明白一个问题,就是二进制转格雷码,很简单,

比如: 二进制数10110,要求它对应的格雷码,先将10110>>1 , 得到 01011,然后(10110)^(01011)就得到其对应的格雷码。

查阅了很多博主关于异步fifo的verilog实现代码,最被大家采纳接受的就是下面要说的这种,自己学习注释,记录下来加深自己的理解也为网友学习开辟道路。

1,异步FIFO,深度8,输入输出宽度为4bit

2,采用格雷码进行空满条件判断(格雷码判空:直接判断读写地址是否相同即可)

                                                 (格雷码判满:需要满足最高位不同,次高位也不同,其余位必须相同,所以需要将                                                信号高两位反转,其余不变)

异步FIFO最核心的部分就是精确产生空满标志位,这直接关系到设计的成败。本文采用比较读写指针来判断FIFO的空满,如果FIFO的深度是n-1位线所能访问到的地址空间,那么此设计所要用的指针位宽就比实际多出一位,也就是n位,比如FIFO的深度为8,我们需要用宽度为4的指针。这样做有助于判断FIFO是空还是满。

怎么判断FIFO的空/满?为了保证数据正确的写入或者读出,而不发生溢出或者读空的状态出现,必须保证FIFO在满的状态下,不能进行写操作,在空的状态下不能进行读操作,因此怎样判断FIFO的空/满就成了FIFO设计的核心思想。由于设计的FIFO为异步FIFO,读写时钟相互独立,当二进制读地址从0111向1000变化时,地址所有位都要变化,如果写时钟恰好在读地址的变化时刻采样,写所得到的读地址值有可能是从0000到1111中的任何一个(即亚稳态的发生),可以采用gray码形式。由于格雷码每次只变化一位,采用格雷码可以降低亚稳态的发生概率

   

先看二进制码,N=4时,0-16的二进制码如图左数据,除了最高位,余下的3位,其实是0-8地址的循环。(这就是为什么N+1的原因),因为:假设开始写入和读出地址均为0000,此时FIFO写入8个数据,写地址变为1000(gray:1100),读地址为0000(gray:0000),这就是满的条件,假设又执行了8次的读操作,使得读地址为1000(gray:1100),这就是空条件,另外的8次写操作使得写地址等于0000(gray:0000),但读地址仍然为1000(gray:1100),因此FIFO为满条件,(除了最高位,地址始终以3位在循环变化)。

由于设计的FIFO为异步FIFO,读写时钟相互独立,当二进制读地址从0111向1000变化时,地址所有位都要变化,如果写时钟恰好在读地址的变化时刻采样,写所得到的读地址值有可能是从0000到1111中的任何一个(即亚稳态的发生),采用gray码的形式对地址进行判空/满操作。如上面分析所示(Gray码的最高位和次高位为空满标志位,满:读写地址的最高位和次高位相反,空:读写地址的最高位和次高位相同)

话不多说直接上代码:

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值