fpga存储图像方案讨论,欢迎大家一起交流,Q群:912014800。
本文不讨论片上ram 以及sram存储,在此进讨论基于sdram存储的情况,在此sdram指 sdr sdram ,ddr sdram , ddr2 sdram ,ddr3 sdram等。
(——不用对这些sdram感到惧怕,在quartus中都可以生成他们的IP核,而对用户侧的接口都是avalon接口的——)
1.一般存储方法采用乒乓操作
过程:
(1)假设两个bank,当进来第一幅图像的时候,存到第二个bank,然后启动乒乓操作,此时开始向bank1 写数据,读取bank2的数据;
(2)此时有三种情况,bank1的图像写完了,bank2还在读,请看(3);bank1中的图像没写完,但是bank2中的图像已经读完了,请看(4);刚好同时完成请看(5)
(3)此时产生bank1中图像已经写完,置位标志wr1_fin_flag,然后等待读完成切换bank,在此期间来的写数据统统丢弃,但是下一次写数据需要同步处理,等一帧图像的开始才能写bank。一幅图像的起始来临后才能进行写操作。
(4)此时已经读完bank2的数据了,但是还在写bank1,因此此时执行的操作是读取bank2的数据,然后接着向bank1写数据,直到bank1中的数据已经写完了,然后置位wr1_fin_flag,然后等待读结束信号,若在等待过程中又来了新的数据,而此时还在读取bank2,那样应该丢弃该帧数据,直到读结束后,方可切换bank。所以在这种操作模式下,也是有丢弃数据的风险的。
(5)那样的话速率一致,直接切换bank即可。
2.采用存取至少三幅来保存图像
过程:首先进来的图像先写到第一个地址区,然后启动读。然后向第二个地址区写数据,然后读取第一个地址区的数据,此时由于速率不同也会产生相应的三种情况,当写速率大于读速率,请看(1),当写速率小于读速率请看(2),当读写速率相同,请看(3)
(1)写完了第二个地址区,然后现在还在读取第一个地址区,那么接着写第三个地址区,然后接着读,那么当写完第三个地址区后,此时可能还在读第一个地址区或者第二个地址区,若读第一个地址区,那么应该丢帧,直到读切换到第二个地址区才能向第一个地址区写数据;如果已经切换到第二个地址区,那么可以向第一个地址区写数据了,那么在写完第一个地址之后,继续判断下一个地址区有没有读完,若没有读完,则丢帧等待,若已经读完了,那么可以向下一个地址区写数据了,那么总结一下规律:当写完一个地址去后,判断当前地址区是否已经读完,然后要不要丢帧就已经决定了,而此时来的数据应该丢弃,当写完一个地址区,拉高flag写,若此时读标志为低表示还在读取要写的下一个区域,因此等待,等到读flag拉高,然后切换,此时有新的图像过来,则写,而读下一个区域。
(2)当读完了第一个地址区,然后发现还在写第二个地址区,那么此时应该在读第一个地址区,直到写地址三区,然后在切换到读地址二区,由于读的速率比较快,那么读完一帧数据后只可能在等待新的数据写完了一帧,然后立马读取新的一幅图像,这样的话,是不会产生丢帧的,而在实际情况下,若能做到不丢帧,那么也是比较好的。总结一下判断条件:读完一帧数据后,拉高标志,此时若写的标志为低,那么依次读取该地址区的数据,等到写完了下一个地址区,然后切换。
(3)这样的话,从理论上,总是间隔一个地址区,是最稳定的情况了。
综上所述:采用乒乓操作即使在读速率大于写速率的情况下,还是会丢帧的,而采用方法2的话,则不会丢帧,表述可能不清晰。。见谅。