CMOS攝像頭(4) SDRAM和桌球操作

2022-05-05 19:33:11 字數 2196 閱讀 9732

ov7670/ov7725/ov5640開發記錄終於到最後一講了,還是蠻累的。

、sdram快取處理

很多攝像頭工程都用到了sdram作為中間快取,很多人一臉懵逼,我也是思考了好一陣才明白。先假設 ov5640 和 vga 直接相連,中間不採用任何快取器件,那會出現什麼情況呢?

ov5640 的幀率為 30fps, vga 的幀率為 60fps,且時鐘也完全不一樣。假設解析度是 3x2 = 6,資料為:1,2,3,4,5,6。ov5640 幀率小,生成乙個畫素的時間假設是2秒,而 vga 幀率大,需要乙個畫素的時間假設是 1s。在 6s 的時間裡,vga就請求了一幀資料,可這個時間裡 ov5640 只生成了1,2,3共三個畫素,vga那邊就出現了空資料的情況。在 12s 的時間裡,vga 請求了兩幀資料,可這個時間裡 ov5640 只生成了一幀資料,怎麼來說都是錯的。上述假設是簡化了時間點,實際情況是 ov5640 生成畫素和 vga 請求畫素的時間不一致,導致vga總是要不到一幀影象正確的資料,也要不全一幀影象正確的資料。因此,ov5640 和 vga 之間需要加入乙個快取器件,用於快取一幀的資料,這樣 vga 每次要一幀資料都可以被滿足。加入快取器件的根本原因就是兩端時鐘不一致,導致讀寫速率不一致。

採用什麼快取器件呢?fifo 和 ram 是最常用的,但是一幀的影象資料往往是 640x480、1280x768、1920x1280,每個畫素是 16bit。資料量大,fpga的片內資源無法滿足。因此需要引入外部快取器件,如 sdram、ddr2、ddr3等。

二、無桌球操作

sdram 正常使用其實是無桌球操作,無桌球操作是考慮不周的,除非一幀影象是瞬間生成,ov5640 幀率 30fps,vga 幀率 60fps,彷彿剛好可以寫一幀讀兩幀。但是一幀影象實際情況是一行行的生成和讀取的,所以會出現 vga 從sdram處讀的上半幀是新幀,而由於sdram快取的下半幀還沒有被 ov5640 寫完,vga 從sdram處讀的下半幀還是老幀。示意圖如下所示,紅線為寫,黑線為讀。

將上述 5 幀影象生成的時間點編號為 t1、t2、t3、t4、t5。在 t1、t3、t5 時刻影象都是殘缺幀(新老幀參半),在 t2、t4 時刻影象才是完整的一幀,而 vga 那邊可不管,每個時間點都會要一幀影象,這就是錯幀現象。而解決錯幀現象的方法則是桌球操作。

三、桌球操作

1、桌球操作原理

桌球操作,使用兩個快取區,寫快取區 1 時讀快取區 2,寫快取區 2 時讀快取區 1,讀寫交替。示意圖如下,紅線為寫,黑線為讀。

由示意圖可以看出,桌球操作中,每次讀的(黑線)都是完整的幀,每一幀讀 2 次,這樣便沒有出現讀殘缺幀的現象,解決了錯幀問題。

2、桌球操作設計

在上述設計中,由於寫讀速率為1:2,所以寫一幀讀兩幀即可,但是很多時候寫讀速率的比例是其他數值,那怎麼辦呢?

(1)寫端在快取區1寫完一幀資料就切換到快取區2寫下一幀,寫完後又切換回快取區1寫再下一幀,如此反覆。

(2)讀端在快取區2讀完一幀:

①如果寫端仍然在快取區1,則讀端不切換快取區,而是繼續在快取區2重讀一幀。

②如果寫端離開了快取區1,即切換到快取區2了,說明寫端已經在快取區1寫完了,則讀端可以切換到快取區1。這樣就能保證讀端每次讀的都是完整的幀,就算有一小段時間是讀寫端都在同乙個快取區,但是由於寫慢讀快,寫是不會追上讀的,讀還是能讀完舊幀,之後舊幀才被新幀覆蓋。

寫慢讀快這樣設計就行,那如果寫快讀慢呢?其實也是一樣的思想,反過來即可。無論誰快誰慢,都是快端照顧慢端,即慢端一幀結束就離開自身快取區到另一快取區。快端則一幀結束後,先檢測慢端是否離開自身快取區,是則切換過去,否則不切換過去,而是重新在自身快取區再工作一幀。示意圖如下所示:

3、sdram桌球操作

用兩片sdram來進行桌球操作有些太浪費了,可以直接利用sdram裡面的bank進行桌球操作即可。雖然讀寫只有一根匯流排,但是sdram時鐘高,讀寫足夠快,可以滿足桌球操作的需求。具體實現可以看這篇部落格《ddr2(5):ddr2自動讀寫控制器》,雖然是 ddr2,但道理是一樣的。

(10)檢視RGB攝像頭和深度攝像頭

1 小車開機,連線wifi,遠端登入 登入密碼 dongguan ssh wheeltec 192.168.0.1002 掛載 掛載密碼 raspberry sudo mount t nfs 192.168.0.100 home wheeltec wheeltec robot mnt3 檢視rgb攝...

樹莓派 CSI攝像頭和USB攝像頭的配置與除錯

拍攝一張 安裝v4l2驅動使opencv能夠識別攝像頭 執行命令 sudo raspi config進入設定頁面後,之後按照下面步驟設定 選擇 inte cing options 選擇 camera 一直按回車後退出重啟樹莓派 利用 lsusb 可以檢視樹莓派上掛載的所有 usb 外設,將攝像頭插入...

V4L2 獲取和配置攝像頭

一 v4l2 獲取和配置攝像頭程式示例 include include include include include include include includeint fd const char input dev dev video0 const char qctrl name null i...