重读《异步FIO结构》.docVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
重读《异步FIO结构》

重读《异步FIFO结构》 [CPLD/FPGA]发布时间:2009-06-18 15:09:18 项目中多处需要用到FIFO,傻瓜式的调用Altera的库即可完成设计。为了深入了解FIFO的结构,上网找了些资料。异步FIFO只能自己写。 一、关于同步FIFO 1、在前面的日志里贴出了一个从网上找的同步FIFO的原代码,本人进行了稍微修改,原始的文章为:/Upload/2009/6/18/30d4e845-8448-42fc-bd8d-ce6543759ac5.rar,文章名字叫“同步FIFO原理剖析”。根据其介绍的同步FIFO原理修改的代码以及测试激励:/Upload/2009/6/18/575687b3-0cbf-4e1b-b3be-12766daa84f 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原代码修改如下(文章中提供的原代码本身就有问题):/Upload/2009/6/19/266ec7ec-7779-4780-a9ba-8db4b4e46450.rar;FIFO的测试激励:/Upload/2009/6/19/17819c8c-72d0-4130-a0db-ca01fe42e8b0.rar。 以下是ModelSim的仿真波形,包含了“写满”,以及“读空”: 另外,FIFO的almost_empty,almost_full以及usedw(有效字)信号可以参考我修改的《同步fifo原理剖析》源码。 最后在板子上跑的结果如下: 附上QII工程:/Upload/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的操作,因此标志错误会引起操作的错误。如上所述,标志的产生是通过对读写地址的比较产生的,当读写时钟完全异步时,对读

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档