1. 程式人生 > >基於SDRAM的視頻圖像采集系統

基於SDRAM的視頻圖像采集系統

代碼 完整 連續 BE 讀取 工程 應該 讀寫 是的

本文是在前面設計好的簡易SDRAM控制器的基礎上完善,逐步實現使用SDRAM存儲視頻流數據,實現視頻圖像采集系統,CMOS使用的是OV7725。

SDRAM控制器的完善

1. 修改SDRAM的時鐘到100Mhz

系統時鐘提了上來下面對應的時間參數就需要註意,再50Mhz下的這些時間參數的計數器的都需要做相應的修改。

技術分享圖片

技術分享圖片

2. 寫入一幅圖像(640 * 480)到SDRAM

640 * 480 = 307200個數據

307200 / 256 = 1200行,所以我們只需要寫入1200行數據寫滿即可。

OV7725支持640*480分辨率的30萬像素攝像頭,首先驗證SDRAM和VGA級聯能夠顯示出來,所以先用串口發送一幅640*480的圖片存到SDRAM中,通過VGA顯示出來。

3. 將突發長度設置為full page

視頻圖像采集顯示對實時性要求比較高,所以本設計將SDRAM的突發長度設置為full page。

sdram頁突發模式

將burst length設置為full page,full page就是一次寫入一行數據,我這裏就是2 ^ 8 = 256個位寬16的數據。

技術分享圖片

技術分享圖片

當刷新請求來臨,但是些突發還沒有寫完full page,所以這個時候需要等待,等一個突發長度操作完成,才能去進行刷新。相應的讀操作也是一樣的。

技術分享圖片

SDRAM寫入1200行後又會繼續寫入數據。

邊寫邊讀

為了要求設計的實時性,做到編寫邊讀,當系統檢測到第一次寫入數據時,然後觸發使能,然後就開始讀數據,實現邊讀邊寫。

技術分享圖片

加入讀寫FIFO緩存自動讀寫SDRAM

sdram寫模塊一次寫入256個數據,rdusedw為fifo深度判斷,設置fifo深度為512,當rdusedw大於256時,即拉高wr_trig,讀fifo模塊也是一樣的,從sdram中把數據寫入fifo裏,當讀fifo的wrusedw小於256就往裏面寫數據。fifo起到一個緩沖作用,既不能寫滿也不能讀空。這裏是博主感覺到妙的地方,使用異步FIFO緩沖,實現數據再兩個模塊在時鐘域不同的情況下傳輸。基本上FIFO一直處在半滿的狀態下。

技術分享圖片

串口的時鐘是50Mhz,SDRAM寫入的時鐘是100Mhz,所以這裏fifo應該要兩個獨立的讀寫時鐘。使用兩個fifo,一個fifo作為串口發送過來的數據和sdram寫數據端口的連接,一個作為VGA和sdram讀數據端口連接。VGA模塊的讀使能信號決定什麽時候從sdram讀出數據進行顯示。

這部分由於數據比較大,而且出了錯不容易查找,所以更要做好充分的仿真。具體的仿真方法,我是這樣仿真的,在testbench裏加上串口發送模塊,把接收模塊的波特率提高到50Mhz,發送模塊也相應的對應上1/16的關系,發送模塊裏面給一串數據,用for循環的方法。

技術分享圖片

VGA顯示的行場掃描的的參數也縮小,這裏主要是看前幾行數據有沒有對應上,我這是的一行有256個數據,需要註意下一行數據是不是連續顯示的。

技術分享圖片

這個仿真過程是比較痛苦的,具體的就是不斷的重復仿真,不斷的去湊波形,當然這也應該是一名合格的工程師的必備技能,在不斷重復過程中就體現出了do腳本自動化仿真的必要性,找到波形中錯誤的地方,回去對照代碼,一級一級的往上推錯誤的原因,大概就是這樣,掌握了仿真的技巧,其實仿真也不難。確保仿真沒問題,下板子基本也就會成功了。

最後效果如下

https://v.qq.com/x/page/y0644dld7dt.html

乒乓操作

為了達到顯示的實時性和同步性,設計SDRAM裏的兩片bank乒乓操作來進行顯示,我先用串口發送一次發送兩幅圖片分別到兩個bank裏,調試VGA顯示驅動能正常顯示。

攝像頭輸入的視頻源為640*480@30Hz,VGA的驅動顯示為640*480@60Hz,也就是說,攝像頭發送過來一幀,但VGA已經掃描了兩幀,這裏就會存在問題是,直接把攝像頭發送過來的視頻流數據顯示,可能會出現兩幀重疊現象。

技術分享圖片

如圖是沒有乒乓操作的存儲,在t0時刻sdram完成了1/2幀的存儲,VGA已經顯示了1幀,t1時刻sdram完成1幀的存儲,VGA顯示了兩幀,到了t2時刻可以看到第一幀和第二幀的是交疊的,在理想的情況下這樣顯示其實是沒有什麽問題,即使你的t2時刻第一幀圖像和第二幀的圖像重合,人的肉眼也察覺不到。但是實際上考慮到硬件本身的因素,攝像頭輸出的幀率並不能保證完整的640*480@30Hz,這樣如果繼續單幀存儲,那麽這樣的兩幀交疊可能會更嚴重,乒乓操作可以解決這個問題。

技術分享圖片

我們為了確保當前顯示的一幀是完整的一幀,使用兩個bank進行分別存取,在剛開始的時候攝像頭給bank0寫入數據,寫滿bank0然後切換到bank3寫數據,VGA讀取bank3的數據,讀完一幀切換到bank0讀取數據。這樣基本上可以保證兩幀交疊的概率降低。Verilog代碼實現起來也是非常簡單的。

在寫模塊裏加上

技術分享圖片

在讀模塊裏加上

技術分享圖片

然後就可以實現乒乓操作了

我先用串口發送了分別發送了兩幅640*480的圖片到sdram的兩個bank裏,最後乒乓操作顯示的效果還是比較有趣,視頻如下。

https://v.qq.com/x/page/w06602k4eho.html

視頻圖像采集系統

如果完成到上面的過程,sdram控制器基本上沒毛病了,在上面寫的SDRAM的基礎上加上OV7725攝像頭驅動顯示,攝像頭驅動和采集部分代碼移植的是CrazyBingo的,這個過程還是比較順利的,sdram部分基本不用改,直接把攝像頭采集到的數據和寫sdram使能連接到一起就可以了,我的sdram控制器跑到100Mhz,並實現視頻圖像實時采集沒毛病。

https://v.qq.com/x/page/m06607w3y9s.html

技術分享圖片

轉載請註明出處:NingHeChuan(寧河川)

個人微信訂閱號:開源FPGA

如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關註個人微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:https://www.cnblogs.com/ninghechuan/p/9096671.html

基於SDRAM的視頻圖像采集系統