ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:747.76KB ,
资源ID:2190920      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2190920.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(重读《异步FIFO结构》.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

重读《异步FIFO结构》.docx

1、重读异步FIFO结构重读异步FIFO结构 CPLD/FPGA发布时间:2009-06-18 15:09:18 项目中多处需要用到FIFO,傻瓜式的调用Altera的库即可完成设计。为了深入了解FIFO的结构,上网找了些资料。异步FIFO只能自己写。一、关于同步FIFO1、在前面的日志里贴出了一个从网上找的同步FIFO的原代码,本人进行了稍微修改,原始的文章为:2009/6/18/30d4e845-8448-42fc-bd8d-ce6543759ac5.rar,文章名字叫“同步FIFO原理剖析”。根据其介绍的同步FIFO原理修改的代码以及测试激励:2009/6/18/575687b3-0cbf-

2、4e1b-b3be-12766daa84f7.rar。2、 今天有时间重新拜读了异步FIFO结构(翻译),文章中讲述异步FIFO之前先讲述了同步(单时钟)FIFO。原理虽然和上述的同步FIFO一致,但是有些论述特别是对于空和满的判断个人觉得讲的非常精辟。特摘录一些重点:1)、写指针指向下一个将要写入的位置;读指针指向下一个将要读取的位置。2)、空和满写指针和读指针是相等的。但是满或者空的决定并不仅仅基于指针的值,而是基于引起指针值相等的操作。如果指针相等的原因是复位或者读操作,FIFO认为是空;如果原因是写操作,那么FIFO认为是满。3)、一般情况下(指非临界状况下)读操作和写操作同时都在使其

3、指针增加,但是不改变空标志和满标志的状态。在空或满的临界状态同时读操作和写操作都是不允许的。由以上几点得出空和满标志状态变化的条件(未包含复位条件):写操作无条件的清除空标志;write_pointer=(read_pointer+1),读操作置空;读操作无条件的清除满标志;read_pointer=(write_pointer+1),写操作置满(包括read_pointer=0,而write_pointer=depth-1的情况,这里与同步FIFO原理剖析中稍有不同)。将以上空满判断条件稍加改动:a、临界状态下如果同时有读和写操作,如果FIFO空,那么只允许写,如果满则只允许读;b、对于空和

4、满置位操作,文章中论述的基础是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(有

5、效字)信号可以参考我修改的同步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的功能模块图:由

6、上图可以看出,写地址产生模块根据写时钟和写有效信号产生递增的写地址,读地址产生模块根据读时钟和读有效信号产生递增的读地址。FIFO的操作如下:在写时钟wr_clk的上升沿,当wren有效时,将wr_data写入双口RAM中写地址对应的位置中;始终将读地址对应的双口RAM中的数据输出到读数据总线上。这样就实现了先进先出的功能。 写地址产生模块还根据读地址和写地址关系产生FIFO的满标志。当wren有效时,若写地址+2=读地址时,full为1;当wren无效时,若写地址+1=读地址时,full为1。读地址产生模块还根据读地址和写地址的差产生FIFO的空标志。当rden有效时,若写地址-1=读地址时

7、,empty为1;当rden无效时,若写地址=读地址时,empty为1。按照以上方式产生标志信号是为了提前一个时钟周期产生对应的标志信号。 由于空标志和满标志控制了FIFO的操作,因此标志错误会引起操作的错误。如上所述,标志的产生是通过对读写地址的比较产生的,当读写时钟完全异步时,对读写地址进行比较时,可能得出错误的结果。例如,在读地址变化过程中,由于读地址的各位变化并不同步,计算读写地址的差值,可能产生错误的差值,导致产生错误的满标志信号。若将未满标志置为满标志时,可能降低了应用的性能,降低写数据速率;而将满置标志置为未满时,执行一次写操作,则可能产生溢出错误,这对于实际应用来说是绝对应该避

8、免的。空标志信号的产生也可能产生类似的错误。所以使用格雷码来同步异步时钟域的读写指针。为了应用的灵活,还可以增加两个标志信号,将满(almosf_full)标志和空(almost_empty)标志。其定义分别如下:当写地址与读地址的距离小于某个预先定义数值时,almost_full为1;当读地址与写地址的距离小于这个预先定义的数值时,almost_empty为1。当然,也可以加入当前有效字输出信号,也即当前FIFO中有效字(或者字节)数,almost_full和almost_empty就是通过比较当前FIFO中有效字与相应阀值来产生的。(Fri Jun 19 200916:40:42 注:以上

9、描述似乎没有考虑读或写地址位于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。三、SunBurst Design的Asyncronous FIFO思想 (一)、Paper介绍了两种异步FIFO Style设计思想,首先讨论第一种设计思想,就叫Af

10、ifoNo1Style。1、The difficulty associated with doing FIFO design is related to generating the FIFO pointers and finding a reliable way to determine full and empty status on the FIFO.2、关于判断满和空的方法(核心思想就是要判断在写指针和读指针相等的时候到底是写操作“追”上读操作还是相反)The FIFO is empty when the read and write pointers are both equal.

11、This condition happens when both pointers are reset to zero during a reset operation, or when the read pointer catches up to the write pointer, having read the last word from the FIFO.A FIFO is full when the pointers are again equal, that is, when the write pointer has wrapped around and caught up t

12、o the read pointer. This is a problem. The FIFO is either empty or full when the pointers are equal, but which?One design technique used to distinguish between full and empty is to add an extra bit to each pointer. When the write pointer increments past the final FIFO address, the write pointer will

13、 increment the unused MSB while setting the rest of the bits back to zero as shown in Figure 1 (the FIFO has wrapped and toggled the pointer MSB). The same is done with the read pointer. If the MSBs of the two pointers are different, it means that the write pointer has wrapped one more time that the

14、 read pointer. If the MSBs of the two pointers are the same, it means that both pointers have wrapped the same number of times.3、高手的paper附在这里2009/6/23/0489e30f-905e-46f0-bafc-2cef9ff7db21.rar,其核心思想就是利用n bit格雷码判断n-1 bit深的FIFO的空满状态,保证FIFO不会overflow或者underflow。如下图所示为双n格雷码计数器:上图有异于一般异步FIFO的设计思路在于,跨时钟传输的

15、格雷码指针无需再次转换成二进制指针,也即系统中只有二进制到格雷码转换无格雷码到二进制码的转换,判断的时候直接比较双方格雷码(本地指针转换成格雷码与对方时钟域过来的指针进行比较,同时本地转换成格雷码的指针也要跨时钟域传输到对方时钟域).这样减少了逻辑消耗同时提供了系统性能.我们知道,格雷码是一种非线性码,虽然它有相邻码只有一位变化的优点,但是它不能直接用来进行各种运算.本例设计的亮点就在于通过巧妙架构使的可以直接拿格雷码来进行运算.再上一图:下图是传统异步FIFO设计时候普遍采取的策略:4、根据该paper写出的异步FIFO代码为:2009/6/23/0896882f-7970-4879-83d

16、8-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一样,一是Gray counter设计,一是FIFO状态判断。简单比较两个styles,paper中给出以下观点:AfifoNo1Style中指针同步到对方指针时钟域后生成空、满标志位;而AfifoNo2Style是通过异步比较两个格雷

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

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