1. 程式人生 > >fpga 圖像緩存方案討論

fpga 圖像緩存方案討論

avalon 下一個 pan 圖像 假設 。。 完成 因此 val

fpga存儲圖像方案討論

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

fpga 圖像緩存方案討論