圖像采集和處理已經成為了現代工業控製中必不可少的環節。傳統的方法一般采用的是圖像采集卡加工控機來實現整個係統。但隨著嵌入式技術的發展,芯片的性能大大增強,嵌入式係統在工業控製係統中普及。作為前端的圖像采集係統此時就不適宜再以圖像采集卡的形式出現,而應當以更加簡捷,方便的接口與主係統相連。
本設計使用Alera的FPGA實現了整個圖像采集係統。整個係統完成了圖像的采集、壓縮和傳輸。係統采用流行的工業總線CAN做為其傳輸總線,不僅接口簡易,成本低,而且可靠性較高。
係統描述
本設計中圖像采集係統預期的目標是每秒采集2~3幅30萬像素(640×480)的圖像,壓縮後通過CAN總線進行傳輸。按照1:8的壓縮比計算,壓縮後每幀數據量大約為0.3Mb,CAN總線峰值傳輸速度是1Mb/s,因此這樣的一個總體的設計方案是可行的。
根據係統所實現的功能,決定整個係統要包括六大模塊,分別是圖像采集及存儲接口、I2C主控製模塊(對SAA7113H進行配置)、JPEG編碼器、CAN總線控製器、Wishbone總線和中央控製模塊。圖1為係統的結構框圖。

圖1 係統結構框圖
攝像頭產生的原始模擬圖像數據流首先通過SAA7113H轉換為數字信號,並攜帶有一定的同步及控製信息,傳入FPGA內部異步FIFO內。圖像采集及存儲接口從異步FIFO讀取數據並分析,提取所需要的保存至外部SRAM中,當存滿一幀數據時,便可以進行壓縮了。當JPEG編碼模塊壓縮好數據後,便等待CAN總線進行傳輸,最後直至整幀數據處理完畢。

整個係統的實現大約是60~100萬門左右,因此可以采用Altera CycloneII係列中器件的EP2C20,它擁有2萬個LE,24萬左右的存儲單元和52個乘加單元。係統Fitter之後的結果如表1所示,占用了芯片63%的邏輯資源和12%存儲資源。在這其中,JPEG編碼模塊以及JPEG模塊與Wishbone總線的接口占用了絕大多數部分資源。可以看出,使用EP2C20實現本文所描述的係統還是非常富餘的。

圖2 PCB調試樣板
圖2為最後製成的樣板,這塊樣板上還包括了一些便於調試和其他研發目的的額外部件,真正產品的PCB板將會更加小巧。
視頻信號采集及存儲接口
本設計采用Phillips的SAA7113H芯片做模擬視頻信號的采集。它的功能非常強大,最多可同時采集4路CVBS格式的視頻數據。它通過VPO口輸出數據,並支持多種視頻格式輸出,同時在輸出數據流中包含同步信息和場信息,接口比較簡單。
VPO的數據輸出與27M時鍾同步的,這與JPEG encoder采用30M內部係統時鍾處於兩個時鍾域。因此,使用異步FIFO進行跨時鍾域的數據傳遞。
數據采集以後便是對其進行識別和存儲。從SAA7113H傳出數據的最小單位是一個掃描行,以0xFF 0x00 0x00為標識,並且在行首尾分別有SAV(start of active video)和EAV(end of active video)字段。SAV和EAV中含有該掃描行是否是有效行,屬於第幾場這樣的信息。JPEG編碼器需要的數據是一整幅圖像,即一個場對。因此對采集的圖像,需要使用幀解碼(Frame Decoder)子模塊處理原始數據流中的同步信息,垂直掃描消隱信號。
本設計的存儲器件使用了一塊4Mb的SRAM,正好可以保存一副未經壓縮的30萬像素的圖片。對SRAM存儲和讀取地址的產生應該完全采用不同的方式,在本設計中分別采用兩個子模塊分別負責這兩項功能。Frame Decoder輸出的數據在存入SRAM時是按照行的順序逐個存入,而JPEG encoder在讀取的時候則應該是按照對像素處理順序――以8×8塊的方式讀出。整個讀寫由控製狀態機(Read &Write Control)來進行統一控製。視頻采集及存儲接口的結構圖如圖3所示。

圖3 視頻采集及存儲接口模塊
JPEG壓縮模塊
JPEG壓縮標準從1993年提出至今已有14年了,從各個方麵來看都已經非常成熟,並且被廣泛的使用於各個領域,這也正是本設計采用JPEG壓縮模式的原因之一。JPEG壓縮的過程包括了8×8 DCT(離散餘弦變換)、Zig-Zag掃描、量化、遊程編碼和熵編碼(使用Huffman編碼)五個主要的過程。本設計中的JPEG壓縮模塊除了包括這五大部分之外還要有字節分包處理、字節碼處理(主要是插入一些特殊的碼字)、FIFO、wishbone總線接口和配置寄存器等一些功能模塊來協調整個係統的運作。該模塊的結構如圖4所示。

圖4 JPEG壓縮模塊結構圖
Huffman編碼出來的數據是變長碼,它包括了兩部分,即碼字本身和碼字長度。在Byte Pack模塊中,根據碼字的長度對碼字進行適當的移位,然後整理成8位長度,送入Byte Code Insetion模塊。該模塊根據碼字的實際值進行判斷,如果當前碼字的值是FF,便在其後插入0x00,如果當前碼字是本幀最後一個碼字的話,便在其後插入0xFFD9(0xFFD9是JPEG圖像標準中的結束標誌)以標示該幀的完結。這樣在接收端中就可以用0xFFD9對數據流中每一幀壓縮的數據進行分割。最後處理好的字節流將送入FIFO中,以等待CAN總線空閑。
另外,還有Control Regs模塊,可以使用總控製器通過Wishbone Bus對其中的功能寄存器進行修改,進而操控整個JPEG編碼的過程。這個操作必不可少,隻有使JPEG編碼具有可控性,才能協調采集、壓縮、傳輸等環節的順利進行。
係統控製模塊
本係統的大部分功能都采用硬件進行實現,因此,軟件的控製流程就變的非常簡單,僅僅包括了對各個模塊進行初始化配置和控製協調各個模塊。本設計中的控製模塊采用了微碼狀態機替代了微處理器核,不僅可以節約邏輯成本(包括微碼在內,僅有216個LE),還提高了運行效率。微碼狀態機的實現是根據係統的具體要求,對處理器的體係結構進行簡化,本設計所實現的微碼狀態機在功能上相當於一個隻有mov和jump指令的處理器。另外,微碼的使用本身就增加了該模塊的靈活性,想修改整個係統配置或者工作的過程的話並不需要修改模塊的代碼,而隻是修改微碼便可以,大大增加了可重用性。整個係統的控製流程如圖5所示。

圖5 係統工作流程
本設計的係統圖像采集壓縮速度都要大於CAN總線的傳輸速度,因此隻有第一次向CAN總線發送數據時需要判斷壓縮的數據是否已經達到8字節,以後每次當CAN傳輸完上一次壓縮數據時,JPEG encoder已經又一次壓縮好8字節數據,等待傳輸了,因此就不必每次都進行判斷。
Wishbone總線與開源IP
係統中各模塊的互連采用的是比較簡單的Wishbone總線。Wishbone總線標準是開放式總線,沒有任何專利費用,它現在由opencore維護,並且在opencore的網站上有很多由專人維護並且與Wishbone兼容的開源IP。本設計中的I2C master和CAN controller就是從opencore上免費獲得的開源IP。合理的使用這些軟核,並將其集成於自己的係統中將大大加快整個設計的進程和產品的成本。
在係統中存在1個主設備(master)和3個從設備(slave),為每個slave分配好固定的地址,因此Wishbone總線模塊所做的事情僅僅是進行地址譯碼。
係統驗證與仿真
雖然本設計所構建的SOC係統是基於FPGA的,但是在上板調試前首先在PC上建立整個係統的仿真環境,對係統進行充分的驗證,這樣可大大的加速整個項目的進度。本設計中為係統建立的仿真環境如圖6所示。

圖6 驗證環境
準備原始數據做為係統圖像源的輸入,並且使用Can Receiver采集係統的輸出,最後和軟件模型生成的JPEG壓縮數據進行比對,對錯誤進行定位,另外也可在係統中設置監控點,輸出數據流,這樣便可知道具體在哪一個環節中出現了錯誤。圖7為運行testbench產生的接收數據波形文件。

圖7 數據波形
總結
在本設計中,筆者使用FPGA構建了一個SOC係統,完成了圖像的采集、壓縮和傳輸功能,很多地方還可以進一步的優化。本設計的重點在於在FPGA上應用了SOC的設計方法,並實現了一個比較簡單的SOC係統。這樣做繞過了ASIC設計的高複雜性,高風險性和高投入,從而實現了簡化最終PCB係統,降低硬件成本的目的,並且對係統的實現更加靈活,能按照客戶的願望定製,修改係統的功能。另外在整個設計過程中,盡量的應用可重用的IP軟核,最大限度的加快了開發進度和降低了開發費用和成本。
現在,FPGA廠商已推出65nm最新工藝的器件,使集成度進一步提高,而功耗和成本又大幅度降低。在這樣的環境下,相信在不久的將來FPGA會不僅僅隻作為協處理器的配角出現,而是更多的出現以FPGA實現的SOC係統。