張谷祥,王曉曼,趙海麗,楊威
(長春理工大學 電子信息工程學院,長春 130022)
圖像處理技術(shù)廣泛應用于各行各業(yè),如醫(yī)療衛(wèi)生、航空航天等,而圖像采集是圖像處理的前提保證,采集到原始圖像的質(zhì)量將直接影響到圖像處理最終的效果[1]。目前在測量位姿的方法中,雙目視覺測量是研究的課題之一,它是利用雙攝像頭拍攝同一場景,根據(jù)視差來獲得三維信息,然后根據(jù)位姿解算算法得出位置和姿態(tài)數(shù)據(jù)。由于在雙目視覺的位姿測量系統(tǒng)中要求兩攝像頭同步工作、并行運算,傳統(tǒng)的串行器件CPU不能并行地控制兩攝像頭同步工作和處理數(shù)據(jù),為了滿足要求,故系統(tǒng)提出了一個基于FPGA的以太網(wǎng)雙目圖像采集系統(tǒng)。由于FPGA相比CPU擁有并行處理的特點,并且具有集成度高、實時性強,功耗低的優(yōu)點,可在每個時鐘周期完成多樣的處理任務,因此FPGA滿足控制要求。
本系統(tǒng)以EP4CE10F17C8現(xiàn)場可編程門陣列為主控單元、以CMOS圖像傳感器OV5640為圖像采集單元,以SDRAM為數(shù)據(jù)存儲單元,以PHY為以太網(wǎng)收發(fā)器單元,以PC為圖像顯示單元,實現(xiàn)了圖像的采集、存儲、傳輸和顯示。
圖1是系統(tǒng)的總體框圖,主要有FPGA、圖像采集設備、圖像顯示設備等組成。其中OV5640圖像傳感器負責圖像采集,F(xiàn)PGA則是整個系統(tǒng)的控制核心單元,是負責圖像數(shù)據(jù)的處理和各模塊的控制等。
圖1 系統(tǒng)總體框圖
SDRAM用來存取采集的圖像數(shù)據(jù),PC機通過網(wǎng)口與FPGA通信來顯示采集的圖像數(shù)據(jù)。FPGA采用的是原Altera公司Cyclone IV E系列產(chǎn)品,該系列產(chǎn)品經(jīng)過優(yōu)化工藝,能夠把內(nèi)核工作電壓降低到1.2 V,非常適合應用在對成本和功耗有較高要求的場合。根據(jù)串行攝像機控制總線SCCB來完成OV5640圖像傳感器的初始化和控制像素顯示窗口范圍、消隱行范圍、增益范圍。之后便通過攝像頭DVP接口把輸出的RGB565圖像數(shù)據(jù)傳給FPGA中的寫FIFO模塊,再由FPGA內(nèi)部的SDRAM控制器模塊對寫FIFO模塊中數(shù)據(jù)進行操作,目的是存入到外部SDRAM芯片上,當外部有讀請求時,再通過讀FIFO模塊來進行數(shù)據(jù)讀操作,并將讀到的數(shù)據(jù)通過網(wǎng)線傳輸?shù)缴衔粰C來完成數(shù)據(jù)的顯示。
圖像采集采用的是OmniVision公司生產(chǎn)的一款1/4英寸、最高500 W像素圖像輸出能力的互補金屬氧化物半導體(CMOS)圖像傳感器OV5640,其支持RawRGB、RGB(RGB565、RGB555、RGB444)、CCIR656、YUV(422/420)、YCbCr(422)和壓縮圖像(JPEG)輸出格式,標準的SCCB接口,兼容IIC接口,有自動曝光(AEC)、自動白平衡(AWB)、自動消除燈光條紋控制功能,具有非常高的性價比。它通過定制的2線/3線制串行攝頭控制總線(serial camera control bus,SCCB)進行控制,輸出并行的10位圖像數(shù)據(jù),圖像輸出最高可達30幀/s,滿足視覺流暢的需求。兩片圖像傳感器OV5640負責圖像的采集,并且本身可以輸出10位數(shù)據(jù),但大多數(shù)情況下采用高8位數(shù)據(jù)。輸入?yún)⒖紩r鐘XCK由FPGA直接提供,不需要額外晶振提供[3]。圖像采集電路示意圖如圖2所示。
圖2 攝像頭與FPGA的電路連接示意圖
系統(tǒng)采用的SDRAM存儲器是HY57V281620芯片,該芯片總128 Mbit,4個bank,每個bank有32 Mbit存儲單元,系統(tǒng)設置每個存儲單元存儲16 bit,則每個bank有4 096行×512列,對于SDRAM的讀寫是以突發(fā)的方式進行的,對SDRAM的操作是從一個指定的地址開始,并且按照編程好的數(shù)量的地址,順序讀寫數(shù)據(jù),其工作為3.3 V,擁有一個同步接口,SDRAM的所有信號都是在時鐘信號的上升沿被寄存,芯片的工作時鐘通過FPGA的PLL提供,為100 MHz。數(shù)據(jù)存儲電路示意圖如圖3所示。
圖3 FPGA與SDRAM的電路連接示意圖
系統(tǒng)通過一片RTL8201以太網(wǎng)PHY芯片提供對以太網(wǎng)連接的支持,RTL8201是一片10 M/100 M自適應以太網(wǎng)收發(fā)器,提供MII/SNI接口MAC連接,MII接口的發(fā)送時鐘,由PHY芯片產(chǎn)生,該系統(tǒng)工作在100 Mbps時,時鐘為25 MHz,MII接口發(fā)送數(shù)據(jù)使能,高電平有效,每個發(fā)送時鐘上升沿發(fā)送4位數(shù)據(jù),RJ45采用的是HR91130C,該連接器自帶隔離變壓器和終端電阻,有利于改善系統(tǒng)的EMC/EMI性能[4]。以太網(wǎng)傳輸電路示意圖如圖4所示。
圖4 FPGA與RTL8211的電路連接示意圖
軟件設計主要有圖像采集驅(qū)動模塊邏輯設計、數(shù)據(jù)存儲模塊邏輯設計、以太網(wǎng)模塊邏輯設計這三個部分。其中圖像采集驅(qū)動模塊邏輯設計來完成OV5640寄存器初始化和圖像數(shù)據(jù)的獲?。粩?shù)據(jù)存儲模塊邏輯設計來完成圖像數(shù)據(jù)的存儲;以太網(wǎng)模塊邏輯設計來完成圖像數(shù)據(jù)的讀取和傳送。開發(fā)工具使用的是QuartusⅡ,程序編寫使用的是Verilog HDL語言,仿真使用的是Modelsim工具。最終程序編譯下載到FPGA開發(fā)版來進行上位機顯示,以驗證系統(tǒng)設計的正確性。
圖像采集驅(qū)動模塊邏輯設計分攝像頭的初始化和圖像數(shù)據(jù)采集,其中攝像頭初始化在前,圖像數(shù)據(jù)采集在后。圖像傳感器OV5640寄存器眾多,并且寄存器地址不是連續(xù)的,用寄存器地址累加行不通,這里解決的方法是使用ROM查找表,查找表里存儲的是寄存器地址和數(shù)據(jù),ROM每個存儲單位設置為24位,其中高16位用來存儲寄存器地址,低8位用來存儲該寄存器需要設置的初始值,當啟動SCCB控制器寫操作時,依次從查找表取出值寫入到OV5640寄存器,直到寄存器寫完。SET_CNT是設置需要初始化寄存器的個數(shù),Comb_logic表示組合邏輯用來分開寄存器地址值和初始值。其初始化模塊框圖如圖5所示。
圖5 初始化模塊框圖
圖像數(shù)據(jù)采集時當檢測到幀VSYNC為上升沿時表示一幀圖像數(shù)據(jù)傳輸?shù)拈_始,在之后行同步信號HREF為上升沿時表示一行圖像傳輸?shù)拈_始,在HREF為高電平期間,一個像素時鐘PCLK,輸出8位數(shù)據(jù),該系統(tǒng)設置每個攝像頭的像素輸出總大小為400×480,輸出格式設置為RGB565,即每個像素是16位,每2個字節(jié)組成一個像素的顏色,底字節(jié)在前,高字節(jié)在后,這樣每行輸出總共有400×2個像素時鐘,輸出400×2個字節(jié)。如圖6為DVP接口時序圖。
圖6 DVP接口時序圖
根據(jù)DVP時序圖編寫Verilog HDL程序,通過Modelsim仿真得到圖7圖像像素捕獲局部仿真圖,該圖并沒有仿真全部的像素而是人為設定了部分像素數(shù)據(jù),主要目的是來驗證程序功能是否正常,其中Yaddr和Xaddr是行列計數(shù)器,在幀VSYNC為上升沿時都清零,當檢測到行HREF為上升沿時Xaddr加一,一行結(jié)束時清零的同時Yaddr加一,循環(huán)往復,直到一幀結(jié)束時都清零,該功能用于記錄當前的像素點幾何位置,方便其他模塊操作。當兩個8位數(shù)據(jù)拼接成16位數(shù)據(jù)時DATAVALID為高電平,表示可以取出當前像素值來傳輸給下一個功能模塊。根據(jù)仿真圖顯示程序功能達到了要求。
圖7 圖像像素捕獲局部仿真圖
數(shù)據(jù)存儲模塊邏輯設計由兩個寫FIFO、兩個讀FIFO和SDRAM控制器模塊組成。其中兩個寫FIFO是用來緩存采集的兩個攝像頭數(shù)據(jù),攝像頭的像素時鐘為FIFO的寫時鐘,這里為24 MHz,攝像頭的場信號作為FIFO的寫請求,這樣就保證了數(shù)據(jù)的采集緩存一致,不丟失數(shù)據(jù)。該系統(tǒng)設置寫入的FIFO數(shù)據(jù)長度超過256個時,就可以讀出寫FIFO數(shù)據(jù),讀出的數(shù)據(jù)送入SDRAM控制器,再寫入SDRAM,讀取寫FIFO時鐘為100 MHz。讀FIFO的寫時鐘同樣為100 MHz,寫請求是當寫入的數(shù)據(jù)小于256時有效讀FIFO的讀請求由外部指定,讀時鐘和以太網(wǎng)發(fā)送時鐘同樣為25 MHz,保證數(shù)據(jù)同步操作,防止丟失數(shù)據(jù)。SDRAM控制器是用來完成SDRAM讀、寫等操作。
SDRAM上電后,系統(tǒng)處于空閑狀態(tài),在上電初始化完成后進入刷新狀態(tài),其上電初始化是來關(guān)閉SDRAM的BANK,使BANK處于空閑狀態(tài)并且加載SDRAM模式寄存器來確定讀和寫采用何種方式,該系統(tǒng)設置的突發(fā)長度為8、運行模式設置為標準模式、突發(fā)類型設置為順序、列選通潛伏期設置為2。刷新狀態(tài)如果有讀或?qū)懻埱蟮絹?,狀態(tài)將會轉(zhuǎn)移到相應的讀或?qū)憼顟B(tài),其刷新狀態(tài)是為了保證存儲在SDRAM中的數(shù)據(jù)不丟失,刷新周期由定時器產(chǎn)生[5]。讀或?qū)憼顟B(tài)各自主要負責讀寫數(shù)據(jù)操作,整個狀態(tài)機中對刷新操作、寫數(shù)據(jù)操作、讀數(shù)據(jù)操作是有一個優(yōu)先級的,也就是某兩個或多個操作請求同時到來時先執(zhí)行哪個操作是有事先規(guī)定的,這里規(guī)定的優(yōu)先級是刷新操作>寫操作>讀操作[8]。其狀態(tài)機轉(zhuǎn)移圖如圖8所示。
圖8 狀態(tài)機轉(zhuǎn)移圖
通過仿真得到SDRAM控制器模塊局部仿真圖,如圖9寫操作和圖10讀操作所示,對SDRAM的操作,是通過命令來控制的,命令由sdram_cs_n、sdram_ras_n、sdram_cas_n、sdram_we_n這四個控制信號組合成不同狀態(tài)來表示,同時地址總線sdram_addr和sdram_dqm總線作為輔助信號,提供與命令相對應的地址或者參數(shù)命令。使用的SDRAM仿真模型由鎂光官網(wǎng)提供。通過仿真圖可以看出突發(fā)長度為8并且寫入的指定某個地址數(shù)據(jù)與該地址讀出的數(shù)據(jù)相同,說明編寫的SDRAM控制器模塊功能是正確的。
圖9 SDRAM控制器寫操作局部仿真圖
圖10 SDRAM控制器讀操作局部仿真圖
以太網(wǎng)模塊邏輯設計分以太網(wǎng)發(fā)送圖像控制邏輯和以太網(wǎng)傳輸數(shù)據(jù)邏輯,其中以太網(wǎng)發(fā)送圖像控制邏輯是用來從SDRAM中讀取圖像數(shù)據(jù)并寫入到以太網(wǎng)傳輸數(shù)據(jù)邏輯。以太網(wǎng)發(fā)送圖像控制邏輯以RTL8201芯片提供的25 MHz作為時鐘。首先進行上電或者是復位計數(shù),該系統(tǒng)設定當計數(shù)到65 024時產(chǎn)生一次幀同步信號frame_sync,目的是清除SDRAM讀端口中的FIFO中的數(shù)據(jù),保證從開始讀一行完整的圖像數(shù)據(jù),之后計數(shù)到65 534時便使能圖像發(fā)送信號send_en,在該信號使能的條件下,判斷以太網(wǎng)傳輸數(shù)據(jù)邏輯中的雙時鐘異步FIFO是否有1 602個字節(jié)空間能夠存儲行號和圖像數(shù)據(jù),如果沒有則繼續(xù)等待,如果有則對外部發(fā)出讀請求信號sdram_rdrep來讀取SDRAM數(shù)據(jù),同時根據(jù)讀到的數(shù)據(jù)進行行列計數(shù)。當行hcnt計數(shù)到800時便從零開始重新計數(shù),同時列vcnt自動加一,直到480列結(jié)束,也就是一幀的結(jié)束。每次根據(jù)行為零發(fā)送此刻的列數(shù)字作為行號,以便確定在二維平面中顯示的位置,循環(huán)往復之后的每一幀都是這種處理過程。如圖11所示為以太網(wǎng)發(fā)送圖像控制邏輯局部仿真圖,結(jié)果顯示達到了數(shù)據(jù)傳輸要求。
圖11 以太網(wǎng)發(fā)送圖像控制邏輯局部仿真圖
該系統(tǒng)的以太網(wǎng)傳輸數(shù)據(jù)邏輯是基于UDP/IP協(xié)議,雖然該協(xié)議是一種不可靠傳輸,即發(fā)送方只負責發(fā)送數(shù)據(jù),對接收方是否正確的接收數(shù)據(jù)不關(guān)心,但是UDP實現(xiàn)起來簡單、靈活、傳輸數(shù)據(jù)快并且在視頻實時傳輸顯示中圖像數(shù)據(jù)僅僅顯示在屏幕上,可以接受一定程度的數(shù)據(jù)丟包。要實現(xiàn)用戶數(shù)據(jù)的傳輸,其核心是把各個層的數(shù)據(jù)相互封裝起來[7-10]。如圖12所示,應用層的用戶數(shù)據(jù)構(gòu)成傳輸層的數(shù)據(jù)段,傳輸層的UDP報頭和數(shù)據(jù)段構(gòu)成網(wǎng)絡層的數(shù)據(jù)段,網(wǎng)絡層的IP報頭和數(shù)據(jù)段構(gòu)成數(shù)據(jù)鏈路層的數(shù)據(jù)段,數(shù)據(jù)鏈路層的MAC幀頭、數(shù)據(jù)段和幀校驗在物理層MII接口下實現(xiàn)數(shù)據(jù)的傳輸[6]。MII接口協(xié)議是在使能高電平條件下在每個時鐘上升沿傳輸4位數(shù)據(jù),如圖13所示。
圖12 數(shù)據(jù)分層框圖
圖13 MII接口協(xié)議
以太網(wǎng)的MAC幀數(shù)據(jù)字段范圍一般在46到1 500字節(jié),這與該系統(tǒng)每次傳輸1 602個字節(jié)不相符,這里解決的辦法是開通以太網(wǎng)的巨型幀,即可實現(xiàn)雙目圖像的傳輸。發(fā)送數(shù)據(jù)時,采用Wireshark工具進行抓包[9],如圖 14所示,測試系統(tǒng)與電腦完成連接,由圖14中可知,源MAC地址為(00:0a:35:01:fe:c0),源端口為 5000,源 IP為 192.168.0.2,目的端口為 6 000,目的 IP為169.254.67.8,UDP數(shù)據(jù)包中有1 602個字節(jié)。
圖14 Wireshark抓包圖
UDP發(fā)送模塊檢測到FIFO寫滿1 602個字節(jié)時,就將數(shù)據(jù)打包,通過MII接口總線發(fā)送給PHY芯片,PHY芯片再將數(shù)據(jù)通過網(wǎng)線發(fā)送至上位機來顯示。
首先需要發(fā)送的是MAC幀頭,即前導碼(7個55H)、幀開始符(D5H)、目的MAC地址、源MAC地址、類型與長度(0800H),其次是幀的數(shù)據(jù)字段,最后是幀的校驗序列。如圖15所示為以太網(wǎng)傳輸數(shù)據(jù)局部仿真圖,結(jié)果顯示達到了數(shù)據(jù)傳輸要求。
圖15 以太網(wǎng)傳輸數(shù)據(jù)局部仿真圖
讀取SDRAM兩個讀FIFO的數(shù)據(jù),就可以讀取到兩個攝像頭存儲在SDRAM中的圖像數(shù)據(jù),該系統(tǒng)設置每個攝像頭的像素輸出大小為400×480,上位機設置分辨率為800×480,則需要讀取某個攝像頭某行數(shù)據(jù)后緊接著讀取另一攝像頭同一行數(shù)據(jù)傳給上位機,如此上位機某行順序顯示了兩個攝像頭同一行數(shù)據(jù)。系統(tǒng)以讀取讀FIFO的時鐘進行計數(shù),當計數(shù)到400時變換讀請求,即可達到變換讀取圖像數(shù)據(jù)的目的,在發(fā)送給上位機每行數(shù)據(jù)之前需要發(fā)送兩個字節(jié)大小的行號,以輔助上位機在二維平面中顯示的位置。如圖16所示為單網(wǎng)口雙目圖像采集顯示實例。
圖16 雙目采集圖
本文基于FPGA的以太網(wǎng)雙目圖像采集系統(tǒng)設計,完成了兩攝像頭的同步工作、并行運算數(shù)據(jù)的要求同時系統(tǒng)具有簡單可靠、資源占用少、擴展能力好的特點,可便于后續(xù)雙目視覺算法的研究與驗證。