基於FPGA的OV7670驅動--第1部分


基於FPGA的OV7670驅動--第1部分

ov7670圖像傳感器介紹

ov7670簡介

3 ov7670實物圖

ov7670,CMOS圖像傳感器,體積小,工作電壓低,提供單片VGA攝像頭和影像處理器的所有功能。通過SCCB總線控制,可以輸入整幀、子采樣、取窗口等方式的各種分辨率8位影像數據。該產品VGA圖像最高達到30幀/秒。用戶可以完全控制圖像質量、數據格式和傳輸方式。所有圖像處理功能過程包括伽瑪曲線、白平衡、飽和度、色度等都可以通過SCCB接口編程。OmmiVision圖像傳感器應用獨有的傳感器技術,通過減少或消除光學或電子缺陷如固定圖案噪聲、托尼、浮散等,提高圖像質量,得到清晰的穩定的彩色圖像。

ov7670引腳定義

4 ov7670引腳分配圖

表 1列出了ov7670主要的引腳說明,在實際的應用中,FPGA主要控制這些引腳進行ov7670驅動以及數據采集。

 

編號

引腳名稱

輸入/輸出

描述

1

XCLK

輸入

系統時鍾輸入

2

SIO_C(SCL)

輸入

SCCB時鍾口

3

SIO_D(SDA)

輸入

SCCB數據口

4

PCLK

輸出

像素時鍾

5

VSYNC

輸出

幀同步

6

HREF

輸出

行同步

7

D7

輸出

數據位7

8

D6

輸出

數據位6

9

D5

輸出

數據位5

10

D4

輸出

數據位4

11

D3

輸出

數據位3

12

D2

輸出

數據位2

13

D1

輸出

數據位1

14

D0

輸出

數據位0

1 ov7670主要引腳說明

ov7670視頻口有八根數據線, D[7:0],它支持的數據格式有8位 RGB raw 輸出, 8位

YcbCr 輸出, 8位 RGB 565/555/444 輸出。

行同步信號 Href 和 Hsyn 是用同一引腳(Href pin)輸出,通過寫SCCB寄存器,可

選擇這個引腳作為 Href 或hsyn信號。

SCCB總線 SIO_C 和SIO_D應外加上拉電阻,典型值是4.7K。

RESET#低有效,可由GPIO控制,若不使用時可連到DOVDD。如果RESET#連到DOVDD,必須通過寫SCCB寄存器來進行軟件復位。

ov7670注意事項

  1. PWDN不用時,應接地, RESET不用時,應拉高。
  2. SENSOR模擬電壓(AVDD)是2.7V。
    1. SENSOR核心電壓(DVDD)是1.8V。
    2. SENSOR輸入輸出數字電壓(DOVDD)是1.7V到3.0V。
    3. SENSOR的AGND和DGND在模組內部應分開,在模組PCB外面才可連到一起

      (模組內部不可連在一起)。.

    4. C1應靠近SENSOR的VREF1和AGND。
    5. C2應靠近SENSOR的AVDD和AGND。
    6. C3應靠近SENSOR的VREF2和AGND。
    7. C4應靠近SENSOR的DVDD和DGND。
    8. C5應靠近SENSOR的DOVDD和DGND。.
    9. D7-D0是模組YUV和RGB 8-bit輸出格式時,八位數據線。
    10. SIO_C(SCL)和SIO_D(SDA)需外加上拉電阻,ov7670硬件並沒有附加,所以在開

      發板接口上必須外加4.7K的電阻。

  3. 一般攝像頭出現問題,無法正常工作,有很大的可能是因為VSYNC和HREF出

    現問題。

     

    時序特性

     

    5 ov7670輸出數據時序圖

    計算PCLK的參數,如下所示:

    VSYNC510*Line = 3*tLine + 17*tLine + 480*tLine

    HERF: 784*tP = 640*tP + 144*tP

    HSYNC: 784*tP = 80*tP +45*tP +640*tP +19*tP

    VGA RGB565YUV422 30fps:

    PCLK = 784 * 510 * 30 * 2(byte) =23990400 =24MHz

    因此手冊才推薦24MHz的XCLK輸入。

    注:30fps代表一秒30幀數據,即30張相片。

     

    ov7670的分辨率為640*480,即一張有效的圖片上有640*480個像素,每個像素都是2個字節的數據(16位)。但實際上是有784*510個像素,那些沒有使用到的像素為無效像素,不過輸出這些數據也是需要時間的。FPGA是根據VSYNC和HREF來提取有效的數據(VSYNC低電平和HREF高電平下)。

    ov7670的工作頻率最小值為10MHz到48MHz,其中典型值為24MHz。在我們實際使用中,使用的頻率為25MHz,原因是我們需要通過VGA把圖像顯示到顯示器上,由於顯示器的顯示頻率為25MHz,所以選用25MHz。大概31fps。

     

    下面是實際驅動中使用SignalTap II進行測試的實際波形圖,如圖 6。

    6 SignalTap II測試圖

     

     

    通過實際測試,總結了ov7670的時序特點:在25MHz的系統時鍾下,每兩個時鍾為一個像素點數據,例如圖 6中A4h和F4h為一行里第一個像素點數據(兩個字節),由此實現數據的高速采集。時序和數據有以下特點:當數據有效時,coms_herf信號線應為高電平,coms_vsync信號線應為低電平;時鍾coms_pclk(coms_xclk)的上升沿都對應着數據的穩定期,此時可用來做數據采集;數據無效時,coms_data的數據應為0;由於SCCB用於初始化,配置時間很快,所以sccb_sclk和sccb_sdata無法觀察到,但最終狀態sccb_sclk應為高電平,sccb_sdata應為低電平。

通過對ov7670寄存器進行配置,可以任意選擇攝像頭輸出的數據格式,如RGB565或YUV422。如何配置寄存器在后面SCCB初始化中有講述。圖 7為RGB565的數據輸出時序,注意PCLK的上升沿對應着數據的穩定期,可以做數據提取。

7 RGB565的輸出時序

 

數據格式說明

RGB565

RGB色彩模式是工業界的一種顏色標准,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標准幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。RGB圖像只使用三種顏色,就可以使它們按照不同的比例混合,在屏幕上重現多種顏色。

RGB是從顏色發光的原理來設計定的,通俗點說它的顏色混合方式就好像有紅、綠、藍三盞燈,當它們的光相互疊合的時候,色彩相混,而亮度卻等於兩者亮度之總和,越混合亮度越高,即加法混合。有色光可被無色光沖淡並變亮。如藍色光與白光相遇,結果是產生更加明亮的淺藍色光。紅、綠、藍三盞燈的疊加情況,中心三色最亮的疊加區為白色,加法混合的特點:越疊加越明亮。

RGB565即圖像使用RGB色彩模式,有R(red),G(green),B(blue)三種顏色元素,使用16位表示一個像素。這16位中的5位用於R6位用於G5位用於B,用兩個字節(一個字)表示一個像素。RGR565可以最多顯示出65536種顏色(2^16 = 65536)。當讀出一個像素后,這個字如圖 8所示。在ov7670中,可以通過寄存器配置,把ov7670輸出的圖像數據格式設置為RGB565,配置過程在后面教程會有所提及。

8 RGR565格式數據流

 

YUV422

YUV模式是被歐洲電視系統所采用的一種顏色編碼方法(屬於PAL),是PAL和SECAM模擬彩色電視制式采用的顏色空間。在現代彩色電視系統中,通常采用三管彩色攝影機或彩色CCD攝影機進行取像,然后把取得的彩色圖像信號經分色、分別放大校正后得到RGB,再經過矩陣變換電路得到亮度信號Y和兩個色差信號U、V,最后發送端將亮度和色差三個信號分別進行編碼,用同一信道發送出去。這種色彩的表示方法就是所謂的YUV色彩空間表示。采用YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。另外,還有YCbCr模式,YCbCr模式來源於YUV模式,兩者接近,在不嚴格區分下,可以認為相同。

在我們實際應用中,提取的是其中的視頻數據。這段數據就相當RGB565的數據一樣。一個Y元素代表一個像素,Y代表亮度,UV代表色差。Y,U,V都是8為數據。圖 9中的視頻數據有720個Y元素,在ov7670中應該只有640個有效Y元素。

YUV信號有很多種,一般YUV420YUV422用的比較多,YUV422格式,又分為很多小類,按照UV的排列可以有YUYV,YVYU,UYVY,VYUY四種,這四種格式在ov7670中同樣可以通過寄存器進行配置,在后面教程有所提及。

假如有一幅640×480的圖片,用YUV422來表示,那么,采樣方式就是每個像素采樣Y信號,U,V信號隔一個采樣,這樣算下來,就有640×480Y,640×240U,640×240V,一幅640×480大小的YUV圖片占的總字節數為640×480×2個字節,每像素2個字節,也就是16位。

在內存種這樣排列:Y0U0Y1V0 Y2U1Y3V1...

第一個像素的YUV值為: Y0 U0 V0

第二個像素的YUV值為: Y1 U0 V0

第三個像素的YUV值為: Y2 U1 V1

.....

其他以此推類,也就是說每兩個像素是共用了UV的;在一行上來看,每個像素的YUV值中Y值被采樣,UV值采樣第一個像素后,跳到第三個像素,然后第五個像素,所以每行上Y640個,U,V320個。

9 YUV422格式數據流

 

 

SCCB初始化

ov7670初始化需要對內部的寄存器進行配置,配置的方式是通過FPGA對ov7670進行數據讀寫,其中涉及到的協議為SCCB。其實,SCCB與I2C很接近,寫入的時序一樣,讀取有一點差別。先寫入設備地址,然后寄存器地址,最后是寄存器的值。ID_Address + SUB_Address +W_Data(ov7670的設備地址為0x42,最后一位用來讀寫,讀則為0x43)。對ov7670的初始化,也是FPGA驅動ov7670的關鍵。FPGA對ov7670的驅動設計框圖如圖 10,主要分為三大模塊:1.主控器、2.ov7670寄存器配置庫、3.SCCB接口。

 

10 FPGA驅動ov7670設計框圖

 

先再次簡述下I2C協議:在I2C總線傳輸過程中,將兩種特定的情況定義為開始和停止條件(見下圖):當SCL保持"高"時,SDA由"高"變為"低"為開始條件;當SCL保持"高"且SDA由"低"變為"高"時為停止條件。開始和停止條件均由主控制器產生,如圖 11所示。使用硬件接口可以很容易地檢測到開始和停止條件,沒有這種接口的微機必須以每時鍾周期至少兩次對SDA取樣,以檢測這種變化。

 

11 I2C開始與結束狀態的定義

 

 

 

SDA線上的數據在時鍾"高"期間必須是穩定的,只有當SCL線上的時鍾信號為低時,數據線上的"高"或"低"狀態才可以改變。輸出到SDA線上的每個字節必須是8位,每次傳輸的字節不受限制,但每個字節必須要有一個應答ACK。如果一接收器件在完成其他功能(如一內部中斷)前不能接收另一數據的完整字節時,它可以保持時鍾線SCL為低,以促使發送器進入等待狀態;當接收器准備好接受數據的其它字節並釋放時鍾SCL后,數據傳輸繼續進行。   

數據傳送具有應答是必須的。與應答對應的時鍾脈沖由主控制器產生,發送器在應答期間必須下拉SDA線。當尋址的被控器件不能應答時,數據保持為高並使主控器產生停止條件而終止傳輸。在傳輸的過程中,在用到主控接收器的情況下,主控接收器必須發出一數據結束信號給被控發送器,從而使被控發送器釋放數據線,以允許主控器產生停止條件。   

I2C總線在開始條件后的首字節決定哪個被控器將被主控器選擇,例外的是"通用訪問"地址,它可以在所有期間尋址。當主控器輸出一地址時,系統中的每一器件都將開始條件后的前7位地址和自己的地址進行比較。如果相同,該器件即認為自己被主控器尋址,而作為被控接收器或被控發送器則取決於R/W位。

12與圖 13分別為I2C寫入與讀出的時序圖。

 

圖 12 I2C寫入時序

 

13 I2C讀出時序

 

ov7670的初始化是FPGA驅動ov7670的關鍵,ov7670初始化需要對內部的寄存器進行配置,配置的方式是通過FPGA對ov7670進行數據讀寫,其中涉及到的協議為SCCB。SCCB與I2C相比,寫入的時序一樣,但讀取有點差別。先寫入設備地址,然后寄存器地址,最后是寄存器的值。如圖 14,ID_Address + SUB_Address +W_Data(ov7670的設備地址為0x42,最后一位用來讀寫,讀則為0x43)。

 

14 SCCB寫入時序圖

 

 

 

讀取設計與寫入設計有些類似。在讀取中,在發送設備地址、指定寄存器地址之后,還需要發次發送設備地址,才能讀取指定寄存器的數據。在Verilog設計中,主要分成第一次指定寄存器,第二次讀取寄存器數據兩個步驟,如圖 16。其實,讀取設計在本系統中作用不大,僅僅用於讀取COMS圖像傳感器的廠商識別或者產片標志。

16 SCCB讀取時序圖

寄存器配置

對ov7670的初始化,其實就是通過SCCB對ov7670進行寄存器的配置。這些寄存器的大概有100多個,都對應着相應的功能。但其實一般情況下,實際用到的可能就是十幾二十個,其他用默認值,具體可以看datasheet。在之前的FPGA驅動ov7670框圖中,主控制器調用寄存器配置庫,然后把數據送到SCCB上。在寄存器配置庫這部分上,實際是采用了一個查找表設計,先把對應好的寄存器編號和寄存器需要配置好的值合並好(16位數據),然后跟着順序一個一個的讀取。圖 18列出了主要需要配置的寄存器。

具體每一個寄存器對應的配置內容可以查看官方的datasheet,接下來列出幾個比較重點的寄存器。之前所說的如何設置RGB565YUV422格式就是修改以下對應的寄存器的值實現的。

  1. 復位,選擇圖像輸出的模式,如YUV422 或者 RGB565。如表 2所示。

    2 12號寄存器配置內容

     

    1. 時鍾輸入設置。例程中ov7670使用的是FPGA輸出的25MHz,為外部時鍾。如表 3 所示。

    3 11號寄存器配置內容

  2. PLL寄存器配置。這里可以使用PLL對外部時鍾進行倍頻。如表 4所示。

    4 6B號寄存器配置內容

    1. PCLK像素時鍾設置。通過這個寄存器的配置,可以改變采樣時鍾,同時改變輸出圖像的大小。這個寄存器的配置,還和73號寄存器有關。如表 5和表 6所示。

    5 3E號寄存器配置內容

    6 73號寄存器配置內容

    1. 設置YUV格式。這里需要3A號寄存器和3D寄存器配合,才能輸出固定的序列。如表 7和表 8所示。

    7 3A號寄存器配置內容

    8 3D號寄存器配置內容

  3. 設置數據位RGB565為00-FF,YUV必須為01-FE或者更小。如表 9所示。

    9 40號寄存器配置內容

     

     

     

    例程解析

    攝像頭接口原理圖

    在配套的ov7670驅動例程中,共有6個verilog文件,如圖 19所示。這6個文件組成了整個ov7670的驅動模塊,

     

    其中可以分為兩部分,一部分是時鍾PLL模塊(ov7670_pll),另一部分是純驅動模塊(ov7670_drive_top),如圖 20所示。圖 21則為純驅動模塊內部的模塊組成(ov7670_sccb_contronler模塊,ov7670_sccb模塊,ov7670_register_config模塊,ov7670_pretreatment模塊),前三個模塊正是對應之前教程SCCB初始化的ov7670的驅動設計三大模塊。

    圖 20 ov7670驅動頂層模塊

    圖 21 ov7670純驅動模塊

    接下來,我們對每個模塊做解釋說明,如表 10所示。

    序號

    模塊名

    功能描述

    1

    ov7670_pll

    本模塊主要把外部時鍾(50MHz)經PLL分配得到25MHz的ov7670驅動時鍾drive_sys_clk。

    2

    ov7670_drive_top

    本模塊是整個ov7670驅動及數據預處理的頂層模塊。

    3

    ov7670_sccb_controler

    本模塊是ov7670驅動sccb協議的主控部分(主控+寄存器配置+sccb協議),主要實現的功能是對寄存器模塊的調用以及對sccb協議模塊的反饋信號進行相應操作。

    4

    ov7670_register_config

    本模塊是ov7670驅動sccb協議的寄存器配置部分(主控+寄存器+sccb協議),主要實現的功能是根據主控模塊進行操作,對ov7670內部寄存器進行配置,並將配置完的數據發送給sccb協議模塊處理並最終輸出給ov7670。

    5

    ov7670_sccb

    本模塊是ov7670驅動sccb協議的sccb協議驅動的部分(主控+寄存器+sccb協議),主要實現的功能是完成sccb協議的模擬,把寄存器配置部分的數據即SDATA寫入ov7670.另外也可以完成對ov7670的數據讀取。最終完成對ov7670初始化。

    6

    ov7670_pretreatment

    本模塊完成的功能主要是對ov7670采集后數據進行預處理,因為ov7670一開始出來的10幀數據可能不穩定,所以把前10幀數據除去再接收,同時把8位數據合成為16位。這部分涉及到ov7670時鍾信號和數據信號一些時序的問題。

    表 10 例程各模塊說明

    在例程中,我們還使用了SignalTapII 來觀察FPGA開發板對ov7670的驅動情況。

    嵌入式邏輯分析儀測試結果如下

     

    https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-24211932856.7.489d7241aCjspB&id=35795666317


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM