打印
[FPGA]

怎么解决EDK中rdpfifo溢出的问题?

[复制链接]
1189|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
machairodus|  楼主 | 2014-5-28 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
匿名  2014-5-28 20:00
一般情况下FIFO的长度为2的n次方,这样地址位可以全部使用上,有利于FIFO的循环使用。判断溢出和读空的方法有很多,网上也有介绍,我只在这里说一下我认为比较好的一个方法,就是FIFO的地址位设为n+1位(如:{n+1, n}),这样地址的低n位指向FIFO的实际空间,最高的那个n+1位可以做判断用。初始化时读地址和写地址都清空,设为相等值,读时读地址+1,写时写地址+1,如果读写地址完全相同,表示FIFO为空,此时禁止读;如果低n位相同,但是n+1位相反,表示FIFO为满,此时禁止写,如果不禁止的话就是溢出了(如果地址转换成格雷码,那么FIFO的状态比较就要参考高2位地址信息了)。另外异步FIFO要注意信号的跨时钟域同步问题,一般采用双锁存器同步法,可靠性适中,方法简单。
always @ (posedge  Wr_CLK) //注意是写时钟频率信号
begin
         Rd_Addr2 <= Rd_Addr1; //Rd_Addr2就是同步到写时钟频率上的读地址
     Rd_Addr1 <= Rd_Addr;   //Rd_Addr就是在读时钟频率上的读地址
end
当然用三寄存器锁存的方法可靠性更高,但是性能会受到影响。

使用特权

评论回复
板凳
machairodus|  楼主 | 2014-5-28 23:54 | 只看该作者
本帖最后由 machairodus 于 2014-5-28 23:58 编辑
匿名者 发表于 2014-5-28 20:00
一般情况下FIFO的长度为2的n次方,这样地址位可以全部使用上,有利于FIFO的循环使用。判断溢出和读空的方法 ...

   谢谢你的解答,但是我的问题中的fifo是在edk生成ip核时的ipif界面生成的,它的作用是将IP核的数据通过microblaze写入DDR,所以写入fifo这部分功能应该是在IP中实现(也就是userlogic中),而读取fifo则应该是通过c程序(生成的驱动函数)实现。
    实际上,在ip核的userlogic中,只给了写fifo的控制信号,并没有给出读fifo的控制信号。如果是纯硬件语言控制的fifo,读出fifo中的数据后fifo也就同时释放了相应的长度;而现在使用驱动函数读取fifo,虽然能读到数据,但是却没能释放fifo,导致只能正确执行fifo深度(2048)的读写操作。
    具体描述请看我提出问题的帖子:https://bbs.21ic.com/icview-713730-1-1.html
    再次感谢你的回答!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

43

帖子

0

粉丝