韓 眾, 李智中, 曹 飛
(1.中北大學(xué)儀器與電子學(xué)院, 山西 太原 030051;2.北京航天長征飛行器研究所, 北京 100076)
隨著圖像設(shè)備廣泛應(yīng)用于社會的各行各業(yè),圖像數(shù)據(jù)的傳輸、存儲問題也越來越被人們關(guān)注研究,以期獲得高速傳輸、大容量存儲的方案[1]。本文以SDRAM為存儲介質(zhì),通過FPGA控制實現(xiàn)CMOS攝像頭的圖像獲取,SDRAM的圖像數(shù)據(jù)緩存,VGA對采集圖像的實時顯示,數(shù)據(jù)傳輸速率可達(dá)到32 MB/s,并設(shè)計了圖像數(shù)據(jù)的乒乓式存儲方式,實現(xiàn)了CMOS圖像的SDRAM存儲與VGA實時顯示。
設(shè)計實現(xiàn)過程如圖1所示,系統(tǒng)上電后,程序先利用SCCB協(xié)議接口對CMOS OV7670攝像頭的寄存器進(jìn)行了配置,配置完成后OV7670模塊就可以穩(wěn)定、持續(xù)地輸出采集到的圖像數(shù)據(jù);然后將圖像數(shù)據(jù)通過WFIFO緩存寫入到SDRAM中,再通過RFIFO緩存讀出圖像數(shù)據(jù)到VGA顯示器中顯示。程序中SDRAM讀和寫操作采用“乒乓結(jié)構(gòu)”解決圖像拖影的問題,當(dāng)攝像頭采集的數(shù)據(jù)寫入到SDRAM的Bank0時,VGA從SDRAM的Bank3讀取數(shù)據(jù)顯示。當(dāng)攝像頭的一幀圖像寫入完成后,SDRAM讀和寫的Bank交換。
CMOS攝像頭圖像采集的設(shè)計包括兩部分:SCCB協(xié)議接口時序;RGB圖像數(shù)據(jù)輸出時序。
圖1 設(shè)計總體實現(xiàn)過程
SCCB協(xié)議是用于配置OV系列攝像頭的專屬總線。SCCB是一種3線的總線,它由SCCB_E、SIO_C、SIO_D組成。在為了減少引腳的芯片上縮減為2根線:SIO_C和SIO_D。
SCCB協(xié)議接口配置過程[2]:由三個階段寫完畢一個地址,第一階段:發(fā)送設(shè)備的ID地址(ID Address);第二個階段:發(fā)送此次所發(fā)數(shù)據(jù)的目的地寄存器地址(Sub_address);第三階段:發(fā)送要寫入的數(shù)據(jù)。這里類似突發(fā)傳輸,即如果要在連續(xù)的寄存器中寫數(shù)據(jù),那么一個寄存器寫入值后,地址指針自動加1,自動跳過上述的第一個階段。設(shè)計中使用的CMOS攝像頭OV7670模塊就是如此配置的。
設(shè)計中調(diào)用SCCB協(xié)議接口的通信程序配置了OV7670攝像頭的169個寄存器,其中前19個寄存器需要根據(jù)實際情況配置,其余的寄存器全部使用默認(rèn)參數(shù),最終結(jié)果是配置成RGB565 30fs數(shù)據(jù)輸出格式、水平鏡像、調(diào)用外部時鐘、使用內(nèi)部電源、沒有設(shè)置彩條。
CMOS攝像頭 OV7670感光陣列:640×480,圖像分辨率:30萬像素,采集速率:30 fps VGA,輸出數(shù)據(jù)信號類型:8位數(shù)字信號,設(shè)計中配置的輸出格式:RGB565。
OV7670 RGB565模式下的時序,OV7670在HREF信號為高電平時輸出一行的圖像數(shù)據(jù),圖像數(shù)據(jù)在PCLK的上升沿的時候有效。因RGB565顯示模式下每個像素為16 bits,而OV7670每個PCLK驅(qū)動8 bit,故每幀圖像的每個像素分兩次輸出,第一個 Byte為 R4~R0 和 G5~G3,第二個 Byte為 G2~G0和B4~B0,總共是16 bits的RGB顏色信息[3]。
設(shè)計功能實現(xiàn)后,使用Quartus 13.1軟件的仿真工具Signaltap對行有效信號(CMOS_HREF)、場有效信號(CMOS_VSYNC)、數(shù)據(jù)輸出信號(CMOS_i-DATA)進(jìn)行了聯(lián)合硬件仿真,以驗證時序設(shè)計的正確性。
仿真結(jié)果表明,在幀有效信號(Frame_vaild)為高電平時,系統(tǒng)穩(wěn)定接收圖像;場有效信號(CMOS_VSYNC)為低時,表示一場圖像掃描還未完成,那么在PCLK脈沖持續(xù)輸出情況下,行有效信號(CMOS_HREF)為高時,輸出一行有效的數(shù)據(jù)。
由此可判斷,OV7670 RGB565時序設(shè)計正確。
由前面的介紹可知,CMOS OV7670攝像頭輸出的是8 bits的圖像數(shù)字信號,為了與后面SDRAM的輸入數(shù)據(jù)位寬16bits保持一致,設(shè)計中將兩個8 bits的CMOS_iDATA數(shù)據(jù)組合成了一個16bits的CMOS_o-DATA。
設(shè)計中,CMOS攝像頭采集的一幀圖像的數(shù)據(jù)大小為:,輸出時鐘PCLK為 ,在下一步的FIFO設(shè)計中必須要考慮這兩個數(shù)據(jù)。
FIFO一般用于不同時鐘域之間的數(shù)據(jù)傳輸[4]。此設(shè)計中,CMOS攝像頭的輸出時鐘PCLK為25 MHz,SDRAM為100 MHz,所以設(shè)計FIFO通道緩沖這兩個不同時鐘域之間數(shù)據(jù)。
圖2 quartus
13.1 軟件中的WFIFO、RFIFO參數(shù)配置
如圖2所示為WFIFO和RFIFO的參數(shù)設(shè)置。其中 data[15..0]:16bits輸入圖像數(shù)據(jù),wrreq:寫 FIFO的請求信號,wrclk:寫FIFO的應(yīng)答信號,rdreq:讀FIFO的請求信號,rdclk:讀FIFO的應(yīng)答信號,aclk:異步清零信號,q[15..0]:16bits輸出圖像數(shù)據(jù),rdusedw、wrusedw:讀、寫 FIFO已使用量,用于判斷FIFO讀寫滿空狀態(tài)。
設(shè)計中,WFIFO、RFIFO的輸入、輸出的數(shù)據(jù)寬度均為 16bits,深度均為 512words,故 WFIFO、RFIFO的大小均為,用FIFO容量的一半(rdusedw,wdusedw)來判斷讀寫滿空狀態(tài)。
FIFO的讀寫經(jīng)常用到“突發(fā)”傳輸,這里也不例外。設(shè)計中讀突發(fā)長度rd_length、寫突發(fā)長度wr_length均為256位。WFIFO的數(shù)據(jù)寫入SDRAM時,若wrf_use>=wr_length,則表明WFIFO中已經(jīng)緩存了至少一次的突發(fā)數(shù)據(jù),則使能寫SDRAM信號;此時若SDRAM已經(jīng)初始化完畢,則可以存儲突發(fā)數(shù)據(jù)的條件是:(寫SDRAM的地址sdram_wraddr)<(寫SDRAM的最大地址 wr_max_addr)-(一次突發(fā)長度wr_length),表明還未寫到當(dāng)前bank的最大地址;若不滿足此條件,說明已容納不下再一次的突發(fā)數(shù)據(jù)了,則鎖存地址,防止數(shù)據(jù)溢出,再送出一個寫完成標(biāo)志信號frame_write_done。
RFIFO的相關(guān)操作類似WFIFO,讀完數(shù)據(jù)后同樣送出一個讀完成標(biāo)志信號frame_read_done,利用這兩個讀寫完成標(biāo)志鎖存讀寫地址,防止數(shù)據(jù)溢出。設(shè)計中,SDRAM的讀寫初始地址均為22’h0,讀寫SDRAM的最大地址為22’d307200。
SDRAM是同步動態(tài)隨機(jī)存儲器,它的正常工作需要同步時鐘,本身的性質(zhì)決定了其存儲陣列需要不停地刷新以保證數(shù)據(jù)的可靠保存。與FLASH存儲器相比,SDRAM的讀寫速度要高得多,所以用于運(yùn)行內(nèi)存、存儲大數(shù)據(jù)的使用[5]。
設(shè)計中使用的是海力士公司的HY57V2562-S DRAM,容量為 256 Mbit,即 32 MB,地址線 13根,數(shù)據(jù)位寬16 bits,存儲架構(gòu)為,外部輸出和內(nèi)部控制時鐘:100 MHz。
SDRAM通常有如下特點。
1)行列地址復(fù)用,即在選取完行地址后,依然可以縱向選擇列地址,使用相同的地址線。
2)由于器件本身特性,需要不斷刷新,以免數(shù)據(jù)丟失,每行刷新的循環(huán)周期是64 ms。
3)有預(yù)充電操作,同一時間只能寫指定的一行,些其他行時需要關(guān)閉之前的行。
4)正常工作前需要配置模式寄存器。
程序在行有效信號CMOS_HREF為高電平,場有效信號CMOS_VSYNC為低電平的時候采樣數(shù)據(jù),把兩個Byte的數(shù)據(jù)合成一個16 bit的數(shù)據(jù)寫入WFIFO中,再傳輸存儲到SDRAM中。然后程序產(chǎn)生一個幀采集完成信號CMOS_VALID去通知SDRAM讀寫控制模塊進(jìn)行讀寫B(tài)ank的交換。
設(shè)計中對SDRAM的讀寫采用了“乒乓結(jié)構(gòu)”,以解決圖像拖影問題,如圖3所示。
圖3 SDRAM“乒乓結(jié)構(gòu)”式讀寫操作
在Bank交換程序中,當(dāng)檢測到CMOS_VALID的下降沿,說明一幀圖像捕獲完成,程序等候圖像數(shù)據(jù)全部寫入SDRAM中,若完整寫入,則SDRAM的Bank地址交換(如果是Bank0,則切換到Bank3;如果是Bank3,則切換到Bank0);另外等待整幅圖像從SDRAM讀出,讀出完畢則互換SDRAM的Bank地址。SDRAM讀寫B(tài)ank交換的同時,產(chǎn)生一個wr_load和rd_load信號去分別復(fù)位SDRAM 的讀寫地址和讀寫FIFO。
VGA接口傳輸紅、綠、藍(lán)模擬信號以及水平和垂直同步信號,另外設(shè)計中通過搭建電阻匹配網(wǎng)絡(luò),將中端的數(shù)字信號數(shù)據(jù)轉(zhuǎn)換為了模擬信號,以供VGA接口使用。
掃描方式:VGA屏幕內(nèi)部的電子槍從左上角開始掃描,從左往右,逐個像素點掃描,當(dāng)掃描至最右邊時,重新返回至下一行的最左邊開始掃描。由于這是一個物理過程,所以在返程中就出現(xiàn)了行消隱和場消隱的概念,即返程的掃描不是有效掃描。掃描完一行,行同步信號復(fù)位;掃描完一場,場同步信號復(fù)位,開始下一幀輸入圖像的掃描。
VESA中定義VGA的場時序和行時序都需要同步脈沖(Sync a)、顯示后沿(Back porch b)、顯示時序段(Display interval c)和顯示前沿(Front porch d)四部分,設(shè)計中的640×480@60 Hz的分辨率參數(shù)如表1所示。
表1 分辨率的VGA時序參數(shù)
設(shè)計中,VGA接口的參數(shù)設(shè)置為640×480@60Hz,每場對應(yīng)525個行,其中有效顯示480行;每顯示行包括800點時鐘,其中有效顯640點。由此可知:需要為VGA接口提供的點時鐘頻率為:525×60×80=25MHz。
設(shè)計功能實現(xiàn)后,使用Quartus 13.1軟件的仿真工具Signaltap對VGA_HSYNC輸入行時序、VGAD輸入16bits圖像數(shù)據(jù)進(jìn)行了聯(lián)合硬件仿真,以驗證時序設(shè)計的正確性。
仿真結(jié)果表明,在clk_vga脈沖的驅(qū)動下,vga掃描一行數(shù)據(jù)的像素個數(shù)為,上式中,+1 600表示相對于1361的位移,即此段的寬度為1 600,2表示1個像素點是由2個8bits數(shù)據(jù)組成,故可計算得到:vga掃描一行圖像數(shù)據(jù)的個數(shù)為800個像素點,與表1中的“e段”數(shù)據(jù)吻合。
由此可判斷,VGA時序設(shè)計正確。
試驗結(jié)果如圖4所示,采用CMOS OV7670攝像頭采集圖像的方式對圖像傳輸、存儲、實時顯示的設(shè)計進(jìn)行驗證,并通過Signaltap仿真工具聯(lián)合硬件分析OV7670 RGB565時序、VGA時序的設(shè)計正確性。試驗結(jié)果表明,高速圖像SDRAM存儲的設(shè)計能實時顯示圖像,并無卡幀停頓現(xiàn)象。FPGA作為主控制器,設(shè)計了各部分工作時序,構(gòu)建了FIFO和SDRAM組合的二級緩存結(jié)構(gòu),達(dá)到了CMOS圖像在不同時鐘域的傳輸目的,圖像數(shù)據(jù)的存儲與實時顯示功能也順利完成。本設(shè)計可實現(xiàn)持續(xù)的32 MB/s數(shù)據(jù)的實時顯示,滿足大多CMOS攝像頭設(shè)備中數(shù)據(jù)的實時傳輸要求。
圖4 OV7670模塊視頻采集效果圖
[1]郭柳柳,甄國涌,劉東海.基于FPGA高速圖像數(shù)據(jù)的存儲及顯示設(shè)計[J].電子技術(shù)應(yīng)用,2014,40(11):75-77;84.
[2]李慧敏,樊記明,楊笑.基于STM32和OV7670的圖像采集與顯示系統(tǒng)設(shè)計[J].傳感器與微系統(tǒng),2016,35(9):114-117.
[3]陳文昌,王勇,楊振國,等.基于OV7670圖像采集與顯示的FPGA設(shè)計[J].電腦編程技巧與維護(hù),2017(4):67-68;85.
[4]高俊嶺,陳志飛,章佩佩.基于FPGA的實時視頻圖像采集處理系統(tǒng)設(shè)計[J].電子技術(shù)應(yīng)用,2018,44(2):10-12;19.
[5]丁培培,鄭列,李宏.基于FPGA的DDR3 SDRAM控制器設(shè)計與實現(xiàn)方法[J].信息記錄材料,2018,19(5):64-66.