1、前言
jpg是一種壓縮的圖片格式,之所以壓縮是為了減小圖片所占空間,jpg壓縮原理這里不羅嗦,可以自行百度或者b站,大佬講的比我好,jpg解壓縮就是逆向過程,用opencv啥的解壓縮就是一句話的事兒,但對于fpga硬件來說就是大型工程了。
本設計使用zynq7100位平臺,將jpg圖片的c語言數組寫入PS側DDR3中緩存作為jpg解碼器的輸入,使用自研的AXI4控制器從DDR3中讀取出jpg圖片數據,并轉換為AXIS數據流送入jpg解碼器解碼為rgb數據輸出,至此,jpg解碼實際已經完成,但為了輸出顯示驗證解碼的效果,再加上基于FDMA的圖像緩存架構將jpg解碼后的rgb數據輸出顯示器顯示,可以直觀的查看顯示器的輸出與原始jpg圖片的差異,以驗證我們設計的正確性。。。。
本文詳細描述了zynq7100位平臺驗證jpg解碼器并將解碼后的rgb數據輸出顯示器顯示的設計方案,工程代碼編譯通過后上板調試驗證,文章末尾有演示視頻,可直接項目移植,適用于在校學生、研究生項目開發(fā),也適用于在職工程師做項目開發(fā),可應用于醫(yī)療、軍工等行業(yè)的數字成像和圖像傳輸領域;
提供完整的、跑通的工程源碼和技術支持;
工程源碼和技術支持的獲取方式放在了文章末尾,請耐心看到最后;
免責聲明
本工程及其源碼即有自己寫的一部分,也有網絡公開渠道獲取的一部分(包括CSDN、Xilinx官網、Altera官網等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個人學習和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導致的法律問題,與本博客及博主無關,請謹慎使用。。。
2、JPG解碼器詳解
JPG解碼器是本設計的核心,其他設計都是圍繞本模塊來設計,目的就是為了驗證本模塊的正確性;
本JPG解碼器具有以下特征:
1:純verilog代碼實現(xiàn),不含有任何IP核;
2:移植性天花板,由于采用純verilog代碼實現(xiàn),可在Xilinx、Altera和國產FPGA (比如紫光同創(chuàng)、安路)等之間任意移植;
3:32bit的AXI4-Stream數據流輸入接口,可處理大批量數據;
4:支持任意分辨率jpg圖片解碼;
5:支持YUV4:4:4、YUV4:2:0色度采樣輸入;
6:支持固定的標準的霍夫曼解碼(減少邏輯資源的使用和更快速解碼);
7:支持動態(tài)霍夫曼解碼(使用更多的邏輯資源和更慢速解碼);
8:動態(tài)DQT;
9:輸出24bit的RGB8:88格式,同時輸出解碼后的圖片寬和高數據;
10:消耗邏輯資源少,具體如下:
jpg解碼器模塊設計框圖如下:
解碼過程就是編碼過程的逆過程,原理可以百度一下或者csdn搜一下,本模塊就是把用c語言或者c++實現(xiàn)的軟件解碼方式用verilog的硬件解碼方式實現(xiàn)了,由于FPGA的并行性,所以解碼速度更快,達到加速的目的。。。
3、設計思路和架構
設計思路和架構如下:
總體流程:
第一步:
下載一張jpg圖片,用Matlab等工具將jpg圖片轉為c語言數組,提供的vivado工程中已包含此文件;
第二步:
用SDK將jpg圖片c語言數組拷貝到PS側DDR3中緩存,作為jpg解碼器的輸入源;
第三步:
AXI4主機控制器和AXI4-Stream主機控制器負責從PS側DDR3中讀取jpg數據,輸出AXI4-Stream數據流給到jpg解碼器;
第四步:
jpg解碼器將AXI4-Stream格式的jpg數據解碼為24bit的RGB數據輸出,一同輸出圖片寬個高信息;至此,jpg解碼實際已經完成,但為了輸出顯示驗證解碼的效果,再加上基于FDMA的圖像緩存架構將jpg解碼后的rgb數據輸出顯示器顯示,可以直觀的查看顯示器的輸出與原始jpg圖片的差異,以驗證我們設計的正確性。。。。
第五步:
使用FDMA數據緩存架構將解碼后的RGB數據緩存至PS側DDR3后再讀出,這里做緩存的原因是做數據跨時鐘處理,jpg解碼后的rgb數據時鐘是100M,而HDMI輸出的像素時鐘是148.5M。。。關于FDMA數據緩存架構,可以參考我之前寫的文章直接點擊此處查看
第六步:
HDMI輸出分辨率使用1920x1080@60Hz,只要jpg圖片分辨率小于1920x1080均可在此背景下輸出,屏幕只會輸出有效的jpg圖片,其他區(qū)域為黑色,這也是我的一大原創(chuàng)。。。需要解碼顯示更大jpg圖片分辨率的朋友可以修改輸出VGA時序,比如改為4K分辨率,則可顯示1920x1080的圖片了。
HDMI發(fā)送沒有使用HPY芯片,而是使用純verilog實現(xiàn)的HDMI發(fā)送驅動,關于這一點,可以參考我之前寫的文章直接點擊此處查看
4、vivado工程詳解
開發(fā)板:Xilinx zynq7100開發(fā)板;
開發(fā)環(huán)境:vivado2019.1;
輸入:jpg圖片;
輸出:HDMI顯示;
工程Block Design如下:
綜合后的工程代碼架構如下:
jpg解碼器源碼如下:
總工程師的資源消耗和功耗預估如下:
注意:這里是整個工程的資源消耗,并非jpg解碼器;
SDK源碼架構如下:
5、上板調試驗證
開發(fā)板如下:
程序調試方法
需要你的板子有個HDMI輸出接口
第一步:
編譯,打開SDK,并進行debug單步調試,如下:
第二步:
選擇你要解碼輸出的jpg圖片分辨率,為了深度測試jpg解碼器的性能,我這里設置了7種不同分辨率的jpg圖片,分別如下:
jpg圖片分辨率:1920x1080;
jpg圖片分辨率:1280x720;
jpg圖片分辨率:800x800;
jpg圖片分辨率:800x600;
jpg圖片分辨率:606x530;
jpg圖片分辨率:474x458;
jpg圖片分辨率:361x458;
下面以1920x1080圖片解碼為例,首先取消上圖中//WR_pic_1920x1080();前面的//,如此就選擇了解碼輸出1920x1080圖片,隨后按照第一步開始單步debug,當dubug到while(1)死循環(huán)里面時,多點幾次,讓程序在while(1)里面多轉幾圈,屏幕就會出現(xiàn)RGB圖片輸出了,while(1)里面的代碼作用是產生觸發(fā)信號開啟jpg解碼器工作。。。
下面看輸出效果:
解碼jpg圖片分辨率1920x1080的輸出:
解碼jpg圖片分辨率1280x720的輸出:
解碼jpg圖片分辨率800x800的輸出:
解碼jpg圖片分辨率800x600的輸出:
解碼jpg圖片分辨率606x530的輸出:
解碼jpg圖片分辨率606x530的輸出:
解碼jpg圖片分辨率606x530的輸出:
下面看視頻演示:
fpga-jpg文章來源:http://www.zghlxwxcb.cn/news/detail-725996.html
6、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網盤鏈接方式發(fā)送,
資料獲取方式:文章末尾的V名片。
網盤資料如下:
具體的文件構成如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-725996.html
到了這里,關于FPGA實現(xiàn)jpeg圖片解碼RGB 純verilog代碼編寫 提供基于zynq得工程源碼和技術支持的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!