Verilog实现FIFO专题5-异步FIFO设计(异步FIFO工作方式、异步FIFO介绍、异步FIFO介绍)

本文详细分析了异步FIFO与同步FIFO的区别,重点探讨了异步FIFO的空满检测方法,包括计数检测、指针比较、扩展指针比较和格雷码指针比较。此外,还介绍了异步FIFO的同步处理和设计实现,包括端口设计、功能描述、代码实现和仿真验证,以确保在不同时钟域下工作的正确性。
摘要由CSDN通过智能技术生成

FIFO根据输入输出时钟是否一致,分为同步FIFO与异步FIFO。同步FIFO中,读写控制信号以及数据均处于同一时钟域,满足STA分析时一般不会出现亚稳态等不稳定情形;而对于异步FIFO,读写相关信号处于不同时钟域,信号的不同步可能会导致亚稳态,导致FIFO工作异常,设计较为复杂;在之前的记录中,我们对同步FIFO的设计进行了分析:

Verilog实现FIFO专题(3-同步FIFO设计)

此处我们不再对同步FIFO进行介绍而直接以异步FIFO与同步FIFO的异同为线索,逐步对异步FIFO进行分析,介绍异步FIFO相比于同步FIFO的额外处理,并进一步实现异步FIFO。

目录

一、异步FIFO与同步FIFO工作流程比较

1、同步FIFO

2、异步FIFO

二、异步FIFO的空满检测

1、同步FIFO的空满检测

2、异步FIFO的空满检测

计数检测空满:

指针比较检测空满:

扩展指针比较检测空满:

格雷码指针比较检测空满:

三、异步FIFO的同步处理

1、同步方式

2、延迟对FIFO设计的影响

结论:

FIFO满检测:

FIFO空检测:

四、异步FIFO设计

1、端口设计

外部端口

内部信号

2、功能描述

3、实现代码

4、仿真验证

五、参考文献


一、异步FIFO与同步FIFO工作流程比较

1、同步FIFO

同步FIFO的读写控制信号以及数据均处于同一时钟域,即:FIFO在同一时钟驱动下进行读写操作,读控制信号有效且FIFO不为空时,输出读指针对应地址的数据,随后读指针加1;写控制信号有效且FIFO不为满时,将输入数据存储到写指针对应地址处,随后写指针加1;

2、异步FIFO

异步FIFO的工作内容与同步FIFO类似:FIFO在时钟驱动下进行读写操作,读控制信号有效且FIFO不为空时,输出读指针对应地址的数据,随后读指针加1;写控制信号有效且FIFO不为满时,将输入数据存储到写指针对应地址处,随后写指针加1;

但是异步FIFO的控制并不像同步FIFO那么简单,因为异步FIFO工作在不同的时钟域,这就带来了一些问题:

(1)如何进行空满检测?还能像同步FIFO中通过计数值来判断吗?

(2)需要同步电路

二、异步FIFO的空满检测

1、同步FIFO的空满检测

同步FIFO的空满检测可以通过计数很简单的实现:

读写逻辑是同一个时钟,因此可以在每次时钟来临时进行判断,如果不执行读写操作/同时读写,则计数值不变;只执行读操作,计数值减1;只执行写操作,计数值加1;

如果计数值为0,则说明FIFO空,只能写不能读(直到写入一次数据,计数值加1,FIFO不再为空才能执行读操作);

如果计数值为FIFO深度,则说明FIFO满,只能读不能写(直到读出一次数据,计数值减1,FIFO不再为满才能执行写操作);

2、异步FIFO的空满检测

计数检测空满:

异步FIFO不能采用同步FIFO这种计数方式来实现空满检测,因为用两个时钟去控制同一个计数器的加剪很明显是不可取的。

如果不明白为什么不能用两个时钟控制同一个计数器,可以查阅:Verilog中always@()语句双边沿触发(语法与综合的差异)

指针比较检测空满:

读写指针指向读写操作面向的FIFO地址空间,因此空满检测的另一个思路是比较读写指针。每次写操作执行,写指针加1;而每次读操作执行,读指针加1,因此:

FIFO空发生在:读指针追上写指针时;

FIFO满发生在:写指针追上读指针时;

但是这种处理仍存在一个问题,就是读写指针相等时,难以区分FIFO是空还是满。

扩展指针比较检测空满:

如上分析,直接比较读写指针时存在一个特例:读写指针相等时,难以区分FIFO是空还是满。

因此,有人提出,将指针进行高位扩展。即指针加宽一位,当写指针超出FIFO深度时,这额外的一位就会改变。FIFO的深度决定了指针扩展前(即除了最高位的其余位)的宽度,而这扩展的一位与FIFO深度无关,是为了标志指针多转了一圈,因此:

当读写指针完全相同时,FIFO空;

当读写指针高位不同,其余位完全相同时,FIFO满;

经过指针扩展,可以明确的进行空满检测。但是这种处理仍然不够,因为异步FIFO读写时钟相互独立,分属不同时钟域,相邻二进制地址位变化时,不止一个地址位都要变化,这样指针在进行同步过程中很容易出错,比如写指针在从0111到1000跳变时4位同时改变,这样读时钟在进行写指针同步后得到的写指针可能是0000-1111的某个值,一共有2^4个可能的情况,而这些都是不可控制的,你并不能确定会出现哪个值,那出错的概率非常大。

格雷码指针比较检测空满:

如上分析,直接比较扩展读写指针时可能因多位改变导致错误。因此,进一步采用gray码形式的指针,利用格雷码每次只变化一位的特性,降低同步发生时错误的概率。如图,为一个深度为8FIFO的格雷码指针(绿色框中):

0-7为真实的FIFO地址,而8-15是指针多转一圈以后的地址(8-0,9-1...)。应

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值