zoukankan      html  css  js  c++  java
  • fpga 图像缓存方案讨论

    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的话,则不会丢帧,表述可能不清晰。。见谅。

  • 相关阅读:
    内存映射mmap的几个api及其使用
    hiredis的安装
    Linux 下解压大全
    redis内存数据库C客户端hiredis API 中文说明
    C/C++使用MySQL
    搜索引擎的缓存(cache)机制
    快速排序(QuickSort)
    冒泡排序
    spring核心之AOP学习总结一
    Spring学习总结六——SpringMVC一
  • 原文地址:https://www.cnblogs.com/cofin/p/10198293.html
Copyright © 2011-2022 走看看