一、前言
目前FPGA用於圖像采集 傳輸 處理 顯示應用越來越多,主要原因是圖像處理領域的火熱以及FPGA強大的並行處理能力。本文以OV7725為例,對攝像頭使用方面的基礎知識做個小的總結,為后續做個鋪墊。
二、DVP及SCCB接口時序
下圖是OV7725 datasheet中攝像頭傳感器內部結構視圖。我們主要關注常用的用戶接口——DVP(數字視頻端口)。
XCLK:工作時鍾輸入,由主控器產生,頻率為24MHz;
HREF:行參考信號輸出;
PCLK:像素時鍾輸出,由XCLK產生,用於控制器采樣圖像數據;
VSYNC:場同步信號輸出;
RSTB:復位輸入,低電平有效;
PWDN:低功耗模式選擇輸入,正常工作期間需拉低;
SCL:SCCB管理接口時鍾,最高頻率400KHz;
SDA:SCCB接口串行數據總線;
D[9:0] 像素數據輸出;
PCLK引出一個幀率的概念,單位為fps(Frames Per Second),指每秒鍾輸出幾幅靜態圖像,幀率越高視頻越流暢。另外SCCB總線與IIC總線非常相近,主機寫時序基本一致,故多數圖像采集系統直接復用IIC控制器對圖像傳感器內部寄存器進行配置。這里給出大體的讀寫流程,具體見參考文獻2。需要格外注意的是,SIO_C時鍾信號在IDLE狀態下必須為高電平。
寫操作:
讀操作(分兩部分):
總結來說,SCCB與IIC的主要區別在以下兩點:
1 IIC有重復開始的概念,讀操作先寫設備地址 再寫寄存器地址,然后重新開始,寫設備地址,讀取數據。而SCCB讀操作時在第一次寫寄存器地址后必須有結束條件。
2 IIC主機寫數據到從機時,從機必須在寫8bit下一時鍾拉低總線響應主機。IIC主機讀取從機數據時,多字節連續讀取除最后字節主句均在第9時鍾周期拉低總線響應,單字節讀取拉高總線便於下一拍提供停止條件。而SCCB每個phase第9bit為don't care bit /NACK,主機寫從機第9bit不關心,讀取從機數據由於不支持多字節操作第9bit主機必須拉高總線。
接下來從整體上把握輸出圖像數據與同步信號的關系。(圖片截取自《OV7725攝像頭編程基本知識筆記》,見參考文獻3.
兩個VSYNC高脈沖之間為包含一幀圖像數據,但只有HREF高電平期間數據才為有效數據,每個HREF高電平區間對應一行圖像數據。因此通過這兩個信號即可找到有效的圖像數據。OV7725攝像頭支持多種圖像輸出格式,此處闡述常用的RGB565格式:
圖像數據在PCLK下降沿輸出,控制器在其上升沿采樣。當選擇此模式輸入時,僅使用數據線高八位。時序圖給出了相鄰兩個字節數據內容,可見兩個字節表示一個像素點數據,從高位到低位依次是:R 5bit,G 6bit,B 5bit。Ov7725圖像傳感器的像素30萬,分辨率:640*480,即每行640個有效像素點,一共480行。所以每個HREF高脈沖期間有640*2個PCLK周期,兩個VSYNC高脈沖期間循環480次。
三、時鍾與幀率計算
攝像頭輸入時鍾是XCLK,輸出時鍾是PCLK。如何給出合理的XCLK並得知PCLK頻率至關重要。在datasheet中給出了詳細的寄存器配置介紹,其中地址是0X0D和0X11的兩個寄存器與時鍾密切相關。寄存器CLKRC決定如何分頻,公式如下:f internal clock = f input clock * PLL multiplier / [(CLKRC[5:0]+1)*2] 。我也是看了半天的相關資料才知道f internal clock指的就是攝像頭輸出的PCLK。公式中f input clock指的是XCLK頻率,PLL multiplier只COM4寄存器配置的PLL倍頻系數。
比如配置寄存器COM4為0X41,配置CLKRC為0X00。因此,f pclk = f xclk * 4 / [(0+1)*2] = 2 f xclk。此時XCLK時鍾頻率若是25MHZ,則PCLK頻率是50MHZ。現在我們以筆者選用的VGA幀格式,RGB565像素格式來算一下幀率。
幀率即為每秒鍾輸出多少幅完整圖像,所以幀率=輸出時鍾頻率/每幀的時鍾周期數。最終幀率=50*10^6/(510*784*2) = 62.5Hz。一般人眼在幀率為50Hz以上無法察覺圖像的閃動,具有較好的顯示效果。
參考文獻
1 ov7725手冊(可注釋)_圖文_百度文庫 https://wenku.baidu.com/view/3e5504004431b90d6c85c764.html
2 OV7725學習之SCCB協議(一) - aslmer - 博客園 https://www.cnblogs.com/aslmer/p/5965229.html
3 ov7725數字攝像頭編程基本知識筆記_圖文_百度文庫 https://wenku.baidu.com/view/d1af7a731711cc7931b716c6.html
4 ov7725圖像幀率計算公式總結 - yinjia002的博客 - CSDN博客 https://blog.csdn.net/yinjia002/article/details/79163784
5 OV7725的幀率和PCLK寄存器設置 - m0_37170593的博客 - CSDN博客 https://blog.csdn.net/m0_37170593/article/details/73918403