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的話,則不會丟幀,表述可能不清晰。。見諒。
