注:本博文的工程文件位于:
對(duì)于集FPGA和ARM于一體的Zynq系列平臺(tái)來(lái)說(shuō),圖像處理是Zynq平臺(tái)主要的應(yīng)用方向之一。圖像采集部分是圖像處理系統(tǒng)的重要組成部分,它通過(guò)圖像傳感器將外部的圖像信息采集進(jìn)來(lái),轉(zhuǎn)換為數(shù)字信號(hào)存儲(chǔ)到系統(tǒng)的幀存儲(chǔ)器中。目前在工業(yè)圖像采集領(lǐng)域,人們常用的兩種圖像傳感器為CCD與CMOS圖像傳感器。CCD一般輸出帶制式的模擬信號(hào),需要經(jīng)過(guò)視頻解碼器得到數(shù)字信號(hào)才能傳入控制器中,而CMOS圖像傳感器直接輸出數(shù)字信號(hào),可以直接與控制器進(jìn)行連接。隨著集成電路設(shè)計(jì)技術(shù)和工藝水平的提高,CMOS圖像傳感器像素單元的數(shù)量和采集速度都不斷增大。由于CMOS器件的高速性,近年來(lái),越來(lái)越多的高速圖像采集系統(tǒng)采用CMOS圖像傳感器作為圖像采集器件。
常用CMOS傳感器品牌以及選擇:
Sony: 日產(chǎn)CMOS,高靈敏度和低噪聲,偏重于攝影拍照,但開(kāi)發(fā)的參考資料比較少;
Aptina:CMOS系統(tǒng)按拍照架構(gòu)設(shè)計(jì),開(kāi)發(fā)流程較為繁瑣,且價(jià)格偏高,成像品質(zhì)性價(jià)比略高;
OmniVision:CMOS系統(tǒng)架構(gòu)最適合圖像采集,開(kāi)發(fā)資料較充足,各系列間兼容性好。
數(shù)字圖像采集平臺(tái)架構(gòu)如圖所示。系統(tǒng)通過(guò)CMOS傳感器OV7725將圖像高速采集進(jìn)Zedboard并存儲(chǔ)到BRAM,然后通過(guò)VGA控制模塊將圖像顯示出來(lái)。
我們要在Vivado中實(shí)現(xiàn)以下功能:
l 驅(qū)動(dòng)CMOS圖像傳感器OV7725,實(shí)現(xiàn)圖像采集;
l 將圖像存放到Block Ram中;
l 圖像的VGA顯示;
該實(shí)例將會(huì)涉及CMOS傳感器的接口及驅(qū)動(dòng)、CMOS圖像傳感器的寄存器參數(shù)配置、BRAM存放策略等方面。
1.OV7725的引腳以及驅(qū)動(dòng)
OV7725的引腳很多,但本系統(tǒng)中用到的OV7725模塊只包含以下一些引腳:
D0~D9: CMOS輸出的10位數(shù)據(jù)口.本實(shí)例只用到D2~D9。
RESET: CMOS輸入信號(hào),復(fù)位引腳,低電平有效。本實(shí)例將其置空
PWDN: CMOS輸入信號(hào),休眠模式選擇,0為正常模式,1為休眠模式。本實(shí)例將其置空
PCLK: CMOS輸出的像素時(shí)鐘
XCLK: CMOS輸入的時(shí)鐘信號(hào),本實(shí)例采用25MHz。
HREF: CMOS輸出的行同步信號(hào)
VSYNC: CMOS輸出的幀同步信號(hào)
SIOC: CMOS寄存器的IIC時(shí)鐘輸入
SIOD: CMOS寄存器的IIC數(shù)據(jù)輸入/輸出
因?yàn)橛玫降囊_數(shù)量并不多,因此我們選擇用Zedboard上JA,JB兩組Pmod接口與OV7725模塊相連。OV7725的驅(qū)動(dòng)包含兩個(gè)操作:1.配置寄存器 2.根據(jù)傳入的時(shí)序信號(hào)(PCLK,HREF,VSYNC),對(duì)傳入數(shù)據(jù)進(jìn)行拼接,組合成RGB像素。
n 配置寄存器
OV7725的正常工作需要寄存器的正確配置。寄存器的配置遵從IIC協(xié)議,在PL提供的IIC時(shí)鐘驅(qū)使下,向不同功能的寄存器地址寫入數(shù)據(jù)。本實(shí)例構(gòu)建了一個(gè)IIC的主模塊,寄存器配置指令只需要兩條即可:
0x1100;//11為CLKRC寄存器,設(shè)置為00值,采用內(nèi)部時(shí)鐘
0x1206;//分辨率設(shè)置為VGA 640x480,像素輸出格式設(shè)置為RGB565
n 拼接數(shù)據(jù)得到像素RGB565
OV7725像素格式為RGB565時(shí),時(shí)序圖如下:
當(dāng)幀同步信號(hào)VSYNC出現(xiàn)有效邊沿之后,在HREF為高電平時(shí),第一個(gè)PCLK上升沿讀取第一個(gè)byte(D7~D0)。此時(shí)要注意,這個(gè)byte并不代表第一個(gè)像素,而是第一個(gè)像素的R[4:0]以及G[5:3],第二個(gè)PCLK上升沿讀取的byte則是第一個(gè)像素的G[2:0]以及B[4:0]。當(dāng)?shù)诙€(gè)PCLK上升沿到來(lái)時(shí),將這兩個(gè)byte組合成一個(gè)完整的像素,就得到了第一個(gè)像素。以此類推,采集一行數(shù)據(jù)(640x2個(gè)數(shù)據(jù)),就得到640個(gè)像素值。當(dāng)采集完480行的時(shí)候,就完成了一幀數(shù)據(jù)的采集。
由OV7725的VGA時(shí)序可知,每一行有效時(shí)間為640x2個(gè)pclk,無(wú)效時(shí)間為144x2個(gè)pclk,每一行花費(fèi)時(shí)間為784x2個(gè)PCLK時(shí)鐘;而每一幀總行數(shù)是510(有效行數(shù)是480);因此采集一幀數(shù)據(jù)的時(shí)間是784*510x2個(gè)pclk的時(shí)間。
2.幀緩存(FrameBuffer)的實(shí)現(xiàn)
為了方便進(jìn)行顯示,以及后續(xù)的圖像處理,需要存儲(chǔ)采集的圖像。在vavado的IP catalog界面,在search 欄輸入block mem,下方ip列表會(huì)顯示出block memorygenerator,如圖所示:
雙擊上圖的藍(lán)色區(qū)域,打開(kāi)ip核定制界面。在Basic板塊的Memory Type選項(xiàng)設(shè)置成Simple dual portram,然后在port A options 的port A width 設(shè)置成48bit,depth設(shè)置成76800.“enable port type”設(shè)置成 always enabled。在port B options 的port B width 設(shè)置成12bit,此時(shí)dept會(huì)自動(dòng)設(shè)置成307200.同樣,“enable port type”設(shè)置成 always enabled。
那么,讀者朋友們會(huì)注意到剛才port A 的端口位寬是48bit。我們知道,要進(jìn)行vga顯示,zedboard的VGA部分R,G,B每個(gè)通道都是4bit,顯示一個(gè)像素需要12bit。因此,我們存儲(chǔ)一個(gè)像素采用的位寬也是12bit,一共存儲(chǔ)的像素?cái)?shù)量為640x480 = 307200個(gè)像素。既然這樣,那為什么存進(jìn)RAM的位寬不是12bit呢?這是因?yàn)椋琲p核的寫入端深度允許的范圍只有2-130172,而讀端口就沒(méi)有這種限制,為了存儲(chǔ)一幀圖像,存儲(chǔ)的位寬就需要增加。我們需要另寫一個(gè)像素整合存儲(chǔ)到ram的機(jī)制,使連續(xù)的四個(gè)像素在存儲(chǔ)之前先整合成一個(gè)12x4bit的變量。
OV7725的采集模塊代碼如下:
3.VGA顯示的實(shí)現(xiàn)
本實(shí)例中實(shí)現(xiàn)的VGA模塊頂視圖如圖所示:
VGA部分除了產(chǎn)生VGA信號(hào),將像素信號(hào)接到VGA的RGB三通道以外,還有一個(gè)比較重要的功能,就是產(chǎn)生讀frame buffer的地址信號(hào)frame_addr。
利用vga的列計(jì)數(shù)器和行計(jì)數(shù)器,可以輕松產(chǎn)生frame_addr:當(dāng)行計(jì)數(shù)器范圍在0-479,列計(jì)數(shù)器范圍在0-639時(shí),每來(lái)一個(gè)vga時(shí)鐘信號(hào),地址值加1。當(dāng)行計(jì)數(shù)值等于480時(shí),地址值清零。產(chǎn)生frame_addr的關(guān)鍵代碼如下:
4.具體實(shí)現(xiàn)步驟:
(1)啟動(dòng)Vivado2013.3,在工作目錄(例如D:xuped)下創(chuàng)建新工程Cam_OV7725_ImageShow.
(2)選擇RTL Project, target language選擇verilog, part orboard部分選擇xc7z020clg484-3,完成工程的創(chuàng)建
(3)添加verilog文件:在vivado主頁(yè)面左邊的project manager一欄,點(diǎn)擊Add Sources,,勾選Add Existing Block Design Source,選擇Add Files,添加/verilog_files文件夾下的所有v文件。記住勾選“Copy source into project”,如圖所示:
添加幀緩存ip核:點(diǎn)擊IP Catalog,在search欄輸入block mem,添加Block Memory Generator ip核,按照以下3圖設(shè)置ip參數(shù):
(4)添加時(shí)鐘ip核:在IP Catalog中的search欄輸入clock,選取clocking wizard ip核,雙擊進(jìn)入配置界面。元件名字改為clk_gen,在output clocks板塊增加兩個(gè)時(shí)鐘輸出:50MHz與25MHz,并勾去下方的reset與locked。如圖所示:
(4)添加引腳配置文件:再一次點(diǎn)擊Add Sources,,勾選Add or Create Constraints,選擇Add Files,添加/constraints文件夾下的zed.xdc文件。
(5)保存,點(diǎn)擊Generate Bitstream,綜合、實(shí)現(xiàn),生成bit文件。
系統(tǒng)調(diào)試及板級(jí)驗(yàn)證
將OV7725模塊連接到Pmod轉(zhuǎn)接板,轉(zhuǎn)接板連上Zedboard的JA,JB口,上電,然后下載bit文件。可以看到紅色的LED[0]亮起,說(shuō)明寄存器配置完畢,也可以按下BTNU按鍵再次進(jìn)行寄存器配置。通過(guò)VGA顯示器,可以看到OV7725采集到的圖像,如圖所示。
評(píng)論