簡介
在 FPGA 上實現了 JPEG 壓縮和 UDP 以太網傳輸。從攝像機的輸入中獲取單個灰度幀,使用 JPEG 標準對其進行壓縮,然后通過UDP以太網將其傳輸到另一個設備(例如計算機),所有這些使用FPGA(Verilog)實現。
本文是常春藤盟校Cornell University 康奈爾大學的FPGA項目,僅供參考學習~
理論背景
JPEG 圖像壓縮是一種有損壓縮標準,它使用 DCT 變換及其相關屬性來減少用于表示圖像的位數。編碼過程涉及許多步驟,在我們的設計中將其分解為幾個獨立模塊。此外,為了驗證壓縮的正確性,還為系統設計了UDP以太網傳輸。
離散余弦變換
離散余弦變換 (Discrete Cosine Transform, DCT)類似于傅里葉變換將周期函數表示為不同頻率的正弦之和,其可以將有限長度的數字序列表示為不同頻率的余弦項的總和。DCT,更具體地說是DCT-II,由于其高能量壓縮特性而被用于圖像壓縮。簡而言之,大部分數據(或原始信息)可以被壓縮為更少的比特數。
JPEG 壓縮的第一步是將相關圖像分割成 8x8 的像素塊。然后將 2D-DCT 應用于每個 8x8 塊。2-D DCT 的結果表示原始塊在與矩陣索引相對應的離散頻率處的空間頻率信息。變換后,左上系數給出空間DC信息,右下系數給出最高空間頻率(水平和垂直方向)信息。
注意,左上元素在水平和垂直方向上的空間頻率較低,而右下元素的頻率較高。使用 DCT,大多數原始信息可以從較低頻率系數(靠近左上角的系數)重建,因為這些系數中的高能量壓縮。此外,人類視覺系統對高頻空間內容中的錯誤的感知能力較差。這兩個原因疊加在一起意味著低頻系數中的誤差比高頻元素中的誤差對人類來說更加明顯。
2-D DCT 運算是可分離的,意味著它可以通過對正在分析的塊(8x8)應用兩次 1-D DCT 來獲得。首先對塊的每一行執行一維變換,然后對行變換結果的列再執行一維變換。一維 DCT 系數可以使用以下等式獲得:
其中 k 是系數的索引。對于 JPEG 變換的情況,因為變換應用于圖像的 8x8 像素塊,所以 N 始終等于 8。
量化
DCT 應用于 8x8 塊時,量化因子會應用于系數。簡而言之,此步驟使用與能量密度相關的步長對系數進行離散化。低頻系數以較小的步長量化,因此比以較大步長量化的誤差更小。頻率越高,步長越大,從而降低了不太重要元素的精度。這是壓縮過程中的有損步驟。
盡管 JPEG 壓縮標準沒有指定要使用的量化矩陣,但上面建議的矩陣之一。為了量化 2-D DCT 的結果,每個系數除以上面矩陣中的適當值,并四舍五入到最接近的整數。
Zig-Zag 測序
量化后,二維矩陣被重新排列成一維數組。以給出具有高能量密度的系數的方式讀取元素。排序以之字形方法完成,使得系數以遞增的空間頻率順序排列。使用這種方法,更重要的系數出現在序列中較早的位置,而不太重要的系數則出現在較晚的位置。
可變大小、行程長度編碼
假設高頻系數使用較大的步長進行量化,這些系數為零的可能性比低頻系數高得多。這對零值系數的候選進行了分組,使我們能夠假設一系列零的可能性。
JPEG 標準壓縮的主要來源是可變大小和行程長度編碼。壓縮中的此步驟使用霍夫曼編碼和可變長度編碼的組合。每個非零系數都被轉換為可變長度的位串或代碼。該代碼包含其數量和長度信息(即 0 與 00 不同)。
如前所述,之字形組織增加了連續零的可能性,尤其是在數組末尾附近。為了避免發送連續的零,前面的零的行程長度被編碼到每個非零系數的轉換中。每個非零系數都被編碼為可變長度代碼,以及指示前面的零游程的“標頭”霍夫曼代碼以及 VL 代碼的長度。鏈接(https://people.ece.cornell.edu/land/courses/ece5760/FinalProjects/f2009/jl589_jbw48/jl589_jbw48/trans_tables.html)顯示了像素轉換表和霍夫曼表 。這些轉換表僅適用于圖像的亮度值。由于我們的系統處理灰度圖像,所以無需改變方案,但是對于彩色圖像使用的色度值有不同的轉換方案。
無論長度如何,霍夫曼碼都是唯一可識別的,因此在不知道長度的情況下始終可以識別新非零值的零行程和大小。然后,使用霍夫曼給出的大小,可以提取以下 VL 位并將其轉換回適當的非零系數。除非事先知道代碼的長度,否則 VL 代碼無法唯一識別。
DC與AC系數
DC 系數的編碼與 AC 系數略有不同。由于 DC 系數不會有前面的零(這些零不會在塊之間傳遞),因此霍夫曼碼僅反映 VL 碼的長度。
以太網
在開放系統互連參考模型(Open System Interconnection Reference Model,OSI 模型)中,以太網位于鏈路層和物理層。在物理層,以太網描述了線路如何互連。在鏈路層,以太網指定以太網幀應如何格式化以及幀應如何傳送。
由于以太網本質上是一種廣播協議,可能有許多設備連接到同一物理線路,因此一次只能有一個設備進行廣播。如果線路發生沖突,以太網控制器能夠檢測到沖突并執行隨機退避。隨機退避僅僅意味著在檢測到沖突時,在嘗試另一次發送之前等待隨機的時間。以太網幀由前導碼、幀起始定界符、MAC 目標、MAC 源、以太網類型、有效負載和校驗和組成。
關于以太網的介紹可以查看《基于FPGA的網口通信實例設計總結》。
用戶數據報協議/互聯網協議
用戶數據報協議 (UDP) 和互聯網協議 (IP) 分別位于 OSI 模型的接下來兩層:傳輸層和網絡層。UDP/IP 協議與以太網一樣,不保證可靠的數據包接收,只能保證盡力傳送。IP 協議的主要目的是在鏈路層之上提供一個抽象層。這樣,如果底層鏈路層不是以太網,則不需要更改應用層軟件。IP 協議通過另一對源地址和目標地址、分段偏移、標頭校驗和以及有效負載中使用的協議來提供此抽象。
設計
代碼高度模塊化,輸出饋送到successive模塊的輸入中。編碼步驟分為以下步驟(每個步驟都在單獨的模塊中實現):1-D DCT、2-D DCT/量化、zig-zag 組織、VL 轉換、Huffman 轉換和比特流構建。該系統目前可以實現 256x256 圖像,但可以擴展分析更多像素。數據架構圖如下所示:
因為僅涉及灰度成像,所以只需要彩色系統所需的三分之一的內存和處理能力。對于處理彩色圖像的系統,需要將上述整個壓縮過程單獨應用于每個顏色通道。該項目通過選擇每個像素的綠色值來獲得灰度圖像,而不是從 RGB 到 YUV 的轉換。這種簡化雖然并不完全正確,但該項目的重點不是圖像,而是壓縮,因此沒有必要在轉換操作上浪費額外的計算。
1-D DCT
1-D DCT 使用快速算法實現,需要八個周期才能完成。該算法主要需要輸入和結果總和的連續相加,其中三個中間步驟期間發生五次乘法。該算法產生 DCT 結果,結果是根據實際 DCT 結果按某個因子縮放的。然而,可以在量化步驟中考慮比例,從而產生正確的量化變換矩陣。系數的比例因子如下:
算法數據流如下圖所示。
該模塊是按照流水線設計,所以每個時鐘周期都可以輸入新的輸入值,并在八個周期后輸出新的輸出。這使得模塊能夠更快地進行數據處理。
2-D DCT
2-D DCT 是可分離運算,意味著它可以通過對 8x8 塊的每一行應用 1-D DCT,然后再將其應用于 8x8 塊的列來獲得最終結果。使我們能夠使用流水線 1-D DCT 非??焖俚貓绦?2-D DCT,方法是將塊的行饋送到 1-D 模塊中 8 個周期,然后獲取結果并將這些列反饋回同一模塊。
在將結果寫回內存之前,也會在此 2D 模塊中執行量化。由于算法的縮放與量化相結合的方式,整個操作僅需要對二維算法結果進行移位。
Zig-Zag
通過適當的順序從內存中讀取值來實現Zig-Zag。塊的元素存儲在直接從圖像內像素坐標獲得的地址中。存儲器的輸出以每周期一個像素的速率直接饋送到轉換器中。
VL 和 RL
從像素的量化值到可變長度代碼的轉換是使用查找表完成的。該表包含代碼的值和長度(以bit為單位)。然后這兩個值被發送到霍夫曼翻譯器?;舴蚵D換器采用前面的零數量和系數代碼的大小。這兩個數字被饋送到另一個查找表,該查找表給出霍夫曼代碼作為非零系數的“標頭”。
硬件以太網控制器
硬件以太網控制器用于初始化 DM9000A 控制芯片、向 DM9000A 推送數據包、從 DM9000A 抓取接收到的數據以及從 DM9000A 接收中斷。
控制器分為兩個獨立的狀態機,一個處理發往 DM9000A 和來自 DM9000A 的命令(包括中斷),另一個處理發送和接收序列。
發送序列包括:
等待輸入 FIFO 不為空。將第一個值存儲為有效負載中的字節數。
告訴硬件控制器將存儲多少字節,包括以太網標頭。
將以太網幀作為數據發送到DM9000A。
將負載發送到DM9000A。
通過中斷等待傳輸完成。返回空閑狀態。
UDP
使用FIFO數據結構,UDP Wrapper 首先獲取有效負載中的字節總數,然后一次獲取 16 位的有效負載。Wrapper 使用狀態機執行以下步驟來發送單個 UDP 數據包:
等待輸入 FIFO 不為空。將第一個值存儲為有效負載中的字節數。
告訴硬件控制器將存儲多少字節,包括 UDP/IP 標頭。
將以太網幀作為數據發送到硬件控制器。
將IP 標頭作為數據發送到硬件控制器。IP 校驗和是在發送標頭之前計算的。
將UDP 標頭作為數據發送到硬件控制器。
將所有數據發送到硬件控制器。
由于 UDP Wrapper 的目的是讓 FPGA 能夠與通過以太網直接連接的單臺計算機進行通信,因此許多值都被硬編碼到 Verilog 中。硬編碼值包括目標和源 MAC 地址、目標和源 IP 地址以及目標端口。這四個硬編碼值均設置為廣播地址,MAC 地址為 FFFFFF:FF,IP 地址為 255.255.255.255。目標端口被硬編碼為 31373。其他值(例如 IP 標頭校驗和)是動態計算的,因為標頭值不一定每次都相同。完成后,控制寄存器復位并返回等待狀態。
結論
盡管我們無法讓最終所需的系統運行,但我們確實創建了可以與各種其他應用程序相關的可用功能模塊。UDP 包裝器和硬件以太網控制器在任何網絡通信項目中都非常有用。流水線式一維 DCT 算法可用于信號和圖像處理項目。
審核編輯:湯梓紅
-
FPGA
+關注
關注
1643文章
21954瀏覽量
613932 -
以太網
+關注
關注
40文章
5582瀏覽量
174721 -
計算機
+關注
關注
19文章
7626瀏覽量
90136 -
UDP
+關注
關注
0文章
330瀏覽量
34470
原文標題:FPGA 通過 UDP 以太網傳輸 JPEG 壓縮圖片
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論