异步FIFO的实现(从verilog代码到波形)上

本文介绍了异步FIFO的基本概念,强调了在处理器和外设速度差异下使用异步FIFO的重要性。重点讨论了跨时钟域处理的挑战,如亚稳态问题,并提出使用同步器和格雷码解决该问题。此外,还详细阐述了如何通过同步指针来生成空满信号。
摘要由CSDN通过智能技术生成

一、 异步fifo的简单介绍

我们知道,fifo最简易的结构可以由一个DPRRAM实现,只不过fifo不需要地址,每个数据的存取位置都是顺序变化的(遵守先进先出的原则),这一点是与正常的存储器不同的地方。

在设计之前,首先需要明白以下这些问题:

1.何为同步和异步?

首先要理清我们所说的“同步”与“异步”的关系。上一篇文章也有提到,“同步”是指时序逻辑的信号变化是基于同一个时钟。若信号是基于不同的时钟变化,比如clk1和clk2(这两个时钟没有确定的相位关系)称为异步。所以,这里所说的异步fifo则是读时钟和写时钟为异步的fifo。对于异步fifo,其中有一个很重要的点在于“跨时钟域处理”。

在处理器和外设之间,一般处理器的数据吞吐率很高,使用异步fifo就能避免这种速度差异造成的数据丢失问题

2.为什么要跨时钟域处理呢?

因为在同步fifo中,我们知道,产生空满信号时根据fifo_cnt计数产生。但是在异步fifo中,读指针在读时钟域,写指针在写时钟域,所以不能单独使用一个计数器去产生空满信号了。因此,我们需要将写指针同步到读时钟域去产生空信号,将读指针同步到写时钟域去产生满信号。

跨时钟域处理会面临什么问题呢?——建立时间和保持时间的违背,从而产生亚稳态。在两个时钟域的情况下,很容易出现一个时钟域的输出在另外一个时钟域中的时钟上升沿到来时发生改变的现象,从而产生亚稳态。

3.如何进行跨时钟域处理?

上小节提到同步,这里首先介绍“同步器”,对于单bit信号:从慢时钟到快时钟,我们可以通过同步器进行打拍的方式进行同步。如果同步器的第一级触发器产生亚稳态输出,这个亚稳态将在第二级触发器取样前稳定,如图1和图2所示。增加更多级触发器,可以进一步降低亚稳态出现的可能性(但会带来的问题是增加了整体电路的时延)。从快时钟到慢时钟,可能会存在数据丢失的情况,必须将源数据进行展宽,以保证在两个连续变化的源数据之间至少有一个目标时钟到达。

图1

图2

但是对于多bit信号,不能直接通过同步器去实现同步,可能导致错误采样。比如FFF到000转换时,每一位数据都在变化,由于每个bit的延时不同,最后可能采到的数据是001、010、100等。 因此,需要避免使用二进制计数器实现指针。

考虑到格雷码具有一定的特殊性:每次当从一个值变化到另外一个值时,有且只有一位发生变化。因此可以使用格雷码去取代二进制计数器,并且用打拍的方式去同步(只有深度为2的n次方才能用格雷码的方式去同步,这样才能保证最大值和最小值只有一位的变化)。我们可以将指针转为格雷码同步到另一个时钟域再进行比较。如果同步时钟在计数值转换期间到来,这种编码能够消除绝大部分的错误。

4.在进行同步之后,如何产生空满信号呢?

空信号:读指针等于写指针(复位时,或者读指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值