0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA通過UDP以太網(wǎng)傳輸JPEG壓縮圖片

OpenFPGA ? 來源:OpenFPGA ? 2024-01-26 09:30 ? 次閱讀

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ù)可以使用以下等式獲得:

15ec461e-bbe3-11ee-8b88-92fbcf53809c.png

其中 k 是系數(shù)的索引。對于 JPEG 變換的情況,因?yàn)樽儞Q應(yīng)用于圖像的 8x8 像素塊,所以 N 始終等于 8。

量化

DCT 應(yīng)用于 8x8 塊時,量化因子會應(yīng)用于系數(shù)。簡而言之,此步驟使用與能量密度相關(guān)的步長對系數(shù)進(jìn)行離散化。低頻系數(shù)以較小的步長量化,因此比以較大步長量化的誤差更小。頻率越高,步長越大,從而降低了不太重要元素的精度。這是壓縮過程中的有損步驟。

15f87e70-bbe3-11ee-8b88-92fbcf53809c.png

盡管 JPEG 壓縮標(biāo)準(zhǔn)沒有指定要使用的量化矩陣,但上面建議的矩陣之一。為了量化 2-D DCT 的結(jié)果,每個系數(shù)除以上面矩陣中的適當(dāng)值,并四舍五入到最接近的整數(shù)。

Zig-Zag 測序

量化后,二維矩陣被重新排列成一維數(shù)組。以給出具有高能量密度的系數(shù)的方式讀取元素。排序以之字形方法完成,使得系數(shù)以遞增的空間頻率順序排列。使用這種方法,更重要的系數(shù)出現(xiàn)在序列中較早的位置,而不太重要的系數(shù)則出現(xiàn)在較晚的位置。

15ffc306-bbe3-11ee-8b88-92fbcf53809c.png

可變大小、行程長度編碼

假設(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)圖如下所示:

160c0350-bbe3-11ee-8b88-92fbcf53809c.png

因?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ù)的比例因子如下:

162b2dca-bbe3-11ee-8b88-92fbcf53809c.png

算法數(shù)據(jù)流如下圖所示。

1637ab72-bbe3-11ee-8b88-92fbcf53809c.png1653848c-bbe3-11ee-8b88-92fbcf53809c.png

該模塊是按照流水線設(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)目。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 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
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    322

    瀏覽量

    33849

原文標(biāo)題:FPGA 通過 UDP 以太網(wǎng)傳輸 JPEG 壓縮圖片

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    谷歌用人工智能模擬人腦壓縮圖片 效果超JPEG

    8月24日晚間消息,谷歌正在研發(fā)一項(xiàng)新技術(shù),利用神經(jīng)網(wǎng)絡(luò)模擬人腦的工作方式去壓縮圖片。這項(xiàng)技術(shù)能在確保圖片質(zhì)量的同時,大大降低圖片文件的體積。
    發(fā)表于 08-25 10:35 ?985次閱讀

    STM32H743通過以太網(wǎng)連續(xù)發(fā)送圖片,一段時間后,發(fā)送會很慢的原因?

    我用的芯片是STM32H743+LAN8742,在這個平臺上實(shí)現(xiàn)攝像頭圖片采集壓縮JPEG格式,然后通過以太網(wǎng)(LWIP)的netconn
    發(fā)表于 04-19 07:44

    AC6102 開發(fā)板千兆以太網(wǎng)UDP傳輸實(shí)驗(yàn)

    本帖最后由 芯航線跑堂 于 2016-12-19 00:20 編輯 AC6102 開發(fā)板千兆以太網(wǎng)UDP傳輸實(shí)驗(yàn) 在芯航線AC6102開發(fā)板上,設(shè)計(jì)了一路GMII接口的千兆以太網(wǎng)
    發(fā)表于 12-15 15:01

    【AC620 FPGA開發(fā)板試用預(yù)熱貼】自寫以太網(wǎng)傳輸代碼,實(shí)現(xiàn)以太網(wǎng)的圖像采集傳輸【小梅哥力作】

    攝像頭的相關(guān)對比介紹。關(guān)于圖像傳輸 AC620開發(fā)板上有一個百兆以太網(wǎng)PHY芯片RTL8201,對FPGA提供MII接口,使用該芯片,我們可以自己編寫以太網(wǎng)MAC層,然后使用MII接
    發(fā)表于 06-14 11:51

    MT9V011以太網(wǎng)傳輸顯示

    1. 概述本設(shè)計(jì)采用FPGA技術(shù),將CMOS攝像頭(DVP接口)的視頻數(shù)據(jù)采集,并通過以太網(wǎng)傳輸(UDP方式)給PC機(jī),上位機(jī)DEMO
    發(fā)表于 10-09 09:55

    請問以太網(wǎng)UDP協(xié)議傳輸速度能達(dá)到多少?

    我用STM32F107+dp83848方案做以太網(wǎng)傳輸數(shù)據(jù),用的UDP協(xié)議,但是經(jīng)測試傳輸速度才45KB/s左右,跟理論速度差太遠(yuǎn)了吧我想問一些有沒有誰做過這個方案的,
    發(fā)表于 08-05 22:38

    AC6102開發(fā)板千兆以太網(wǎng)UDP傳輸實(shí)驗(yàn)分享!

    AC6102 開發(fā)板千兆以太網(wǎng)UDP傳輸實(shí)驗(yàn)在芯航線AC6102開發(fā)板上,設(shè)計(jì)了一路GMII接口的千兆以太網(wǎng)電路,通過
    發(fā)表于 10-18 02:15

    簡談基于FPGA的千兆以太網(wǎng)設(shè)計(jì)

    以太網(wǎng)是一個描述各種以吉比特每秒速率進(jìn)行以太網(wǎng)傳輸技術(shù)的術(shù)語,由IEEE 802.3-2005標(biāo)準(zhǔn)定義。該標(biāo)準(zhǔn)允許通過集線器連接的半雙工千兆連接,但是在市場上利用交換機(jī)的全雙工連接所
    發(fā)表于 06-01 18:39

    一種基于FPGA以太網(wǎng)高速傳輸平臺

    一種基于FPGA以太網(wǎng)高速傳輸平臺,采用DM9000和FPGA芯片,實(shí)現(xiàn)100M以太網(wǎng)數(shù)據(jù)傳輸
    發(fā)表于 02-25 14:45 ?17次下載

    C#教程之壓縮圖片

    C#教程之壓縮圖片,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 11:13 ?3次下載

    谷歌人工智能模擬人腦壓縮圖片,效果居然比JPEG還好

    谷歌正在研發(fā)一項(xiàng)新技術(shù),利用神經(jīng)網(wǎng)絡(luò)模擬人腦的工作方式去壓縮圖片。
    發(fā)表于 08-25 09:03 ?557次閱讀

    以太網(wǎng)的傳播速率_以太網(wǎng)傳輸介質(zhì)

    本文首先介紹了以太網(wǎng)的傳播速率,其次介紹了千兆以太網(wǎng)傳輸速度,最后介紹了以太網(wǎng)傳輸介質(zhì)。
    發(fā)表于 03-20 10:12 ?7144次閱讀

    基于FPGAUDP千兆以太網(wǎng)光通信

    本文介紹一個FPGA開源項(xiàng)目:UDP千兆以太網(wǎng)光通信。利用SFP接口,可以通過使用SFP轉(zhuǎn)RJ45模塊或者直接使用光纖進(jìn)行以太網(wǎng)通信。
    的頭像 發(fā)表于 08-31 11:26 ?4265次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>UDP</b>千兆<b class='flag-5'>以太網(wǎng)</b>光通信

    基于FPGAUDP RGMII千兆以太網(wǎng)通信方案

    本文介紹一個FPGA開源項(xiàng)目:UDP RGMII千兆以太網(wǎng)通信。該項(xiàng)目在我之前的工作中主要是用于FPGA和電腦端之間進(jìn)行圖像數(shù)據(jù)傳輸。本文簡
    的頭像 發(fā)表于 09-04 16:49 ?1487次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>UDP</b> RGMII千兆<b class='flag-5'>以太網(wǎng)</b>通信方案

    基于MM32F3270以太網(wǎng)UDP使用

    基于MM32F3270以太網(wǎng) UDP使用
    的頭像 發(fā)表于 09-27 15:42 ?448次閱讀
    基于MM32F3270<b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>UDP</b>使用