本原創教程由芯驛電子科技(上海)有限公司(ALINX)創作,版權歸本公司所有,如需轉載,需授權并注明出處(http://www.alinx.com)。
1. 實驗簡介
本實驗將采用500萬像素的OV5640攝像頭模組(模塊型號:AN5640)為大家顯示更高分辨率的視頻畫面。OV5640攝像頭模組最大支持QSXGA (2592x1944)的拍照功能,支持1080P、720P、VGA、QVGA視頻圖像輸出。本實驗將OV5640配置為RGB565輸出,先將視頻數據寫入外部存儲器,再從外部存儲器讀取送到VGA、LCD等顯示模塊。
2.實驗原理
2.1 OV5640傳感器簡介
OV5640攝像頭模組采用美國OmniVision(豪威)CMOS芯片圖像傳感器OV5640,支持自動對焦的功能。OV5640芯片支持DVP 和MIPI 接口,本實驗所用 OV5640攝像頭模組通過DVP接口和FPGA連接實現圖像的傳輸。
2.2 OV5640的參數說明
像素:硬件像素500W;
感光芯片:OV5640;
感光尺寸:1/4;
功能支持:自動對焦, 自動曝光控制(AEC),自動白平衡(AWB);
圖像格式 : RAW RGB, RGB565/555/444, YUV422/420和JPEG壓縮;
捕獲畫面:QSXGA(2592x1944), 1080p, 1280x960, VGA(640x480), QVGA(320x240);
工作溫度:-30~70℃, 穩定工作溫度為0~50℃
2.3 OV5640的寄存器配置
OV5640的寄存器配置是通過FPGA的I2C(也稱為SCCB接口)接口來配置。用戶需要配置正確的寄存器值讓OV5640輸出我們需要的圖像格式,實驗中我們把攝像頭輸出分辨率和顯示設備分辨率配置成一樣的, OV5640的攝像頭輸出的數據格式在以下的0x4300的寄存器里配置,在我們的例程中OV5640配置成RGB565的輸出格式。
關于OV5640的寄存器還有很多很多,但很多寄存器用戶無需去了解,寄存器的配置用戶可以按照OV5640的應用指南來配置就可以了。如果您想了解更多的寄存器的信息,可以參考OV5640的datasheet中的寄存器說明。
2.4 OV5640的RGB565輸出格式
OV5640在HREF信號為高時輸出一行的圖像數據,輸出數據在PCLK的上升沿的時候有效。因為RGB565顯示每個像數為16bit, 但OV5640每個PCLK輸出的是8bit,所以每個圖像的像數分兩次輸出,第一個Byte輸出為R4~R0和G5~G3, 第二個Byte輸出為G2~G0和B4~B0,將前后2個字節拼接起來就是16Bit RGB565數據。
3. 程序設計
前面的實驗已經為本實驗做了大量的鋪墊,包括I2C寄存器的配置、外部存儲器的讀寫,本程序一個比較關鍵的地方在于視頻同時讀寫,如何做到讀寫不沖突?在設計幀讀寫模塊時就已經考慮到這點,所以有幀基地址選擇,最大4幀選擇,每次讀視頻幀地址和正在寫的幀地址是不同的,而是上次寫入一幀數據的地址,這樣就可以避免讀寫沖突,避免視頻畫面裂開錯位。
cmos_8_16bit模塊完成攝像頭輸入的2個8bit數據轉換到一個16bit數據(一個像素),數據位寬變成2倍,時鐘頻率不變,所以16bit數據是隔一個時鐘周期有效,并不是每個時鐘一直有效。
信號名稱 | 方向 | 說明 |
rst | in | 異步復位輸入,高復位 |
pclk | in | 傳感器像素時鐘輸入 |
pdata_i | in | 傳感器8bit數據輸入 |
de_i | in | 數據有效(HREF) |
pdata_o | out | 16bit數據輸出 |
hblank | out | de_i延時一個時鐘周期 |
de_o | out | 數據輸出有效 |
cmos_8_16bit模塊端口
cmos_write_req_gen模塊通過判斷攝像頭的列同步信號cmos_vsync的上升沿,生成ov5640數據寫入的請求信號,表示一幀圖像開始寫入請求。另外生成write_addr_index寫地址選擇和read_addr_index讀地址選擇,這里read_addr_index的值會比write_addr_index的值延遲一幀,使得讀和寫的地址不沖突。
信號名稱 | 方向 | 說明 |
rst | in | 異步復位輸入,高復位 |
pclk | in | 傳感器像素時鐘輸入 |
cmos_vsync | in | 場同步輸入,每一幀視頻都會變化一次,可以用于一幀的開始或結束 |
write_req | out | 寫數據請求 |
write_addr_index | out | 寫幀地址選擇 |
read_addr_index | out | 讀幀地址選擇 |
write_req_ack | in | 寫請求應答 |
cmos_write_req_gen模塊端口
frame_read_write模塊我們已經在前面的例程中使用過,在這里就是把攝像頭采集的數據存入寫FIFO里,然后產生DDR3的Burst寫請求,寫入到DDR3中,另外讀也是一樣,當讀FIFO里的數據小于一定值時,產生DDR3的Burst讀請求。在這里我們實例化了2個frame_read_write模塊,分別對應2路視頻的數據存儲和讀取。這里每路視頻的DDR3的存儲地址是不一樣的。
第一路視頻的存儲地址如下:
第二路視頻的存儲地址如下:
video_rect_read_data模塊功能跟HDMI字符顯示osd_display模塊的功能類似,本例程中是把從DDR3里讀取的視頻圖像跟彩條圖像疊加,因為ax7035使用的是雙目攝像頭,所以需要調用2個video_rect_read_data模塊。
信號名稱 | 方向 | 說明 |
video_clk | in | 視頻的像素時鐘 |
rst | in | 復位信號 |
video_left_offset | in | 視頻顯示的水平偏移地址 |
video_top_offset | in | 視頻顯示的垂直偏移地址 |
video_width | in | 視頻的寬度 |
video_height | in | 視頻的高度 |
read_req | out | 讀一幀圖像數據請求 |
read_req _ack | in | 讀請求應答 |
read_en | out | 讀數據使能 |
read_data | in | 讀到的數據 |
timing_hs | in | 輸入的行同步信號 |
timing_vs | in | 輸入的列同步信號 |
timing_de | in | 輸入的數據有效信號 |
timing_data | in | 輸入的數據信號 |
hs | out | 輸出的行同步信號 |
vs | out | 輸出的列同步信號 |
de | out | 輸出的數據有效信號 |
vout_data | out | 輸出的數據信號 |
4. 實驗現象
1)將攝像頭模塊插入開發板,保證1腳對齊,1腳在焊盤形狀和其他引腳是有明顯區別的,是方形的。
AN5640攝像頭模塊連接開發板連接圖
AN5642攝像頭模塊連接開發板連接圖
2)如果使用HDMI來顯示,連接好HDMI顯示器,如果使用液晶屏顯示,插入液晶屏模塊,連接方法在《HDMI測試實驗教程》中已講述。
3)下載實驗程序,可以看到攝像頭模塊輸出的視頻。注意:ov5640模塊焦距是可調的,如果焦距不合適,圖像會模糊,旋轉鏡頭,可以調節焦距。攝像頭模塊要輕拿輕放,不要用手觸摸元器件。
實驗效果圖
-
FPGA
+關注
關注
1630文章
21797瀏覽量
606014 -
視頻
+關注
關注
6文章
1956瀏覽量
73141 -
攝像頭
+關注
關注
60文章
4862瀏覽量
96311 -
OV5640
+關注
關注
1文章
19瀏覽量
14201 -
紫光同創
+關注
關注
5文章
88瀏覽量
27560
發布評論請先 登錄
相關推薦
評論