張谷祥,王曉曼,趙海麗,楊威
(長春理工大學 電子信息工程學院,長春 130022)
圖像處理技術廣泛應用于各行各業,如醫療衛生、航空航天等,而圖像采集是圖像處理的前提保證,采集到原始圖像的質量將直接影響到圖像處理最終的效果[1]。目前在測量位姿的方法中,雙目視覺測量是研究的課題之一,它是利用雙攝像頭拍攝同一場景,根據視差來獲得三維信息,然后根據位姿解算算法得出位置和姿態數據。由于在雙目視覺的位姿測量系統中要求兩攝像頭同步工作、并行運算,傳統的串行器件CPU不能并行地控制兩攝像頭同步工作和處理數據,為了滿足要求,故系統提出了一個基于FPGA的以太網雙目圖像采集系統。由于FPGA相比CPU擁有并行處理的特點,并且具有集成度高、實時性強,功耗低的優點,可在每個時鐘周期完成多樣的處理任務,因此FPGA滿足控制要求。
本系統以EP4CE10F17C8現場可編程門陣列為主控單元、以CMOS圖像傳感器OV5640為圖像采集單元,以SDRAM為數據存儲單元,以PHY為以太網收發器單元,以PC為圖像顯示單元,實現了圖像的采集、存儲、傳輸和顯示。
圖1是系統的總體框圖,主要有FPGA、圖像采集設備、圖像顯示設備等組成。其中OV5640圖像傳感器負責圖像采集,FPGA則是整個系統的控制核心單元,是負責圖像數據的處理和各模塊的控制等。

圖1 系統總體框圖
SDRAM用來存取采集的圖像數據,PC機通過網口與FPGA通信來顯示采集的圖像數據。FPGA采用的是原Altera公司Cyclone IV E系列產品,該系列產品經過優化工藝,能夠把內核工作電壓降低到1.2 V,非常適合應用在對成本和功耗有較高要求的場合。根據串行攝像機控制總線SCCB來完成OV5640圖像傳感器的初始化和控制像素顯示窗口范圍、消隱行范圍、增益范圍。之后便通過攝像頭DVP接口把輸出的RGB565圖像數據傳給FPGA中的寫FIFO模塊,再由FPGA內部的SDRAM控制器模塊對寫FIFO模塊中數據進行操作,目的是存入到外部SDRAM芯片上,當外部有讀請求時,再通過讀FIFO模塊來進行數據讀操作,并將讀到的數據通過網線傳輸到上位機來完成數據的顯示。
圖像采集采用的是OmniVision公司生產的一款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位圖像數據,圖像輸出最高可達30幀/s,滿足視覺流暢的需求。兩片圖像傳感器OV5640負責圖像的采集,并且本身可以輸出10位數據,但大多數情況下采用高8位數據。輸入參考時鐘XCK由FPGA直接提供,不需要額外晶振提供[3]。圖像采集電路示意圖如圖2所示。

圖2 攝像頭與FPGA的電路連接示意圖
系統采用的SDRAM存儲器是HY57V281620芯片,該芯片總128 Mbit,4個bank,每個bank有32 Mbit存儲單元,系統設置每個存儲單元存儲16 bit,則每個bank有4 096行×512列,對于SDRAM的讀寫是以突發的方式進行的,對SDRAM的操作是從一個指定的地址開始,并且按照編程好的數量的地址,順序讀寫數據,其工作為3.3 V,擁有一個同步接口,SDRAM的所有信號都是在時鐘信號的上升沿被寄存,芯片的工作時鐘通過FPGA的PLL提供,為100 MHz。數據存儲電路示意圖如圖3所示。

圖3 FPGA與SDRAM的電路連接示意圖
系統通過一片RTL8201以太網PHY芯片提供對以太網連接的支持,RTL8201是一片10 M/100 M自適應以太網收發器,提供MII/SNI接口MAC連接,MII接口的發送時鐘,由PHY芯片產生,該系統工作在100 Mbps時,時鐘為25 MHz,MII接口發送數據使能,高電平有效,每個發送時鐘上升沿發送4位數據,RJ45采用的是HR91130C,該連接器自帶隔離變壓器和終端電阻,有利于改善系統的EMC/EMI性能[4]。以太網傳輸電路示意圖如圖4所示。

圖4 FPGA與RTL8211的電路連接示意圖
軟件設計主要有圖像采集驅動模塊邏輯設計、數據存儲模塊邏輯設計、以太網模塊邏輯設計這三個部分。其中圖像采集驅動模塊邏輯設計來完成OV5640寄存器初始化和圖像數據的獲取;數據存儲模塊邏輯設計來完成圖像數據的存儲;以太網模塊邏輯設計來完成圖像數據的讀取和傳送。開發工具使用的是QuartusⅡ,程序編寫使用的是Verilog HDL語言,仿真使用的是Modelsim工具。最終程序編譯下載到FPGA開發版來進行上位機顯示,以驗證系統設計的正確性。
圖像采集驅動模塊邏輯設計分攝像頭的初始化和圖像數據采集,其中攝像頭初始化在前,圖像數據采集在后。圖像傳感器OV5640寄存器眾多,并且寄存器地址不是連續的,用寄存器地址累加行不通,這里解決的方法是使用ROM查找表,查找表里存儲的是寄存器地址和數據,ROM每個存儲單位設置為24位,其中高16位用來存儲寄存器地址,低8位用來存儲該寄存器需要設置的初始值,當啟動SCCB控制器寫操作時,依次從查找表取出值寫入到OV5640寄存器,直到寄存器寫完。SET_CNT是設置需要初始化寄存器的個數,Comb_logic表示組合邏輯用來分開寄存器地址值和初始值。其初始化模塊框圖如圖5所示。

圖5 初始化模塊框圖
圖像數據采集時當檢測到幀VSYNC為上升沿時表示一幀圖像數據傳輸的開始,在之后行同步信號HREF為上升沿時表示一行圖像傳輸的開始,在HREF為高電平期間,一個像素時鐘PCLK,輸出8位數據,該系統設置每個攝像頭的像素輸出總大小為400×480,輸出格式設置為RGB565,即每個像素是16位,每2個字節組成一個像素的顏色,底字節在前,高字節在后,這樣每行輸出總共有400×2個像素時鐘,輸出400×2個字節。如圖6為DVP接口時序圖。

圖6 DVP接口時序圖
根據DVP時序圖編寫Verilog HDL程序,通過Modelsim仿真得到圖7圖像像素捕獲局部仿真圖,該圖并沒有仿真全部的像素而是人為設定了部分像素數據,主要目的是來驗證程序功能是否正常,其中Yaddr和Xaddr是行列計數器,在幀VSYNC為上升沿時都清零,當檢測到行HREF為上升沿時Xaddr加一,一行結束時清零的同時Yaddr加一,循環往復,直到一幀結束時都清零,該功能用于記錄當前的像素點幾何位置,方便其他模塊操作。當兩個8位數據拼接成16位數據時DATAVALID為高電平,表示可以取出當前像素值來傳輸給下一個功能模塊。根據仿真圖顯示程序功能達到了要求。

圖7 圖像像素捕獲局部仿真圖
數據存儲模塊邏輯設計由兩個寫FIFO、兩個讀FIFO和SDRAM控制器模塊組成。其中兩個寫FIFO是用來緩存采集的兩個攝像頭數據,攝像頭的像素時鐘為FIFO的寫時鐘,這里為24 MHz,攝像頭的場信號作為FIFO的寫請求,這樣就保證了數據的采集緩存一致,不丟失數據。該系統設置寫入的FIFO數據長度超過256個時,就可以讀出寫FIFO數據,讀出的數據送入SDRAM控制器,再寫入SDRAM,讀取寫FIFO時鐘為100 MHz。讀FIFO的寫時鐘同樣為100 MHz,寫請求是當寫入的數據小于256時有效讀FIFO的讀請求由外部指定,讀時鐘和以太網發送時鐘同樣為25 MHz,保證數據同步操作,防止丟失數據。SDRAM控制器是用來完成SDRAM讀、寫等操作。
SDRAM上電后,系統處于空閑狀態,在上電初始化完成后進入刷新狀態,其上電初始化是來關閉SDRAM的BANK,使BANK處于空閑狀態并且加載SDRAM模式寄存器來確定讀和寫采用何種方式,該系統設置的突發長度為8、運行模式設置為標準模式、突發類型設置為順序、列選通潛伏期設置為2。刷新狀態如果有讀或寫請求到來,狀態將會轉移到相應的讀或寫狀態,其刷新狀態是為了保證存儲在SDRAM中的數據不丟失,刷新周期由定時器產生[5]。讀或寫狀態各自主要負責讀寫數據操作,整個狀態機中對刷新操作、寫數據操作、讀數據操作是有一個優先級的,也就是某兩個或多個操作請求同時到來時先執行哪個操作是有事先規定的,這里規定的優先級是刷新操作>寫操作>讀操作[8]。其狀態機轉移圖如圖8所示。

圖8 狀態機轉移圖
通過仿真得到SDRAM控制器模塊局部仿真圖,如圖9寫操作和圖10讀操作所示,對SDRAM的操作,是通過命令來控制的,命令由sdram_cs_n、sdram_ras_n、sdram_cas_n、sdram_we_n這四個控制信號組合成不同狀態來表示,同時地址總線sdram_addr和sdram_dqm總線作為輔助信號,提供與命令相對應的地址或者參數命令。使用的SDRAM仿真模型由鎂光官網提供。通過仿真圖可以看出突發長度為8并且寫入的指定某個地址數據與該地址讀出的數據相同,說明編寫的SDRAM控制器模塊功能是正確的。

圖9 SDRAM控制器寫操作局部仿真圖

圖10 SDRAM控制器讀操作局部仿真圖
以太網模塊邏輯設計分以太網發送圖像控制邏輯和以太網傳輸數據邏輯,其中以太網發送圖像控制邏輯是用來從SDRAM中讀取圖像數據并寫入到以太網傳輸數據邏輯。以太網發送圖像控制邏輯以RTL8201芯片提供的25 MHz作為時鐘。首先進行上電或者是復位計數,該系統設定當計數到65 024時產生一次幀同步信號frame_sync,目的是清除SDRAM讀端口中的FIFO中的數據,保證從開始讀一行完整的圖像數據,之后計數到65 534時便使能圖像發送信號send_en,在該信號使能的條件下,判斷以太網傳輸數據邏輯中的雙時鐘異步FIFO是否有1 602個字節空間能夠存儲行號和圖像數據,如果沒有則繼續等待,如果有則對外部發出讀請求信號sdram_rdrep來讀取SDRAM數據,同時根據讀到的數據進行行列計數。當行hcnt計數到800時便從零開始重新計數,同時列vcnt自動加一,直到480列結束,也就是一幀的結束。每次根據行為零發送此刻的列數字作為行號,以便確定在二維平面中顯示的位置,循環往復之后的每一幀都是這種處理過程。如圖11所示為以太網發送圖像控制邏輯局部仿真圖,結果顯示達到了數據傳輸要求。

圖11 以太網發送圖像控制邏輯局部仿真圖
該系統的以太網傳輸數據邏輯是基于UDP/IP協議,雖然該協議是一種不可靠傳輸,即發送方只負責發送數據,對接收方是否正確的接收數據不關心,但是UDP實現起來簡單、靈活、傳輸數據快并且在視頻實時傳輸顯示中圖像數據僅僅顯示在屏幕上,可以接受一定程度的數據丟包。要實現用戶數據的傳輸,其核心是把各個層的數據相互封裝起來[7-10]。如圖12所示,應用層的用戶數據構成傳輸層的數據段,傳輸層的UDP報頭和數據段構成網絡層的數據段,網絡層的IP報頭和數據段構成數據鏈路層的數據段,數據鏈路層的MAC幀頭、數據段和幀校驗在物理層MII接口下實現數據的傳輸[6]。MII接口協議是在使能高電平條件下在每個時鐘上升沿傳輸4位數據,如圖13所示。

圖12 數據分層框圖

圖13 MII接口協議
以太網的MAC幀數據字段范圍一般在46到1 500字節,這與該系統每次傳輸1 602個字節不相符,這里解決的辦法是開通以太網的巨型幀,即可實現雙目圖像的傳輸。發送數據時,采用Wireshark工具進行抓包[9],如圖 14所示,測試系統與電腦完成連接,由圖14中可知,源MAC地址為(00:0a:35:01:fe:c0),源端口為 5000,源 IP為 192.168.0.2,目的端口為 6 000,目的 IP為169.254.67.8,UDP數據包中有1 602個字節。

圖14 Wireshark抓包圖
UDP發送模塊檢測到FIFO寫滿1 602個字節時,就將數據打包,通過MII接口總線發送給PHY芯片,PHY芯片再將數據通過網線發送至上位機來顯示。
首先需要發送的是MAC幀頭,即前導碼(7個55H)、幀開始符(D5H)、目的MAC地址、源MAC地址、類型與長度(0800H),其次是幀的數據字段,最后是幀的校驗序列。如圖15所示為以太網傳輸數據局部仿真圖,結果顯示達到了數據傳輸要求。

圖15 以太網傳輸數據局部仿真圖
讀取SDRAM兩個讀FIFO的數據,就可以讀取到兩個攝像頭存儲在SDRAM中的圖像數據,該系統設置每個攝像頭的像素輸出大小為400×480,上位機設置分辨率為800×480,則需要讀取某個攝像頭某行數據后緊接著讀取另一攝像頭同一行數據傳給上位機,如此上位機某行順序顯示了兩個攝像頭同一行數據。系統以讀取讀FIFO的時鐘進行計數,當計數到400時變換讀請求,即可達到變換讀取圖像數據的目的,在發送給上位機每行數據之前需要發送兩個字節大小的行號,以輔助上位機在二維平面中顯示的位置。如圖16所示為單網口雙目圖像采集顯示實例。

圖16 雙目采集圖
本文基于FPGA的以太網雙目圖像采集系統設計,完成了兩攝像頭的同步工作、并行運算數據的要求同時系統具有簡單可靠、資源占用少、擴展能力好的特點,可便于后續雙目視覺算法的研究與驗證。