重读《异步FIFO结构》.docx

上传人:b****2 文档编号:2190920 上传时间:2022-10-27 格式:DOCX 页数:13 大小:747.76KB
下载 相关 举报
重读《异步FIFO结构》.docx_第1页
第1页 / 共13页
重读《异步FIFO结构》.docx_第2页
第2页 / 共13页
重读《异步FIFO结构》.docx_第3页
第3页 / 共13页
重读《异步FIFO结构》.docx_第4页
第4页 / 共13页
重读《异步FIFO结构》.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

重读《异步FIFO结构》.docx

《重读《异步FIFO结构》.docx》由会员分享,可在线阅读,更多相关《重读《异步FIFO结构》.docx(13页珍藏版)》请在冰豆网上搜索。

重读《异步FIFO结构》.docx

重读《异步FIFO结构》

重读《异步FIFO结构》[CPLD/FPGA]发布时间:

2009-06-1815:

09:

18

项目中多处需要用到FIFO,傻瓜式的调用Altera的库即可完成设计。

为了深入了解FIFO的结构,上网找了些资料。

异步FIFO只能自己写。

一、关于同步FIFO

1、在前面的日志里贴出了一个从网上找的同步FIFO的原代码,本人进行了稍微修改,原始的文章为:

2009/6/18/30d4e845-8448-42fc-bd8d-ce6543759ac5.rar,文章名字叫“同步FIFO原理剖析”。

根据其介绍的同步FIFO原理修改的代码以及测试激励:

2009/6/18/575687b3-0cbf-4e1b-b3be-12766daa84f7.rar。

 

2、今天有时间重新拜读了异步FIFO结构(翻译),文章中讲述异步FIFO之前先讲述了同步(单时钟)FIFO。

原理虽然和上述的同步FIFO一致,但是有些论述特别是对于"空"和"满"的判断个人觉得讲的非常精辟。

特摘录一些重点:

1)、写指针指向下一个将要写入的位置;读指针指向下一个将要读取的位置。

2)、"空"和"满"写指针和读指针是相等的。

但是"满"或者"空"的决定并不仅仅基于指针的值,而是基于引起指针值相等的操作。

如果指针相等的原因是复位或者读操作,FIFO认为是空;如果原因是写操作,那么FIFO认为是满。

3)、一般情况下(指非临界状况下)读操作和写操作同时都在使其指针增加,但是不改变空标志和满标志的状态。

在空或满的临界状态同时读操作和写操作都是不允许的。

由以上几点得出"空"和"满"标志状态变化的条件(未包含复位条件):

写操作无条件的清除空标志;

write_pointer=(read_pointer+1),读操作置"空";

读操作无条件的清除满标志;

read_pointer=(write_pointer+1),写操作置"满"(包括read_pointer=0,而write_pointer=depth-1的情况,这里与"同步FIFO原理剖析"中稍有不同)。

将以上空满判断条件稍加改动:

a、临界状态下如果同时有读和写操作,如果FIFO空,那么只允许写,如果满则只允许读;b、对于空和满置位操作,文章中论述的基础是FIFO的深度-depth为2的幂,将深度改为可参数化的任意整数的时候,需要对读和写到depth-1的位置进行判决。

根据以上改动将文章中提供的FIFO原代码修改如下(文章中提供的原代码本身就有问题):

2009/6/19/266ec7ec-7779-4780-a9ba-8db4b4e46450.rar;FIFO的测试激励:

2009/6/19/17819c8c-72d0-4130-a0db-ca01fe42e8b0.rar。

以下是ModelSim的仿真波形,包含了“写满”,以及“读空”:

另外,FIFO的almost_empty,almost_full以及usedw(有效字)信号可以参考我修改的《同步fifo原理剖析》源码。

最后在板子上跑的结果如下:

附上QII工程:

2009/6/19/3cd341ed-f5c8-4e41-998d-e064122a7544.rar。

 

二、关于异步FIFO

异步FIFO的接口信号包括异步的写时钟(wr_clk)和读时钟(rd_clk)、与写时钟同步的写有效(wren)和写数据(wr_data)、与读时钟同步的读有效(rden)和读数据(rd_data)。

为了实现正确的读写和避免FIFO的上溢或下溢,通常还应该给出与读时钟和写时钟同步的FIFO的空标志(empty)和满标志(full)以禁止读写操作。

下面给出异步FIFO的功能模块图:

由上图可以看出,写地址产生模块根据写时钟和写有效信号产生递增的写地址,读地址产生模块根据读时钟和读有效信号产生递增的读地址。

FIFO的操作如下:

在写时钟wr_clk的上升沿,当wren有效时,将wr_data写入双口RAM中写地址对应的位置中;始终将读地址对应的双口RAM中的数据输出到读数据总线上。

这样就实现了先进先出的功能。

写地址产生模块还根据读地址和写地址关系产生FIFO的满标志。

当wren有效时,若写地址+2=读地址时,full为1;当wren无效时,若写地址+1=读地址时,full为1。

读地址产生模块还根据读地址和写地址的差产生FIFO的空标志。

当rden有效时,若写地址-1=读地址时,empty为1;当rden无效时,若写地址=读地址时,empty为1。

按照以上方式产生标志信号是为了提前一个时钟周期产生对应的标志信号。

由于空标志和满标志控制了FIFO的操作,因此标志错误会引起操作的错误。

如上所述,标志的产生是通过对读写地址的比较产生的,当读写时钟完全异步时,对读写地址进行比较时,可能得出错误的结果。

例如,在读地址变化过程中,由于读地址的各位变化并不同步,计算读写地址的差值,可能产生错误的差值,导致产生错误的满标志信号。

若将未满标志置为满标志时,可能降低了应用的性能,降低写数据速率;而将满置标志置为未满时,执行一次写操作,则可能产生溢出错误,这对于实际应用来说是绝对应该避免的。

空标志信号的产生也可能产生类似的错误。

所以使用格雷码来同步异步时钟域的读写指针。

为了应用的灵活,还可以增加两个标志信号,将满(almosf_full)标志和空(almost_empty)标志。

其定义分别如下:

当写地址与读地址的距离小于某个预先定义数值时,almost_full为1;当读地址与写地址的距离小于这个预先定义的数值时,almost_empty为1。

当然,也可以加入当前有效字输出信号,也即当前FIFO中有效字(或者字节)数,almost_full和almost_empty就是通过比较当前FIFO中有效字与相应阀值来产生的。

(FriJun19200916:

40:

42注:

以上描述似乎没有考虑读或写地址位于FIFO末端或者FIFO起始的情况,需要仿真确认在这种特例下是否也成立,比如8bit的FIFO,0xff减去0xfe等于1,但是0减去0xff未必等于1)。

这是尚未调试的代码:

2009/6/19/443dcb7e-90e6-434c-9b72-8b8e969fa2e6.rar;尚未调试的QII工程:

2009/6/19/4e5bda68-e82c-45bd-83b1-c30e0e0a1566.rar。

 

三、SunBurstDesign的AsyncronousFIFO思想

 

(一)、Paper介绍了两种异步FIFOStyle设计思想,首先讨论第一种设计思想,就叫AfifoNo1Style。

1、ThedifficultyassociatedwithdoingFIFOdesignisrelatedtogeneratingtheFIFOpointersandfindingareliablewaytodeterminefullandemptystatusontheFIFO.

2、关于判断满和空的方法(核心思想就是要判断在写指针和读指针相等的时候到底是写操作“追”上读操作还是相反)

TheFIFOisemptywhenthereadandwritepointersarebothequal.Thisconditionhappenswhenbothpointersareresettozeroduringaresetoperation,orwhenthereadpointercatchesuptothewritepointer,havingreadthelastwordfromtheFIFO.

AFIFOisfullwhenthepointersareagainequal,thatis,whenthewritepointerhaswrappedaroundandcaughtuptothereadpointer.Thisisaproblem.TheFIFOiseitheremptyorfullwhenthepointersareequal,butwhich?

Onedesigntechniqueusedtodistinguishbetweenfullandemptyistoaddanextrabittoeachpointer.WhenthewritepointerincrementspastthefinalFIFOaddress,thewritepointerwillincrementtheunusedMSBwhilesettingtherestofthebitsbacktozeroasshowninFigure1(theFIFOhaswrappedandtoggledthepointerMSB).Thesameisdonewiththereadpointer.IftheMSBsofthetwopointersaredifferent,itmeansthatthewritepointerhaswrappedonemoretimethatthereadpointer.IftheMSBsofthetwopointersarethesame,itmeansthatbothpointershavewrappedthesamenumberoftimes.

3、高手的paper附在这里2009/6/23/0489e30f-905e-46f0-bafc-2cef9ff7db21.rar,其核心思想就是利用nbit格雷码判断n-1bit深的FIFO的空满状态,保证FIFO不会overflow或者underflow。

如下图所示为双n格雷码计数器:

上图有异于一般异步FIFO的设计思路在于,跨时钟传输的格雷码指针无需再次转换成二进制指针,也即系统中只有二进制到格雷码转换无格雷码到二进制码的转换,判断的时候直接比较双方格雷码(本地指针转换成格雷码与对方时钟域过来的指针进行比较,同时本地转换成格雷码的指针也要跨时钟域传输到对方时钟域).这样减少了逻辑消耗同时提供了系统性能.

我们知道,格雷码是一种非线性码,虽然它有相邻码只有一位变化的优点,但是它不能直接用来进行各种运算.本例设计的亮点就在于通过巧妙架构使的可以直接拿格雷码来进行"运算".再上一图:

下图是传统异步FIFO设计时候普遍采取的策略:

4、根据该paper写出的异步FIFO代码为:

2009/6/23/0896882f-7970-4879-83d8-f8d85fa65e8a.rar;这是QuartusII工程:

2009/6/23/fa4c2f38-d2d8-4102-8d03-2333b9ed621c.rar;ModelSim下仿真文件:

2009/6/23/17b24882-43bb-4f1a-a40f-aa2013fa7091.rar。

最后,按照这种风格生成的FIFO框图如下所示:

 

(二)、下面再来看第二种设计思想,就叫AfifoNo2Style。

1、主要思想和AfifoNo1Style一样,一是Graycounter设计,一是FIFO状态判断。

简单比较两个styles,paper中给出以下观点:

AfifoNo1Style中指针同步到对方指针时钟域后生成"空"、"满"标志位;而AfifoNo2Style是通过异步比较两个格雷

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1