基于SoPC的自感知運動圖像采集系統設計
引 言
近年來,嵌入式圖像采集技術得到快速發展,但由于嵌入式系統的處理、傳輸和存儲數據的資源有限,常成為系統采集速度的瓶頸,很難實現高速穩定的采集。
SoPC是近幾年興起的一種用于嵌入式開發的片上系統可編程技術,SoPC基于FPGA芯片,將處理器、存儲器、I/O口等模塊集成在一起,完成整個系統的主要邏輯功能,具有設計靈活、可剪裁、可擴充、可升級及軟、硬件在系統可編程的功能。由于SoPC平臺可以擁有微處理器系統豐富的軟件資源和出色的人機交互能力,同時又具備FPGA系統的快速硬件邏輯特性,實現了軟件系統和硬件系統的互補,因此發展前景非常廣闊,被認為是未來嵌入式系統發展的方向。
在此試圖設計一種基于SoPC的自感知圖像采集系統,使其能夠應用于低成本、低功耗的微型嵌入式圖像監控和采集系統,以期在更多適合的應用場合替代傳統基于PC的圖像監控方案。在已見文獻報道中,基于SoPC的圖像采集系統設計大多只是把采集的數據緩沖在SDRAM或SRAM中,有些文獻則進一步提出將緩沖后數據直接通過并口傳輸給主控芯片,有的方案則是由USB接口或以太網接口輸出主機,另外有的文獻則提出直接將數據存儲到CF卡或硬盤中,而在SoPC系統直接實現SD卡的圖像采集數據文件存儲在國內還未見報道。
另外還提出了一種新的適合在FPGA硬件實現的快速運動檢測算法,并和圖像采集、SD卡圖像數據存儲接口電路集成在同一FPGA芯片內部。在此這一圖像采集系統的結構、工作原理以及系統設計等加以介紹。
1 系統結構及工作原理
該系統選用的。FPGA芯片是Altera公司CycloneⅡ系列的EP2C35。該芯片具有35 000個邏輯單元、672個引腳、475個用戶自定義I/O接口、35個嵌入式乘法器和4個鎖相環。FPGA芯片外接美光公司型號為MT9M011的130萬像素的CIS(CMOS圖像傳感器,分辨率為640×480時60幀/s)、Hynix公司的型號為HY57V641620HG的SDRAM(4 Banks×1 M×16 b),以及用來圖像顯示驗證的液晶屏等。
系統工作過程如圖1所示。CIS經過I2C配置模塊的初始化后,輸出行場同步信號、像素時鐘和圖像數據。再將采集的數據轉換成RGB信號,幀緩沖模塊(Frame Buffer)每次將相鄰兩幀圖像數據寫入SDRAM,然后比較這兩幀圖像的差值,如果差值大于設定的閾值,就認為檢測到了外界場景的運動,系統會自動將捕獲的圖像輸出到SD卡進行存儲。
2 系統模塊設計
2.1 采集模塊
2.1.1 CIS配置模塊
目前嵌入式采集系統大多仍采用模擬攝像頭,再經過A/D轉換得到數字圖像信號。而相比較而言,CMOS圖像傳感器能夠直接輸出數字信號,而且其以體積小、功耗低、成本低的優勢更適合應用在嵌入式應用領域,在該設計中采用130萬像素的CMOS圖像傳感器,其輸出圖像品質已相當接近CCD感應器。MT9M011芯片內部自帶時序發生器和ADC,使用時只需輸入一個時鐘信號(該設計采用25 MHz的時鐘信號),圖像數據便按行有效信號(LINE VALID)、場有效信號(FRAME VAL-ID)和像素時鐘(Pixel clock)時序關系一同發出。
MT9M011上集成了I2C接口,其初始化由內部的I2C總線來配置,通過編寫硬件描述語言來模擬I2C總線時序,從而配置各寄存器,其中,該設計需要配置的寄存器如表1所示。該模塊采用計數器建立一個狀態機,先寫器件地址,再寫寄存器地址,然后寫數據。另外還提供每幀圖像的控制信號以及圖像的行計數器和列計數器,為后續處理作準備。
2.1.2 格式轉換模塊
MT9M011所輸出的圖像格式為Bayer格式,奇行由綠、紅像素交替構成,偶行由藍、綠像素交替構成。要想在顯示屏上顯示,必須將Bayer格式通過CFA插值濾波為RGB圖像數據。該模塊采用雙線性插值算法(BiIinear Interpolation),與高階B-spline和Cubic-spline等插補函數算法相比,圖像的像質相差不大。但Bilincar的算法要簡單得多,不僅消耗的硬件資源相對要少,而且易于硬件實現。其算法原理是每個像素位置上缺少的彩色分量由3×3鄰域內具有相同顏色分量的像素平均值獲得。
設計中調用移位寄存器IP核,將間隔為640的3個數作為輸出,這樣同時取到三行同一列的三個數據,將這三個數據存入寄存器分別作兩次緩存延遲,從而得到3×3的鄰域數據,根據配置模塊提供的行列計數的最低位來判斷該鄰域中間點所在行和列的奇偶性,從而計算出不同的RGB值。至此,每點圖像數據量變為原來的3倍。為了便于在液晶屏進行圖像顯示的驗證和SDRAM的緩存,在該模塊將RGB數據進行了抽樣處理,采用隔點隔行采樣使得每幀圖像分辨率降為320×240像素。
2.2 緩存模塊
考慮到系統需要緩存的數據量較大,在各種隨機存儲器件中,SDRAM器件價格低、容量大、速度也較快,非常適合用于圖像采集系統。但SDRAM的控制邏輯比較復雜,要求有一個專門的控制器。 緩存模塊是由Sdram控制器,三個FIFO以及分時切換電路組成。SDRAM控制器負責外部SDRAM的讀/寫操作。三個FIFO中Write_FIFO用來數據輸入,Read_FIFO11和Read FIFO2用來數據輸出,容量均為512,位寬設為16 b。考慮到SDRAM只有16 b的位寬,輸入的RGB信號分別只取各自的最高5位。
2.2.1 SDRAM控制器
SDRAM控制器是由命令生成狀態機和數據通道兩個模塊構成。系統的初始化、讀寫和刷新的控制采用有限狀態機來實現。如圖2所示,其狀態轉移系統復位后由復位狀態(Reset)進入初始化(Init)狀態。初始化包含初始化延時、初始化預充電、初始化刷新和初始化模式寄存器設置4個子狀態。初始化時將模式寄存器設置為長度為“1”的突發讀寫方式。設置完模式寄存器后,系統進入空閑狀態。當3個FIFO半滿信號有效后。SDRAM控制器進入行激活狀態,經過兩個周期空操作(ActiveNOP)狀態后進入讀或者寫狀態。
讀數據過程由Read CAS狀態開始,經過CAS延時,進入Read_Data狀態。突發計數器從Read_CAS態開始計數,當計數到讀寫請求的突發長度時,狀態機進入Read_Precharge狀態將打開的行關閉。在圖像采集中,用突發方式存完一行后,下一次存取的將是不同的行。根據這一特點,在SDRAM控制器中進行了優化,在讀寫操作完成后執行自動預充電,將打開的行關閉,將預充電的時間隱藏在數據訪問中,從而提高了SDRAM訪問的速度。寫操作過程由Write_Data和Write_Precharge狀態組成。當激活一行完成后,進入到Write_Data狀態,突發計數器對周期計數,計數到突發長度時,狀態機進入Write_Precharge狀態將打開的行關閉。需要注意的是Read_Precharge和Write_Precharge后都需要兩個空操作才能再打開新的一行。
由于圖像數據流的連續性,每隔65 μs就有一行數據輸入,因此在SDRAM控制器中沒有必要再設置刷新計數器,而是在響應圖像采集數據請求后將采集的一行數據存入SDRAM后對SDRAM進行刷新。由于HY57V641620HG要求在65 ms內完成4 096次刷新,該設計驗證時按照每幀圖像(320×240)×(60幀/s)格式采集,需要在采集一行后完成[1/(60×240)/64]×4 096△4.4次刷新,因此需執行5次刷新操作。在Write_Precharge完成后,如果寫操作是由FIFO半滿信號有效引起的,狀態機將進入自動刷新狀態,完成5次刷新操作后回到Idle狀態。如圖3所示,數據通路模塊受OE信號的控制,使數據的進出和相應的操作指令在時序上同步。OE為1時,數據可由DQ腳寫入SDRAM,OE為0時,數據可從SDRAM的DQ讀出。
經測試SDRAM控制器滿足設計要求,在Model-Sim6.0中其時序仿真波形圖如圖4所示。
2.2.2 幀存分時切換機制
Write_FIFO,Read_FIFO1和Read_FIFO2都是16 b位寬,而SDRAM只有16 b的數據位寬,三個FIFO都要訪問SDRAM,這就涉及到相互競爭的問題,在同一時刻只能有一個訪問SDRAM。為此需要設計一個分時切換機制。由于SDRAM的操作時鐘為100 MHz,而采集像素時鐘為25 MHz,經過抽樣后時鐘頻率更是大大降低。在一次采集周期內,SDRAM完全可以和三個FIFO的接口輪流切換,從而不會影響采集的速度。
如圖5所示,其工作過程為:
(1)圖像經格式轉換模塊輸出,寫入Write_FIFO的輸入端口。
(2)當控制電路檢測到Write_FIFO中讀出端的數據量大于256(三個FIFO容量均為512 word)時,產生寫命令,并擁有寫互斥鎖。SDRAM控制器接到命令,以100 MHz時鐘將256個數據寫入SDRAM。
(3)Write_FIFO輸出256個數據后,讀出端的數據量小于256,并且由于Read_FIFO1中初始狀態的輸入端數據小于256,Read_FIFO1擁有讀互斥鎖,產生讀命令,SDRAM控制器接到命令,以100 MHz時鐘將256個數據讀出,并寫入Read_FIFO1。
(4)當Read_FIFO1收到256個數據,其輸入端數據大于256,并且由于Read_FIFO2中初始狀態的數據小于256,Read_FIFO2擁有讀互斥鎖,產生讀命令,SDRAM控制器將256個數據讀出,并寫入Read_FIFO2。
(5)這樣就完成了一次操作,之后就是循環操作。地址信號也是由控制電路產生,每經過一次讀寫,地址增量為256,這樣就可以保持信號的連續性。
(6)Write_FIFO在一定周期內向SDRAM中連續寫入兩幀連續圖像;Read+FIFO1根據SDRAM中的地址讀取其中的一幀圖像數據;而Read_FIFO2讀取另一幀圖像數據。
通過這個機制,三個FIFO中始終都有數據,不會發生讀空、寫滿情況,使得存儲器兩端的數據讀/寫方便,只要在write FIFO的輸入端和Read—FIF01、Read FIFO2的輸出端進行操作就行,在時鐘的上升沿將數據寫入或輸出,實現了異步方式。
3 運動檢測模塊
該模塊采用幀間差分法,其基本原理是將連續的兩幀或幾幀的圖像對應的像素值相減,在環境亮度變化不大的情況下,如果對應像素值相差很小,則認為此處景物是靜止的,如果圖像區域某處的像素值變化很大,可認為這是由于圖像中運動物體引起的。其算法實現簡單,能夠適應各種動態環境,穩定性較好。
設計中對相鄰兩幀圖像的每個像素RGB分量分別取絕對差值。當絕對差值大于閾值時(這里取經驗值16),就認為存在差異,如果做比較的兩個像素的RGB分量只要有一個分量有差異,則令此點的數值為1,這樣就得到一幅320×240像素大小的二值差值圖像。然后傳統處理方法是統計值為1的點的個數,如果其數量超過預設值,就認為兩幅圖像有差異。這種方法設計簡單,但是準確率還不夠高,為此該設計提出了一種改進的算法,引入了圖像處理常用的兩種操作腐蝕和膨脹。腐蝕與膨脹是一對逆運算,如果先腐蝕再膨脹,便構成了開運算。一般來說,開運算能夠去除孤立的小點,毛刺和小橋(即連通兩塊區域的小點)。而總的位置和形狀不變。
對上述二值圖像進行開運算處理,可以消除小顆粒的噪聲的干擾,從而盡可能降低誤判和漏判。
設計流程如圖6所示,通過調用ALTSHIFTTAPS IP核,并利用輸出TAPS,構建一個11×11像素大小的圖塊作為結構元素,然后腐蝕:
(1)用11×11的結構元素,掃描圖像的每一個像素;
(2)用結構元素與其覆蓋的二值圖像做“與”操作;
(3)如果都為1,結果圖像的該像素為1,否則為0。
接著再將上述結果作為第二個ALTSHIFTTAPS的輸入,再次構建11×11個像素的結構元素,然后進行膨脹處理:
(1)用11×ll的結構元素,掃描圖像的每一個像素;
(2)用結構元素與其覆蓋的二值圖像做“或”操作;
(3)如果都為0,結果圖像的該像素為0,否則為1。
最后得到運動判定信號DETECT,并用這個信號控制數據寫入過程,一旦判定信號為1,就啟動后續的圖像存儲過程。
4 SD卡圖像存儲模塊
(1)接口電路模塊。在各種存儲設備中,SD卡不僅小巧,而且功耗很低,另外市面上常見SD卡的容量可達到2 GB以上,因此非常適合用于對體積和功耗要求嚴格的嵌入式圖像存儲。該設計選用APACER公司的一款高速SD卡(傳輸速率為150X,容量4 GB)。為了增強系統的可擴展性,該設計在FPGA芯片中嵌入Altera公司新近推出的第二代高性能NiosⅡ軟核處理器,其處理能力超過200 MIPS,并在NiosⅡ中完成SD卡驅動程序設計。前端的采集緩存電路與NiosⅡ系統之間的數據和控制信號由定制的接口模塊完成。
定制IP核DATAIN_FIFO是在SoPC Builder環境下完成(如圖7所示),DATAIN_FIFO寫端口的時鐘信號、寫請求信號同步于SDRAM控制模塊的ReadFIFO1,而DATAIN_FIFO的讀端口的時鐘、讀請求信號則由CPU控制。以上信號除了waitrequest之外,都由Avalon交換結構自動產生和控制。waitrequest信號可以直接連接到異步FIFO的rdempty輸出,當FIFO讀空之后,waitrequest有效,插入等待周期,一直到從端口的數據準備好才輸出readdata。開始和結束采集控制信號由DETEcT信號和DMA中斷信號決定,確保采集到的數據剛好為一幀320×240圖像。
由于NiosⅡ系統提供了成熟的SPI接口,所以設計中采用SPI總線協議模式來讀寫SD卡。因為MMC卡在復位階段要求SPI的時鐘頻率要小于等于400 kHz,為了提高讀寫速度,本設計設計的接口不再兼容MMC卡,其設置SPI的SCK引腳的輸出頻率在數據傳輸時設為25 MHz。
(2)BMP圖像文件創建程序。為提高程序運行速度。并考慮到該系統的實際需要,程序只實現了寫BMP圖像文件功能。程序主要由SD卡操作驅動接口函數和文件系統層組成。
驅動函數目的是為文件系統層提供所需的SD卡初始化函數和SD卡寫多塊數據函數。圖8是SD卡寫函數流程圖示意圖。當寫函數接收到主程序的寫文件指令后,就向SD卡發送多塊寫命令,卡將發送給主機一個應答令牌,并且等待主機發送一個發送數據塊來,當應答R1為0時,說明可以發送數據,塊大小設置為512 B。數據塊之后附有16位的CRC校驗,因為CRC校驗計算占用了很大部分發送的時間,該系統采用自定義用戶指令對這部分進行了加速處理。
要使寫入SD卡的數據在裝有Windows或Linux操作系統的上位機中得到正確訪問,需要在SD卡上創建它們支持的文件系統。考慮到FAT12目前已經很少使用,在此設計的文件系統只支持FAT16和FAT32。并且將整個卡作為一個分區處理。
圖9是系統的軟件工作主要流程圖。在主程序中,系統啟動后,先進行初始化操作,包括中斷初始化、文件系統初始化和SD卡底層驅動的初始化。隨后系統進入主循環等待狀態,一旦檢測到DETECT_PIO電平的變化就暫停SDRAM數據寫入,以防SDRAM緩存的圖像數據被覆蓋,同時根據當前的時間創建一個BMP格式的文件,然后往里填寫文件頭和文件信息頭,隨后連續寫一幀RGB數據。文件創建完畢后系統繼續處于檢測等待狀態,并恢復SDRAM數據寫入。
5 系統評價
該設計在自制核心實驗板上(見圖10)進行了軟、硬件仿真和調試,調試環境參數設定如下:采集時鐘頻率為25 MHz,NiosⅡ時鐘頻率為100 MHz、每幀圖像大小為320×240像素。調試結果如下:系統采集速度在60幀/s左右。對五米之內場景動態變化的響應時間在5 ms左右,SD卡保存單幀圖像時間約為9 s(每幀圖像數據量是153 600 B),連續工作一個星期無任何故障發生。結果表明該系統圖像采集和處理速度超過一般的以軟件實現為主的嵌入式圖像采集方案(如ARM處理器系統)。由于核心處理器采用單芯片方案,采集系統比較穩定,同時其功耗大大低于多芯片方案。
6 結 語
在此提出一種基于SoPC技術的圖像檢測、采集和儲存的一體化單芯片控制新型系統集成方案,并實現了原型系統,該系統的主要特點是處理速度快、功耗低、穩定可靠。
該設計可以在進一步工作中移植嵌入式操作系統μCLinux,以實現復雜的多任務操作。因此該設計既可作為獨立的解決方案應用于便攜式原位觀測系統中,同時以其良好的擴展性,也可作為一個子系統應用于大型圖像處理系統的前端部分。
評論
查看更多