首页 > 编程知识 正文

sdram和异步fifo,xilinx异步fifo的复位

时间:2023-05-05 09:30:25 阅读:63772 作者:3151

原文地址: https://www.toutiao.com/a 632924560438450690 /

这篇文章已被EETOP论坛帖子编辑修改

作者: ThinkSpark

原文://BBS.eetop.cn/thread-308169-1-1.html

一.概述

在大型ASIC和FPGA设计中,多时钟系统往往是不可避免的,会出现不同的时钟域数据传输问题。 一种优选的解决方案是使用异步FIFO作为不同时钟域数据传输的缓冲区,以减少不同时钟域数据传输的时序要求,提高传输效率。 本文介绍了异步FIFO的设计。

二、设计原理

2.1结构框图

Fig. 2.1.1

上图所示的同步模块synchronize to write clk在写入时钟wr_clk区域收集读取时钟区域的读取指针rd_ptr,与写入指针wr_ptr进行比较,将全标志位wr_full 同样,同步模块synchronize to read clk的作用是在读取时钟域收集写入时钟域的写入指针wr_ptr,并将其与读取指针rd_ptr进行比较以生成读取空标志位rd_empty

另外,还有写入指针wr_ptr和写入标志位wr_full生成模块、读取指针rd_ptr和读取空标志位rd_empty生成模块以及双端口存储RAM模块

2.2二进制计数器问题

异步FIFO读/写指针需要与数学操作进行比较以生成准确的空闲标志位,但由于读/写指针属于不同时钟域与读/写时钟的相位关系的不确定性,当同步模块收集另一时钟域的指针时,该指针如Fig.2.2.1所示,收集到的值很可能是不希望的值,当然也会产生不希望的错误结果。

Fig. 2.2.1

在上图中,rd_ptr2sync 3和4以及4和5之间的中间状态是由于到每个寄存器的时钟rd_clk有偏差而发生的。 二进制增量操作在大多数情况下,2位以上的位在同一增量操作内变化,但由于实际电路中存在与时钟偏差不同的路径延迟,所以二进制计数器在自增量时无法避免错误的中间结果。 例如,像Fig.2.2.2那样。

Fig.2.2.2

上图为Fig.2.2.1的电路原型及局部波形的放大。 由于rd_clk的上升沿到达第三寄存器的时间各不相同,因此在rd_ptr2sync的值从3’b011跳至3’b100的过程中经过3’b111和3’b101, 虽然在最后时钟(rd_clk0)沿到来之后rd_ptr2sync所经历的中间结果的持续时间相对较短,但是这些不准确的中间结果可能被收集到其他时钟域中的同步模块中,从而引起错误的操作。 请参考上图。

因此,为了避免中间结果的发生,在递归地变更同步模块收集到的数据时,一次只能变更1位。 格雷码计数器是个不错的选择。

2.3格雷码计数器的实现

2.3.1格雷码的表现形式

格雷码的最大特点之一是在增加或减少的过程中,每次只变化一位。 这是最大的优点。 同时,也有自己的局限性,循环计数的深度必须为2的n次幂。 否则,就会失去每次只变化一位的特性。 深度为16的二进制和格雷码的推移表如下。

二进制灰色

0 0000 0000

1 0001 0001

2 0010 0011

3 0011 0010

4 0100 0110

5 0101 0111

6 0110 0101

7 0111 0100

8 1000 1100

9 1001 1101

10 1010 1111

11 1011 1110

12 1100 1010

13 1101 1011

14 1110 1001

15 1111 1000

0 0000 0000

2.3.2二进制与格雷码的相互转换

1、格雷码二进制:

yle="">2.3.3格雷码计数器的实现

如下图fig.2.3.1所示,指向存储器的地址指针由二进制计数器产生,而用于跨时钟域传播的格雷码指针是对二进制指针的实时转换并用寄存器采集获得的。这里要注意的是,计数器的位宽比实际所需的位宽要多出一位,这样做的目的是方便判断FIFO的空或满,这一点下文中将会介绍。

Fig.2.3.1格雷码计数器结构图

2.4空满标志位的产生

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

2.4.1读空标志位的产生

当读地址rd_ptr赶上写地址wr_ptr,也就是rd_ptr完全等于wr_ptr时,可以断定,FIFO里的数据已被读空,而且只有在两种情况下,FIFO才会为空:第一种是系统复位,读写指针全部清零;另一种情况是在FIFO不为空时,数据读出的速率快于数据写入的速率,读地址赶上写地址时FIFO为空。空标志位的产生需要在读时钟域里完成,这样不至于发生FIFO已经为空了而空标志位还没有产生的情况,但是可能会发生FIFO里已经有数据了而空标志位还没有撤消的情况,不过就算是在最坏情况下,空标志位撤消的滞后也只有三个时钟周期,这个问题不会引起传输错误;还有一种情况就是空标志比较逻辑检测到读地址和写地址相同后紧接着系统产生了写操作,写地址增加,FIFO内有了新数据,由于同步模块的滞后性,用于比较的写地址不能及时更新,这样,一个本不应该有的空标志信号就产生了,不过这种情况也不会导致错误的发生,像这种FIFO非空而产生空标志信号的情况称为“虚空”。

Fig. 2.4.1.1空标志产生逻辑

如图Fig. 2.4.1.1空标志产生逻辑,写时钟域的写指针通过两级寄存被同步到读时钟域之后与读指针进行比较,如果完全相等,则会产生空标志信号;同步模块用两级寄存器来实现是为了消除可能的亚稳态,正如前面所述,因为wr_ptr_gray是用格雷码实现的,即使同步模块是在wr_ptr_gray跳变的时刻进行采集,其采集到的所有可能值也只有两个,一个是跳变之前的值,一个是跳变之后的值,它们只相差1,最坏情况也只是产生了“虚空”信号,而这不会引起错误传输。

Fig. 2.4.1.2空标志产生时序

2.4.2写满标志位的产生

和读空标志位产生机制一样,写满标志位也是通过比较读写地址产生的。读写指针的关系就好比A,B两个田径运动员在一环形跑道上赛跑一样,当B运动员领先A并整整超前一圈时,A,B两人的地点相同,此种情况对应于读写指针指向了同一地址,但写指针超前整整一圈,FIFO被写满。和读空标志产生一样,写满标志也是读写指针相同时产生。但是如果地址的宽度和FIFO实际深度所需的宽度相等,某一时刻读写地址相同了,那FIFO是空还是满就难以判断了。所以读写指针需要增加一位来标记写地址是否超前读地址(在系统正确工作的前提下,读地址不可能超前于写地址),比如FIFO的深度为8,我们需要用宽度为4的指针。

Fig. 2.4.2.1格雷码指针和存储空间的映射关系

如果读指针的最高位为0,而写指针的最高位为1,说明写指针超前于读指针,这时如果读写指针指向同一存储空间,参照Fig. 2.4.2.1 , 则可判断为FIFO被写满。写满标志位产生逻辑只需关心格雷码指针最高位不同(写超前于读)且它们指向同一存储空间的情况,那么怎么通过比较两格雷码指针来判断这种情况的发生呢?首先,最高位相异(因为读指针不可能超前于写指针,所以只可能是写指针超前于读指针);其次,如果把最高位为1的所有格雷码指针的次高位均取反后,除去最高位不看,则指向同一存储空间的两指针相同,从而得出第二个条件是:次高也相异。

Fig. 2.4.2.2写满标志位产生逻辑

三、总结

前文讲述了异步FIFO的应用需要、实现原理,并重点阐述了空满标志信号的产生方法以及可能会发生的“虚空”和“虚满”现象。理解了这些关键信号的产生原理,设计一个异步FIFO也就不难了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。