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