打印

异步FIFO那点事

[复制链接]
楼主: GoldSunMonkey
手机看帖
扫描二维码
随时随地手机跟帖
21
GoldSunMonkey|  楼主 | 2011-10-18 18:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
3.3 实现
我们知道在FIFO中要用到格雷码计数器。而不是用由格雷码换算的二进制码计数器(它不能实现每个计数器换后只有1位发生变化),
必须使用真正的格雷码计数器。如果想实现格雷码计数,你会发现它并不像看起来那么容易。当然,你可以创建一个定制的机构来完成
这项工作,但还是让我来提供一个更为普遍的解决问题的方法。大家知道格雷码于二进制码之间能够相互转换用到一个简单的公式:
二进制码转格雷码
gn=bn
Gi=bi○+bi+1 i≠n ∀
格雷码转二进制码
bn=gn
bi=gi○+bi+1 ∀ i≠n

使用特权

评论回复
22
GoldSunMonkey|  楼主 | 2011-10-18 18:48 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-10-18 18:50 编辑

在上面的公式中,下标表示n+1位二进制码或格雷码的位数。
我们还知道计数器不过是一个触发器组和一个累加器而已,我们可以按照下面的方法来做——将格雷码码元转换为二进制码元,然后加1,
再它转换回格雷码并存储。这是解决产生n-bit格雷码算法棘手问题一个普遍的方法。由它生成的计数器如图3所示。

当用综合工具优化时,相信综合工具能够为格雷码计数器提供一个相当快速的电路。当然,如果希望拥有一个深度为32字节的FIFO时,
可在格雷码编码的状态机中手工编写计数器代码。
最终的FIFO设计如图4所示。这次我不再提供代码,因为我相信无论用VHDL或Verilog HDL编写,那都是一件非常容易的事。

使用特权

评论回复
23
GoldSunMonkey|  楼主 | 2011-10-18 18:51 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-10-18 18:52 编辑

3管理FIFO
不面对几个参量——时钟频率不能大于存储器所需频率,必须满足亚稳态时间关系tclk=20tcq+tsetup。当然,在公式中20这个因数完全凭借经验,
倘若已经完成系统MTBF的计算,也可以选择其它值。另外,还应考虑格雷码计数器能够运行多快,因为上述公式要求受制于XOR(异或)门的速度。
由于本文没有做任何设想(除了同步,而这并非真正意义上的设想),时间不会引起很多同样的问题。

使用特权

评论回复
24
GoldSunMonkey|  楼主 | 2011-10-18 18:51 | 只看该作者
在这要认识到发生同步错误,整个FIFO将无法工作(2bit错误就将意味着在DPRAM中一个完全不同的地址,因为地址也用格雷码表示)——
也就是FIFO即可以吃入数据也可以吐出数据。所以,我无法列出更多的要点,而这些要点都基于用户设计中MTBF值,要做好你所能承担的最坏的打算。

使用特权

评论回复
25
GoldSunMonkey|  楼主 | 2011-10-18 18:52 | 只看该作者
在本系列**的第一部分我们了解了FIFO的一般结构,并分析了单时钟
FIFO的一个特例[1]。第二部分描述了双时钟设计的一种可能的结构。在第三部
分我们将探究一种具有新颖结构的双时钟FIFO。这种结构未必更好——只是另
一种实现的方法而已。

使用特权

评论回复
26
GoldSunMonkey|  楼主 | 2011-10-18 18:53 | 只看该作者
1 工作原理
至此我们已经解决了用格雷码表示的不同时钟域的所有计算,包括多位二进
制计算。本篇所介绍的结构与以往并没有什么不同,唯一的区别在判断引起读写
指针相等条件的方法。
如果还记得先前的**,文中提到读写指针相等意味着无论是满条件还是空
条件,依赖于读操作还是写操作导致了指针的相等。在同步FIFO 的第一个例子
中,这很容易判别,因为两种操作均与一个时钟有关。在第二种结构中,这个条
件已被编码于指针中。我们现在将探究双时钟设计的第二种方法。
1.1 方向标志(Direction flags)
在这种结构中,我们让指针轨迹的标志相等。我们称其为“Direction flags(方
向标志)”。这个标志告诉状态电路FIFO“当前朝向(headed)”。它假设写操作
引起的FIFO 朝越来越满的方向与读操作引起的FIFO 朝越来越空的方向为FIFO
的朝向。
不用说,每边(读操作或写操作)都必须保留独立的方向标志复本(copies)
并且维持在保守状态。因此对于写操作一方将有其自己的方向标志来维护保守
性。也就是,从读操作一方可能会看到写操作被延迟并且读操作一边也将维持方
向标志,它可以根据延迟的写操作来计算。就像先前的双时钟结构,这将确认
FIFO 没有在吞或吐数据,但这样做是以FIFO 尺寸动态缩小为代价的。
FIFO 满/空标志的计算基于这些方向标志,其思想是如果FIFO 的朝向为向
越来越满的方向,并且指针相等,则FIFO 真正为满。如果FIFO 朝向越来越空
的方向,并且指针相等,则FIFO 确实为空。

使用特权

评论回复
27
GoldSunMonkey|  楼主 | 2011-10-18 18:53 | 只看该作者
1.2 方向标志的实现
有很多不同的方法实现方向标志:一般的想法是当 FIFO 的字节计算超过某
个预定上限,就认为FIFO“going towards full(趋向满) ”,当字节计算低于预定
下限是,就认为FIFO“going towards empty(趋向空)”。
一些设计人员选择“going towards full”的门限为FIFO 容量的75%,“going
towards empty”的门限为FIFO 容量的25%。还有人选择两个门限都为FIFO 容
量的50%。也有选择80% 和20%的。门限的选择可由自己来决定,要根据设计
选择最适合的门限。也可以根据时钟的速度与门限值得关系来确定以便使标志失
效的可能性最小,但我不确定门限的选择会让设计的系统变得更好。我认为上限
与下限之间有滞后或许更好(滞后的意思是上限与下限之间的差并且“going full”
门限要大大超于“going empty”门限)。
我们不妨选择 FIFO 容量的75%和25%作为门限。这样做比较有效,因为你
只需比较指针的高两位就能决定是否越过门限。若用另一些值,你将不得不比较
指针的所有位,而这有可能影响你所设计的系统的速度。像以前一样,写操作的
Adam Luo
一方可以看到写指针和一个被同步的读指针,两个指针均为格雷码。然后,将格
雷码指针转换为二进制指针并计算出FIFO 中有多少数据。如果FIFO 中的数据
量大于“going full”门限,就置位方向标志。当FIFO 中的数据小于“going empty”
门限,就清除方向标志。
同理,读操作看到(格雷码的)读指针和一个被同步的(格雷码的)写指针。
在完成格雷码到二进制码的转换后,计算FIFO 中的字节数;如果字数小于“going
empty”门限,就置位方向标志(此时方向标志的反指向(the opposite sense) 作为
写操作一方的方向标志),当字数增加,大于“going full”门限时就清除方向标
志。
记住,当选择 75%和25%作为门限时,上述计算无需比较指针的全部位。
只用指针的高两位就足够了。

使用特权

评论回复
28
GoldSunMonkey|  楼主 | 2011-10-18 18:53 | 只看该作者
1.3 空/满的计算
在写操作一方,如果指针相等并且方向标志置位,则 FIFO 的满标志置位,
同理,在读操作一方,如果方向标志置位并且指针相等,FIFO 的空标志置位。
注意,这意味着我们不排除空/满标志同时置位的可能性。尽管听起来不合常理,
但对于FIFO 是正确的条件。你也许会想FIFO 怎么可能同时既满又空呢。然而
如果你进一步分析,就会发现“满”只是一个写操作一方的流控制机构,“空”
只是一个读操作一方的流控制机构。如果FIFO 的读写操作两边的Blocks 同时流
动那么这就是正确的——它并未破坏存储器或指针。当FIFO 真的不能再接收数
据或当不能再提供更多的数据时FIFO 没有报告是非常危险的。仔细分析以前所
讲的结构,它证明这种可能性不排除存在于其它结构中。
下面列出了计算方向标志每一边(读或写)的计算(注意公式中的指针已被
适当的同步并且转换为二进制):
word_count = wr_ptr - rd_ptr + 1 if wr_ptr > rd_ptr
fifo_size - (rd_ptr - wr_ptr) + 1 if rd_ptr > wr_ptr
direction_flagwr = 1 if word_count > going_full_threshold
0 if word count < going_empty_threshold
direction_flagrd = 1 if word_count < going_empty_threshold
0 if word_count > going_full_threshold
如图 1 所示为75%和25%门限的特列。在这个特例中,上述字节计算公式
仅需要二进制码指针的最高两位,并且不需要加1 得到字数的精确值。只需知道
是否越过门限而已。
还要记住,在写操作和读操作一边的门限不必相同;可以根据读写时钟频率
调整门限值以优化性能。

使用特权

评论回复
29
GoldSunMonkey|  楼主 | 2011-10-18 18:54 | 只看该作者
2 结论
这种结构是在同步FIFO 情况下提出的命题中的一种变异。这种同步FIFO
是这个结构的一个特例——“going full”和“going empty”的门限分别等于
(fifo_size-1)和1。
这种结构的表现比先前所提到的异步结构有着明显的优点码?未必。在一些
临界情况下,这种结构可能会有优势——对于时间紧张的情况下N-bit 格雷码转
Adam Luo
换为二进制码也没有问题,但在N+1 位(在先前的结构中需要的)格雷码情况
下就没有这种优势,或当面积比较紧张的时候为了N+1位转换而占用额外的面
积这种结构就不适用了。我的观点是,它们都是真正的非常优秀的结构,因此选
择哪种结构取决于你的偏好。
[local]1[\local]

2011-10-18_184440.jpg (50.69 KB )

2011-10-18_184440.jpg

使用特权

评论回复
30
jiabin1024| | 2011-10-19 08:34 | 只看该作者
凑个人气!!不懂

使用特权

评论回复
31
jakfens| | 2011-10-19 08:38 | 只看该作者
我说 猴哥为啥要选择下沉呢?神贴啊
呵呵

使用特权

评论回复
32
AutoESL| | 2011-10-19 09:11 | 只看该作者
:L大作啊,为什么下沉呢

使用特权

评论回复
33
AutoESL| | 2011-10-19 09:12 | 只看该作者
可以出书了

使用特权

评论回复
34
jakfens| | 2011-10-19 09:12 | 只看该作者
:D

使用特权

评论回复
35
ahgao| | 2011-10-19 09:17 | 只看该作者
先顶后学

使用特权

评论回复
36
GoldSunMonkey|  楼主 | 2011-10-19 10:57 | 只看该作者
:lol

使用特权

评论回复
37
GoldSunMonkey|  楼主 | 2011-10-19 10:57 | 只看该作者
天。你们太利害了

使用特权

评论回复
38
AutoESL| | 2011-10-19 11:04 | 只看该作者
:L猴哥厉害

使用特权

评论回复
39
GoldSunMonkey|  楼主 | 2011-10-19 11:28 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-10-19 19:34 编辑
:L猴哥厉害
AutoESL 发表于 2011-10-19 11:04

我要你厉害~~

使用特权

评论回复
40
dong_abc| | 2011-10-19 18:06 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则