基於FPGA實現OV5640攝像頭的視頻圖像採集及VGA顯示

基於FPGA實現OV5640攝像頭的視頻圖像採集及VGA顯示

2018年09月12日 17:34:47 CAOXUN_FPGA 閱讀數 6973

                                          基於FPGA實現OV5640攝像頭的視頻圖像採集及VGA顯示

0.    背景

        最近有些空閒時間,就想着去嘗試實現視頻圖像採集及顯示系統,因爲以前涉及的數據採集傳輸系統主要是採集一維物理量,如最常見的就是實時採集各種單一維度的傳感器信號,如溫度,壓力,光通量,加速度等。圖像信號雖然採用水平像素和垂直像素的二維分量顯示,其本質還是一維信號的分時顯示構成的。例如,某幅圖像大小爲1280*720pixel,則每一行是1280個有效像素點,垂直方向上每一列(line)是由某一行構成,總共有720行,單幅圖像所有像素點按時間先後依次分時採集,共計1280*720個有效像素點。

 

1.   器件選型

        爲了採集視頻圖像,需要選購攝像頭模組,本質也是傳感器(image sensor)+ 鏡頭 + 馬達等部件組成,我採用的主控芯片是FPGA,用於驅動攝像頭進行視頻採集,以及通過VGA接口進行實時顯示。選型時主要參考現階段應用於DIY較多的豪威OV5640攝像頭模組,開源資料比較多,便於固件驅動程序的開發。

        OV5640該攝像頭支持MIPI和DVP共兩種接口模式。DVP接口是並行總線,其數據流速率受限於PCLK,PCLK通常不超過96MHz;而MIPI接口是LVDS低壓差分接口,只需要要CLKP、CLKN、DATA+/DATA-組成。可知,MIPI接口比DVP的接口信號線少,差分信號線產生的干擾小,故抗干擾能力也強,因此數據流傳輸速率更高,現階段智能手機上的攝像頭均採用MIPI接口。現擬採用DVP接口來驅動該攝像頭模組。

2.  固件驅動開發

        上文提到過,OV5640攝像頭模組的開源資料豐富,主要參考以下兩個資料即可實現對攝像頭模組正常功能的驅動。

資料一是豪威內部編寫的攝像頭驅動應用指南《OV5640_自動對焦照相模組應用指南(DVP_接口)__R2.13C》;

資料二是OV5640圖像傳感芯片手冊《OV5640_datasheet》;

說明:兩個資料均可以在網上免費下載獲得,非常感謝網友的無私分享!!!

關於該攝像頭的各種規格參數參見資料一二,下面主要介紹該模組的固件驅動開發過程。

(1) 攝像頭模組上電覆位

        參見芯片手冊可知,該模組對上電時序是由具體要求的,見圖1所示。

        如果按照這個上電時序要求進行,即可完成上電覆位;上述DVDD電源是由外部電路提供,該圖像芯片支持DVDD由內部自己產生,則上電時序有細微差別。

(2) 配置寄存器初始化

         該攝像頭模組的功能比較強大,例如VCM driver,環境光濾波,AEC/AGC,圖像採集格式等等,都是通過配置相關寄存器來實現的。對於寄存器的配置由主控芯片FPGA完成,通信接口爲SCCB接口,其本質可類比IIC接口,該接口時序見圖2所示。

根據實際用法來具體配置各個寄存器相應值,有些寄存器不容易理解可忽略。《OV5640_自動對焦照相模組應用指南(DVP_接口)__R2.13C》附錄1中驅動程序示例提供了常用的寄存器配置模板,可以複製和進行對應修改即可完成配置,見圖3所示。

(3) 圖像實時採集

        經過上述兩步完成後,可進行圖像視頻實時採集的具體實現。擬實現的視頻採集參數爲720P,60fps,圖像格式爲RGB565,由此可以算出PCLK時鐘頻率至少爲 PCLK = 1280*720*(16bit / 8bit)*60 = 110MHz,實際中會有一定比例的無效像素點採集,故PCLK實際工作頻率大於110MHz的。DVP接口時序見圖4所示。

        在視頻圖像數據實時採集到通過vga接口實時顯示鏈路中,如果二者數據流速率存在偏差,故需要中間加上圖像數據緩衝單元,從而保證每幀圖像完整採集後能完整顯示。圖像每個像素點爲16bit,計算可知,一幀有效圖像的數據量大小爲1280*720*16 = 15Mbit,一般的片內ram無法滿足,硬件採用DDR3芯片來作爲緩衝單元,並將DDR3的存儲空間分爲兩個子空間,每個子空間存儲一幀數據,實時乒乓操作進行切換。例如,當空間1進行採集的圖像數據寫入時,同時從空間2中讀取上一幀圖像數據輸出給VGA進行顯示,如此可以保證各幀之間切換無切換痕跡出現。故ddr3在配置時,分配P0,P1兩個64bit雙向端口,來實現二者同時讀寫操作。

        關於VGA接口,video graphic array 視頻圖形陣列,是一種基於模擬信號顯示,由IBM在1987年隨PS/2機一起推出的一種視頻傳輸標準,R,G,B管腳電壓範圍爲0.7V Vpp;故VGA接口需要匹配對應的DAC驅動芯片,其功能是將數字信號轉化爲電壓模擬信號,然後進行圖像顯示。如果爲了硬件設計簡單化,可以將VGA驅動芯片替換爲一組不同電阻網絡來實現採樣功能,電阻值的大小依次按照2的指數增長。例如數字信號的電源電壓爲3.3V,而R,G,B管腳電壓範圍爲0 - 0.7V Vpp,VGA接口源端和終端匹配電阻均爲75Ω,如圖5所示。

            

由此可知: 3.3V / (Rx + 75) = 0.7V / 75 。 可以算的:Rx 約爲500Ω。該方法具體實現可參考博文如下:

參考鏈接: https://www.cnblogs.com/spartan/archive/2011/08/23/2150660.html

        VGA接口協議可以參考手冊《VESA Display Monitor Timing Standard ©Copyright 1994-2004 Video Electronics Standards Association Ver 1.0, Rev. 1.0》,該手冊裏收錄了不同圖像幀格式下的各種水平和垂直參數值,參見圖6所示。

                                      

 

       最終,採集到的實時圖像截圖見圖7所示。

 

3.    總結

        經過一週的固件程序編寫及調試,終於實現了基於FPGA實現OV5640攝像頭的視頻圖像採集及VGA實時顯示這一功能。途中也遇到一些疑問,依次記錄見後文。OV5640的功能還是十分強大的,此時我只實現了基本功能。還有一些常用功能有待後續進行開發,例如自動對焦,進入預覽模式,如何實現單幀拍照模式等等。

       遇到的問題總結:

(1) 寄存器初始化時,感覺初始化成功,但是圖像是一片紅綠藍三色點,則表明iic時序存在細節問題;

(2) OV5640進行iic通信時,該芯片slave address從機地址如何確定,默認地址是0x78,看到好多人不知道如何獲取該地址,              其實OV5640的芯片手冊就已明確設定了,參見圖8所示。

(3)DDR3進行乒乓操作時,寫入攝像頭採集的數據到ddr中,使用的時鐘是PCLK; 從DDR中讀取單幀圖像數據通過VGA接口進行顯示,使用的時鐘信號是VGA_CLK,二者不是同一個時鐘。如果爲了簡便,均採用同一個片內時鐘源,則需要注意兩點:

其一是該時鐘信號clk_ddr頻率必須高於PCLK和VGA_CLK; 其二,由於ddr緩存模塊(clk_ddr時鐘),圖像採集模塊(PCLK時鐘),VGA顯示模塊(VGA_CLK時鐘)是不同時鐘域之間內部使能信號和數據信號的傳遞,因此需要進行不同時鐘域間的信號同步化,即用本模塊時鐘進行同步化操作。

(4) 視頻採集的圖像顯示時,紅色和藍色正好發生交換。如圖6中圓圈標記可知,牛奶盒上的紅色區域變爲藍色顯示,而對應的藍色區域變爲紅色顯示,正好出現了這一個好玩的bug。仔細分析程序時,發現OV5640攝像頭模組數據流輸出格式依次是B,G,R,我在編寫程序時,因疏忽默認按照R,G,B依次採集和存儲數據,故正好將藍色和紅色像素值交換了,造成圖像反色,一個小疏忽,弄出了一個找茬圖像,也算是一個小樂趣吧,在工程應用時應當避免這種錯誤。

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章