本系統主要由FPGA主控模塊、圖像采集模塊、圖像存儲模塊以及圖像顯示模塊等模塊組成。其中圖像采集模塊選擇OV7670攝像頭模塊,完成對視頻圖像的采集和解碼功能,並以RGB565標准輸出RGB 5:6:5信號;圖像處理模塊選用的FPGA是Altera 公司生產的Cyclone IV EP4CE10F17C8芯片,完成對整個系統的控制,將采集到的視頻圖像數據處理、存儲以及發送到LCD顯示屏上。圖像存儲模塊使用256M存儲空間的SDRAM進行視頻圖像數據存儲。圖像顯示模塊采用TFT4.3寸LCD液晶顯示器顯示視頻圖像。編程語言采用VHDL語言。
由於LCD片內RAM太小,顯示不了這么大的分辨率圖像,因此,需要將圖像數據緩存到SDRAM當中。根據OV7670攝像頭VGA格式,即兩個字節共16位表示一位像素點。因此,以16位進行緩存到SDRAM當中。本FPGA使用的時鍾為50MHZ,芯片EP4CE10F17C8 片內自帶4個PLL(鎖相環),可以用於分頻和倍頻。因此,可以通過軟件進行設計。分頻為25MHZ用於液晶工作時鍾,24MHZ用於攝像頭工作時鍾。倍頻為100MHZ用於SDRAM工作時鍾。
第一部分攝像頭工作原理
OV7670攝像頭寄存器配置采用的通信方式為SCCB通信(兼容I2C通信),I2C通信方式和SCCB通信方式非常類似。IIC總線是philips公司推出的新一代串行通信標准總線。它僅靠兩根線實現全雙工通信:SDA(數據線),SCL(時鍾線)。I2C通信方式如下:
寫時序:
讀時序:
I2C時序讀寫分析:
1、start表示啟動總線:在時鍾SCL為高電平期間,數據線SDA由高電平拉低,啟動I2C總線。
2、device_id:I2C總線是個多主控總線,主機和任何一個從設備之間都可以形成主線,最后一位表示讀寫操作碼,0-寫,1-讀;(OV7670設備地址為0x42,即0x42為寫,0x43為讀)。
3、ack:寫操作碼發送完主機釋放總線,從機返回一個應答信號給主機表示寫入數據完成。
4、waddr:表示寄存器地址;raddr:表示寫對應的寄存器數據
5、wdata:表示寫寄存器數據;rdata:表示讀對應的寄存器數據。
6、stop:在時鍾SCL為高電平期間,數據線SDA由低電平拉高,關閉I2C總線。
7、由於I2C總線支持連續寫,故寫完地址之后不需要再發送起始信號,讀就需要重新發起始信號。
OV7670攝像頭的工作原理:
1、首先判斷攝像頭是否正常工作
通過讀取寄存器PID(廠商高位識別號)、VER(廠商低位識別號)、MIDH(廠商識別字節高位)、MIDL(廠商識別字節低位)的默認值來進行判斷攝像頭是否能夠正常工作。
PID地址為:0x0A,默認值為:0x76
VER地址為:0x0B,默認值為:0x73
MIDH地址為:0x0C,默認值為:0x7F
MIDL地址為:0x0D,默認值為:0xA2
2、當攝像頭正常工作后,進行攝像頭寄存器配置
主要是配置成以下模式:
VGA分辨率(640*480),RGB565模式,水平成像,關閉PLL分頻,直接使用外部時,PCLK正常模式,不分屏XCLK=PCLK,不設置彩條等等。
寄存器名稱 |
地址 |
數據 |
MIDH(只讀) |
0x0C |
0x7F(判斷是否相等) |
MIDL(只讀) |
0x0D |
0XA2(判斷是否相等) |
TSLB(寫) |
0x3A |
0x04 |
COM15 |
0x40 |
0xd0 |
COM7 |
0x12 |
0x04 |
…………………… |
||
COM11 |
0x3b |
0x42 |
通過I2C通信方式,讀取寄存器MIDH(廠商識別字節高位)、MIDL(廠商識別字節低位)的默認值來判斷攝像頭是否正常工作。然后配置寄存器。從寄存器TSLB到寄存器com11,一共配置了166個寄存器(詳細請見0V7670攝像頭數據手冊)。
3、攝像頭圖像數據的讀取
當完成對攝像頭寄存器配置后,就可以對攝像頭模塊進行圖像數據的采集。主要通過引腳HREF、VSYNC、PCLK、XCLK以及數據引腳data0~data7來對圖像數據進行讀取。
一行圖像數據獲取時序圖如下:
PCLK為像素時鍾,一個時鍾周期輸出一個字節的數據,由於前面將攝像頭分辨率配置為RGB565(640*480)格式,因此,前后兩個字節組成16位表示一個像素點。由於一行圖像數據有640個像素點,故需要讀取640*2個像素時鍾周期的數才表示一行圖像數據獲取完成。
一幀圖像數據獲取時序圖如下所示:
根據VGA格式,像素為640*480,因此,需要獲取完480行圖像數據才表示一幀。
第二部分:SDRAM工作原理
A0~A11:地址線(行列共用地址線),BA0~BA1:用來選擇L-BANK的地址線
SCLK:時鍾引腳,SCKE:時鍾有效引腳
nSCS:芯片選擇,nRAS:行地址選通引腳,nSCAS:列選通引腳,WE:寫允許
DQ0~DQ15為數據引腳。
SDRAM 並不像SRAM,可以在一個Cycle 內完成一個Access,SDRAM 的Accesses過程分做幾個Command,而且通常要3~7 個左右的Cycle 才能完成,我們需要執行一連串的動作才能開始讀寫:
1)初始化RAM 內的寄存器和存儲單元。
2)SDRAM Controller 接收到Data,分析Address,用高位的Address(Row address)進行Active 的動作。
3)SDRAM Controller 用低位Address(Column address) 進行WRITE 或READ。
SDRAM 根據Row address 和Column address 完成讀寫操作。
由於SDRAM 的電氣特性,每隔一段時間存儲單元的信息會衰減到無法辨認,所以一段時間之內,要執行Refresh 的動作,以確保信息的正確性,而執行這個動作是依靠Selfrefresh和Auto refresh 兩個Command 來完成的。下面具體講一下每個操作的特點及時序。
1、芯片初始化
在SDRAM 芯片內部還有一個邏輯控制單元,並且有一個模式寄存器為其提供控制參數。因此,每次上電時(開機時)SDRAM 都要先對這個控制邏輯核心進行初始化。有關預充電和刷新的含義在下文有講述,關鍵的階段就在於模式寄存器(MR,Mode Register)的設置,簡稱MRS(MR Set),寄存器的信息由地址線來提供。
本設計將模式寄存器配置為BA<=”00”,A<=”000000000000”;即:選擇突發讀突發寫操作模式、潛伏期保留、選擇順序傳輸的突發傳輸方式、突發長度為1。配置完成模式寄存器之后,就開始了進入正常的工作狀態。
2、行激活有效
初始化完成后,要想對一個L-Bank 中的陣列進行尋址,首先就要確定行(Row),使之處於活動狀態(Active),然后再確定列。雖然之前要進行片選和L-Bank 的定址,但它們與行有效可以同時進行。
從圖中可以看出,在CS#、L-Bank 定址的同時,RAS(Row Address Strobe,行地址選通脈沖)也處於有效狀態。此時An 地址線則發送具體的行地址。如圖中是A0-A11,共有12個地址線,由於是二進制表示法,所以共有4096 個行(2^12 =4096),A0-A11 的不同數值就確定了具體的行地址。行地址確定之后,就要對列地址進行尋址了。在SDRAM 中,行地址與列地址線是共用的。
因為沒有一個信號是發送讀或寫的明確命令的,而是通過芯片的可寫狀態的控制來達到讀/寫的目的。顯然WE#信號就是一個關鍵。WE#無效時,當然就是讀取命令。
SDRAM工作流程圖:
在實時視頻采集系統中,為了保證數據的穩定性和連續性,通常采用乒乓操作對SDRAM進行讀寫操作。
第三部分:LCD工作原理
LCD主要由垂直同步脈沖(VS)和水平同步脈沖(HS)來分別控制幀顯示與行顯示,總體時序圖如下:
掃描原理如下圖所示:
LCD驅動顯示時序圖如下:
設計兩個計數器來表示VS和HS,由於一幀圖像分辨率為640*480,因此,當HS=640時,表示一行圖像數據,接着VS加1,傳輸第二行圖像數據,當VS=480時,表示傳輸完一幀圖像數據。因此LCD就能夠顯示一幀圖像。
當需要從SDRAM讀取一個像素點時,需要LCD發送一個標志位到SDRAM,表示開始讀取圖像像素點開始顯示圖像。由於之前攝像頭配置的圖像模式為RGB565格式,16位表示一個像素點。也就是說R為高5位,G為中間6位,B為最低5位。由於LCDRGB分別為8位,因此,需要將一個像素點的16位拆開,分別送給LCD中的RGB上。其余位補0即可。