|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
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 )
|
|