在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3327|回复: 7

[原创] 关于异步FIFO设计的关键点说明

[复制链接]
发表于 2015-12-20 22:28:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
1.输入信号:读/写使能,读/写数据;
2.设计的核心:根据读/写使能控制读/写地址(或者叫读写指针)更新:对于读,当未空的时候,读使能持续一个读时钟,读地址加1,对于写,当未满时候,写使能持续一个读时钟,写地址加1。
现在关键就是怎么判读空与满,有多种方法,例如:假设ram深度为N,1.当rd_address=wr_address,为空;2.当rd_address=(wr_address+1)mod N,这种方法会牺牲一个存储单元,因为该方法判断为满时实际上未满,还有一个空间可以写入 。2.如果要利用方法1中的一个剩余的空间,需要区分rd_address=wr_address时是空还是满,此时光靠读写地址肯定无法区分,所以需要记录之前的状态,即前一个状态是将满还是将空,即almost_full or almost_empty,具体的方法多种多样。
3.需要注意的是,因为是异步fifo,所以读写地址涉及跨时钟域,需要特别处理,一般的方法是:把一个时钟域的地址传递到另一个时钟域之前先转换成Gray码,再传递到另一个时钟域;另一个时钟域收到Gray码后,先用两级寄存器寄存,然后再转换成普通码,再进行处理,这种方法可以将亚稳态降低到很低的水平(应该是无法避免的,但是两级寄存器后再发生的很低了,需要注意即使不发生亚稳态也可能会采集到错误的信号),这样即使另一个时钟域传输过来的地址采集错误,也只会错一位,仔细思考会发现,这种错误根本不会影响电路的功能,即不会产生错误,只会产生一个时钟的延时。例如:ram深度为2048,假设写地址为1024,传输的读地址本来应该为1001,结果错误,那么错误的值只能是1000,此时计算得到的剩余空间为2048-(1024-1000)=2024,实际的剩余空间为2025,因为剩余空间是是否写满的参考,在发生错误的情况下,实际上计算得到的结果更加严格,更加不会发生写满还在写的情况了。
附上格雷码和二进制转换的方法:
二进制与格雷码转换.doc (73.5 KB, 下载次数: 46 )
发表于 2015-12-21 09:30:52 | 显示全部楼层
我觉得,要么用官方IP核,要么直接使用双口RAM就都行啊
 楼主| 发表于 2015-12-21 12:51:35 | 显示全部楼层
回复 2# 菜鸟要飞


   FPGA中是有IP核的,但是ASIC设计应该没有吧。双口RAM是组成FIFO的存储介质,还需要加控制逻辑才能变成FIFO。
发表于 2015-12-21 13:04:02 | 显示全部楼层
回复 3# justfigo


   恩 我就觉得,用FPGA的话,直接使用IP核就好了。做其他的话,是该考虑
 楼主| 发表于 2015-12-21 13:24:47 | 显示全部楼层
回复 4# 菜鸟要飞


   主要是面试官经常问,哈哈哈
发表于 2016-1-6 17:12:17 | 显示全部楼层
瞅一瞅,瞅一瞅
发表于 2017-5-31 19:29:38 | 显示全部楼层
学习了
发表于 2017-5-31 21:52:30 | 显示全部楼层
学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-28 20:27 , Processed in 0.022673 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表