目錄
- 1、前言
- 工程概述
- 免責聲明
- 2、相關方案推薦
- 我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目
- 我這里已有的 MIPI 編解碼方案
- 我這里已有的視頻圖像編解碼方案
- 3、詳細設計方案
- 設計框圖
- FPGA開發板
- IMX317攝像頭
- MIPI D-PHY
- MIPI CSI-2 RX Subsystem
- 圖像預處理
- Sensor Demosaic 圖像格式轉換
- Gammer LUT 伽馬校正
- Video Processing Subsystem 圖像縮放
- Video Frame Buffer Write 圖像緩存
- Zynq UltraScale+ VCU H265 視頻壓縮
- 工程源碼架構
- PetaLinux 工程編譯
- VLC播放器
- 4、Vivado工程源碼詳解
- 5、工程移植說明
- vivado版本不一致處理
- FPGA型號不一致處理
- 其他注意事項
- 6、上板調試驗證并演示
- 準備工作
- 配置Xshell
- 配置開發板IP
- 配置MIPI CSI-2 RX Subsystem
- 配置Sensor Demosaic
- 配置Gamma LTU
- 配置Video Processing Subsystem
- 配置H265視頻壓縮
- 配置VLC播放器
- VLC播放H265碼流視頻演示
- 7、福利:工程源碼獲取
FPGA實現4K MIPI視頻解碼H265壓縮網絡推流輸出,基于IMX317+VCU架構,支持4K60幀,提供工程源碼和技術支持
1、前言
Xilinx系列FPGA實現MIPI視頻解碼現狀:
MIPI視頻解碼分為D-PHY和CSI-2兩大部分,其中D-PHY屬于物理層,依托硬件,靈活性不高,方案不多;CSI-2屬于協議層,依托代碼,靈活性很高,方案很多;所以只要實現了D-PHY,MIPI-CSI解碼其實就很靈活了;
目前Xilinx系列FPGA實現提供了多種MIPI D-PHY方案;第一種是使用專用的D-PHY芯片實現D-PHY功能,比如MC20901,該方案優點是設計簡單,缺點是硬件成本較高;第二種是使用權電阻網絡實現D-PHY功能,該方案是Xilinx官方推薦的一種簡單、低速的D-PHY方案,通常用于測試,該方案優點是電路簡單,硬件成本低,缺點是性能適中,無法用于高端場景;第三種是使用軟核IP實現D-PHY功能,但該方案僅限于UltraScale+和Zynq UltraScale+高端系列FPGA,該方案優點是設計簡單,缺點是硬件成本極高;然后D-PHY信號進入Xilinx官方的MIPI CSI-2 RX Subsystem IP實現CSI功能,即實現MIPI視頻解碼,另外,也可以使用自己寫的CSI模塊實現CSI功能;本設計使用UltraScale+和Zynq UltraScale+高端系列FPGA,所以無需考慮D-PHY部分;
Xilinx系列FPGA實現H265視頻壓縮現狀:
目前Xilinx系列FPGA實現H265視頻壓縮目前有2種方案,第一種方案是使用自己寫的H265視頻壓縮模塊實現,該方案對開發人員的技術要求及其高,目前99.999%的人都不具備此等水平,H265視頻壓縮模塊配合Xilinx系列FPGA的PetaLinux可實現完美的視頻壓縮,該方案優點是設計靈活,對FPGA型號要求不高,可選擇性更多,硬件成本較低,缺點是實現難度堪稱宇宙級;第二種方案是使用Xilinx官方的VCU IP核,該方案優點是設計簡單,對開發者的技術要求較低,上手快,項目部署快,缺點是對FPGA型號要求很高,目前僅有Zynq UltraScale+MPSoCs的EV系列FPGA支持,可選擇性更少,硬件成本很高;本設計采用Xilinx官方的VCU IP核實現H265視頻壓縮;
工程概述
本設計采用Zynq UltraScale+MPSoCs–XCZU4EV的高端型號FPGA實現4K MIPI視頻解碼H265壓縮網絡推流輸出;視頻輸入源為IMX317 MIPI攝像頭,FPGA首先對攝像頭進行i2c初始化配置,將IMX317 輸出分辨率配置為3840x2160@30Hz,MIPI-4 Lane輸出模式;然后MIPI視頻送入Xilinx官方的MIPI CSI-2 RX Subsystem IP核實現D-PHY+CSI功能;然后調用圖像預處理模塊實現視頻剪裁和RAW12轉RAW8功能;然后視頻送入Xilinx官方的Sensor Demosaic IP核實現RAW8轉RGB888功能;然后視頻送入Xilinx官方的Gamma LTU實現伽馬校正功能;然后送入Xilinx官方的Video Processing Subsystem IP核實現視頻實時縮放;然后調用Xilinx官方的Video Frame Buffer Write IP核將圖像寫入PS側的DDR4中緩存;然后然后調用Xilinx官方的Zynq UltraScale+ VCU IP核讀出圖像并作H265壓縮;至此,整個FPGA工程已經完成;然后編譯工程,導出.xsa文件,并在PetaLinux中做嵌入式Linux啟動文件,在Linux軟件設計中,將壓縮的H265視頻碼流通過TCP協議從網口發送出去,在PC端可通過LVC播放器播放壓縮的H265碼流;然后將做好的Linux啟動文件復制到TF卡中,插上TF卡即可啟動Linux系統,在Xshell中即可操作終端進行配置;
本設計提供資源如下:
? 提供一套XCZU4EV開發板
? 提供一套Vivado2020.2版本的工程源碼
? 提供一套編譯好的固件,可啟動Linux系統
本博客詳細描述了Xilinx系列Zynq UltraScale+MPSoCs–XCZU4EV的高端型號FPGA實現4K MIPI視頻解碼H265壓縮網絡推流輸出的設計方案,工程代碼可綜合編譯上板調試,可直接項目移植,適用于在校學生、研究生項目開發,也適用于在職工程師做學習提升,可應用于醫療、軍工等行業的高速接口或圖像處理領域;
提供完整的、跑通的工程源碼和技術支持;
工程源碼和技術支持的獲取方式放在了文章末尾,請耐心看到最后;
免責聲明
本工程及其源碼即有自己寫的一部分,也有網絡公開渠道獲取的一部分(包括CSDN、Xilinx官網、Altera官網以及其他開源免費獲取渠道等等),若大佬們覺得有所冒犯,請私信批評教育;部分模塊源碼轉載自上述網絡,版權歸原作者所有,如有侵權請聯系我們刪除;基于此,本工程及其源碼僅限于讀者或粉絲個人學習和研究,禁止用于商業用途,若由于讀者或粉絲自身原因用于商業用途所導致的法律問題,與本博客及博主無關,請謹慎使用。。。
2、相關方案推薦
我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目
其實一直有朋友反饋,說我的博客文章太多了,亂花漸欲迷人,自己看得一頭霧水,不方便快速定位找到自己想要的項目,所以本博文置頂,列出我目前已有的所有項目,并給出總目錄,每個項目的文章鏈接,當然,本博文實時更新。。。以下是博客地址:
點擊直接前往
我這里已有的 MIPI 編解碼方案
我這里目前已有豐富的基于FPGA的MIPI編解碼方案,主要是MIPI解碼的,既有純vhdl實現的MIPI解碼,也有調用Xilinx官方IP實現的MIPI解碼,既有2line的MIPI解碼,也有4line的MIPI解碼,既有4K分辨率的MIPI解碼,也有小到720P分辨率的MIPI解碼,既有基于Xilinx平臺FPGA的MIPI解碼也有基于Altera平臺FPGA的MIPI解碼,還有基于Lattice平臺FPGA的MIPI解碼,后續還將繼續推出更過國產FPGA的MIPI解碼方案,畢竟目前國產化方案才是未來主流,后續也將推出更多MIPI編碼的DSI方案,努力將FPGA的MIPI編解碼方案做成白菜價。。。
基于此,我專門建了一個MIPI編解碼的專欄,并將MIPI編解碼的博客都放到了專欄里整理,對FPGA編解碼MIPI有項目需求或學習興趣的兄弟可以去我的專欄看看,專欄地址如下:
點擊直接前往專欄
我這里已有的視頻圖像編解碼方案
我這里有圖像的JPEG解壓縮、JPEG-LS壓縮、H264編解碼、H265編解碼以及其他方案,后續還會出更多方案,我把他們整合在一個專欄里面,會持續更新,專欄地址:
直接點擊前往
3、詳細設計方案
設計框圖
本設計使用的工程詳細設計方案框圖如下:
FPGA開發板
本UP主有下列FPGA開發板均可實現4K@60Hz視頻 HDMI2.0的收發,本博客僅僅是介紹了其中Zynq UltraScale+系列的開發板實現方案,關于本博客使用的這款開發板詳細信息,請參考我之前的博客,對這塊開發板感興趣的朋友可以咨詢本UP獲得;博客鏈接如下:
點擊直接前往
IMX317攝像頭
視頻輸入源為IMX317 MIPI攝像頭,FPGA首先對攝像頭進行i2c初始化配置,將IMX317 輸出分辨率配置為3840x2160@30Hz,MIPI-4 Lane輸出模式;IMX317 i2c配置在vitis軟件代碼中;IMX317攝像頭如下:
MIPI D-PHY
由于本設計使用UltraScale+系列FPGA,軟核方案自帶D-PHY,所以不再需要配套的D-PHY芯片或者權電阻D-PHY電路,也就是MIPI輸入電路不再需要分理處LP低功耗電路,直接將HS差分時鐘對和數據對直接連到FPGA的HP-BANK即可;
!!!注意
!!!注意
如果你的開發板FPGA型號不是UltraScale+系列,則需要D-PHY電路,否則無法解碼MIPI視頻;
MIPI CSI-2 RX Subsystem
然后MIPI視頻送入Xilinx官方的MIPI CSI-2 RX Subsystem IP核實現D-PHY+CSI功能,當然,這里主要是CSI功能,即MIPI協議層解碼,IMX317攝像頭配置后,MIPI-CLK是600MHz,又由于是雙沿傳輸,那么線速率就是1200MHz,IMX317配置為4 Lane通道傳輸,雙像素輸出模式;MIPI CSI-2 RX Subsystem配置如下:
MIPI CSI-2 RX Subsystem在Block Design中如下:
圖像預處理
MIPI視頻解碼后,調用圖像預處理模塊實現視頻剪裁和RAW12轉RAW8功能;將圖像預處理模塊頂層直接拖入Block Design中如下:
Sensor Demosaic 圖像格式轉換
調用Xilinx的Sensor Demosaic IP實現RAM轉RGB功能,該IP通過Vitis的C代碼軟件配置,Sensor Demosaic配置如下:
Sensor Demosaic在Block Design中如下:
Gammer LUT 伽馬校正
調用Xilinx的Gammer LUT IP實現伽馬校正功能,該IP通過Vitis的C代碼軟件配置,Gammer LUT配置如下:
Gammer LUT在Block Design中如下:
Video Processing Subsystem 圖像縮放
由于工程所用到的IP都是常用IP,所以這里重點介紹一下Video Processing Subsystem;
Video Processing Subsystem有縮放、去隔行、顏色空間轉換等功能,這里僅使用圖像縮放功能;其特點如下:
優點1:適用于Xilinx所有系列的FPGA器件和所有的Vivado版本;
優點2:支持8K最大分辨率:即可以處理高達8K的視頻;
優點3:輸入視頻格式:AXI4-Stream,方便對接Xilinx圖像處理套路的相關IP;
優點4:輸出視頻格式:AXI4-Stream,方便對接Xilinx圖像處理套路的相關IP;
優點5:模塊占用的FPGA邏輯資源更小,相比于自己寫的HLS圖像縮放而言,官方的Video Processing Subsystem資源占用大約減小30%左右,且更高效:
注意!!!!
注意!!!!
缺點1:需要SDK軟件配置,其本質為通過AXI_Lite 做寄存器配置,設計難度現對復雜,對新手小白不太友好;
缺點2:Xilinx官方提供的Video Processing Subsystem IAP并不能實現任意尺寸的圖像縮放,只能在IAP中視頻分辨率查找表范圍內進行縮放操作,如果想要實現自定義任意尺寸縮放,需要修改Xilinx官方提供的API源代碼,對新手小白極其友好,有此類需求的朋友可以聯系博主,提供私人定制服務,也就是我幫你修改Xilinx官方提供的API源代碼,以實現自定義任意尺寸縮放操作;
Video Processing Subsystem邏輯資源如下,請謹慎評估你的FPGA資源情況;
Video Processing Subsystem 在Block Design設計中如下:
Video Frame Buffer Write 圖像緩存
Video Frame Buffer Write相當于精簡版的VDMA,只具有視頻寫入DDR的功能,與VDMA相比具有YUV視頻寫入的功能,配置如下:
Video Frame Buffer Write 在Block Design設計中如下:
在Linux設計中可以對視頻寫入的基地址進行配置,通過終端指令配置;
Zynq UltraScale+ VCU H265 視頻壓縮
Zynq UltraScale+ VCU是Xilinx Zynq UltraScale+ ZUEV系列FPGA才有的IP,可以實現最高4K60幀的視頻壓縮和解壓,IP的官方文檔是《PG252》,讀者可以自行前往閱讀,Zynq UltraScale+ VCU配置如下:
輸入視頻格式為YUV420,最高分辨率配置為4K60幀;Zynq UltraScale+ VCU 在Block Design設計中如下:
工程源碼架構
工程源碼架構包括vivado Block Design邏輯設計和PetaLiux軟件設計;
Block Design邏輯設計架構截圖如下:
綜合后的源碼架構如下:
需要注意的是,在對Block Design進行Generate Output Products時需要選擇Global模式,如下:
PetaLinux 工程編譯
注意!!!
注意!!!
注意!!!
本博主已經提供好已制作完成的啟動文件,理論上PetaLinux 工程編譯不不要您重復再做,如果您感興趣,則可以做這一步。。。
PetaLinux版本:PetaLinux版本為2020.2,因為vivado用的vivado202.2,為了兼容性,建議使用與之配套的PetaLinux2020.2;
運行環境:Ubuntu操作系統,我用的Win10上虛擬機搭建的Ubuntu,當然也可以使用直接裝Ubuntu操作系統的電腦;
第1步:導出vivado工程的.xsa文件,并放到Ubuntu下你新建的文件夾中;同時下載我們提供的BSP包,也放到Ubuntu下你新建的文件夾中;然后改變其用戶權限,如下圖:
? 終端指令:sudo chmod -R 777 文件名,比如:
? 終端指令:sudo chmod -R 777 zu402_mipi_rx_wrapper.xsa
? 終端指令:sudo chmod -R 777 zu402_sd.bsp
第2步:配置PetaLinux2020.2環境變量,如下圖:
? 終端指令:source /opt/pkg/petalinux/2020.2/settings.sh
第3步:建立基于BSP包的PetaLinux2020.2工程,如下圖:
? 終端指令:petalinux-create -t project -s zu402_sd.bsp -n zu402_sd
第4步:將.xsa硬件信息導入PetaLinux2020.2工程,如下圖:
? 終端指令:petalinux-config --get-hw-description=/home/文件路徑/zu402_sd
在編譯環境設置時,建議使用離線編譯,當然,選擇在線編譯也是可以的,離線編譯配置如下:
Yocto Settings → Add pre-mirror url如下,路徑要改為你自己 download 及 ssate 的解壓路徑;
Yocto Settings → Local sstate feeds settings如下,路徑要改為你自己 download 及 ssate 的解壓路徑;
其他配置保持默認即可,然后保存退出,如下:
第5步:修改設備樹文件,如下圖:
將我們提供的設備樹文件替換掉PetaLinux工具自動生成的用戶設備樹文件;
? 終端指令:ln -sf zu402_sensor_imx317.dtsi system-user.dtsi
? 終端指令:ls -l
第6步:編譯PetaLinux2020.2工程,如下圖:
? 終端指令:petalinux-build
如果編譯中途有報錯信息,請復制報錯信息并百度尋找解決辦法,因為每個人的電腦配置不一樣,環境配置不一樣,遇到的問題也不一樣,無法給出統一的答案;
第7步:生成鏡像,如下圖:
? 終端指令:cd images/linux
? 終端指令:petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga
system.bit
然后把PetaLinux2020.2工程生成的如下幾個文件連同我們提供好的腳本文件一起放入SD卡中,如下:
到此們就可以插入SD卡上電跑系統了;
VLC播放器
壓縮后的H265碼流可通過VLC播放器播放,關于VLC播放器的安裝與使用,請參考下面的博客鏈接:
點擊直接前往
4、Vivado工程源碼詳解
開發板FPGA型號:Xilinx–Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;
FPGA開發環境:Vivado2020.2;
Linux開發環境:PetaLinux2020.2;
輸入:IMX317攝像頭,分辨率3840x2160@30Hz;
輸出:RJ45網口,H265壓縮碼流,分辨率3840x2160@30Hz;;
視頻壓縮方案:Zynq UltraScale+ VCU–H265壓縮;
視頻壓縮輸出方案:UDP網絡推流;
工程源碼架構請參考前面第3章節中的《工程源碼架構》小節;
工程作用:此工程目的是讓讀者掌握FPGA基于VCU的H265視頻壓縮的設計能力,以便能夠移植和設計自己的項目;
工程的資源消耗和功耗如下:
5、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點擊文件–>另存為;但此方法并不保險,最保險的方法是將你的vivado版本升級到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會發現IP都被鎖住了,如下:
此時需要升級IP,操作如下:
FPGA型號不一致處理
如果你的FPGA型號與我的不一致,則需要更改FPGA型號,操作如下:
更改FPGA型號后還需要升級IP,升級IP的方法前面已經講述了;
其他注意事項
1:由于每個板子的DDR不一定完全一樣,所以MIG IP需要根據你自己的原理圖進行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
6、上板調試驗證并演示
準備工作
FPGA開發板,推薦使用本博的開發板;
IMX317攝像頭;
帶顯卡的電腦主機,顯卡越貴越好;
網線;
開發板具體連接見資料包里的連接圖:
開發板有啟動模式選擇撥碼開關,SD卡啟動方式如下,請將開發板撥到如圖的配置:
然后將資料中的如下圖所示壓縮包解壓,并將解壓后的全部文件復制到TF卡中:
然后插上TF卡,然后將串口線和網線連接到電腦,安裝串口驅動,資料包中已經提供,上電;
配置Xshell
我們使用Xshell連接開發板模擬Linux終端的操作,Xshell配置如下:
配置開發板IP
首先需要配置開發板IP,配置為和你的電腦在同一網段即可,因為開發板壓縮的碼流視頻需要發送給電腦;首先查看你的電腦IP,以我的為例如下:
然后在Xshell依次輸入如下指令配置配置開發板IP,具體配置要根據你的電腦IP而定,這里只是以我的為例,如果這一步都看不懂建議不要往下看了。。。
? 終端指令:
ifconfig
? 終端指令:
ifconfig ethe 169.254.142.240
如下:
然后ping電腦IP,一定要能ping通,不然后面的操作就沒意義了,如下:
? 終端指令:
ping 169.254.142.239
配置MIPI CSI-2 RX Subsystem
MIPI CSI-2 RX Subsystem IP核的作用是實現MIPI CSI2-RX解碼,配置MIPI CSI-2 RX Subsystem分辨率為3840x2160,如下:
? 終端指令1:
media-ctl -d /dev/media1 -V "\"a0000000.mipi_csi2_rx_subsystem\":0 [fmt:SBGGR12_1X12/3840x2160 field:none]"
? 終端指令2:
media-ctl -d /dev/media1 -V "\"a0000000.mipi_csi2_rx_subsystem\":1 [fmt:SBGGR12_1X12/3840x2160 field:none]"
配置Sensor Demosaic
Sensor Demosaic IP核的作用是實現Bayer轉GRB888,配置Sensor Demosaic分辨率為3840x2160,如下:
? 終端指令1:
media-ctl -d /dev/media1 -V "\"a0020000.v_demosaic\":0 [fmt:SBGGR12_1X12/3840x2160 field:none]"
? 終端指令2:
media-ctl -d /dev/media1 -V "\"a0020000.v_demosaic\":1 [fmt:SBGGR12_1X12/3840x2160 field:none]"
配置Gamma LTU
Gamma LTU IP核的作用是實現伽馬校正,配置Gamma LTU分辨率為3840x2160,如下:
? 終端指令1:
media-ctl -d /dev/media1 -V "\"a0040000.v_gamma_lut\":0 [fmt:RBG888_1X24/3840x2160 field:none]"
? 終端指令2:
media-ctl -d /dev/media1 -V "\"a0040000.v_gamma_lut\":1 [fmt:RBG888_1X24/3840x2160 field:none]"
配置Video Processing Subsystem
Video Processing Subsystem IP核的作用是實現圖像縮放,配置Video Processing Subsystem分辨率為3840x2160,即不做縮放操作,如下:
? 終端指令1:
media-ctl -d /dev/media1 -V "\"a0010000.v_proc_ss\":0 [fmt:RBG888_1X24/3840x2160 field:none]"
? 終端指令2:
media-ctl -d /dev/media1 -V "\"a0010000.v_proc_ss\":1 [fmt:RBG888_1X24/3840x2160 field:none]"
配置H265視頻壓縮
輸入如下指令:
? 終端指令:
gst-launch-1.0 v4l2src device=/dev/video0 io-mode=4 ! video/x-raw, format=NV16, width=3840, height=2160, framerate=30/1 ! omxh265enc qp-mode=auto gop-mode=basic gop-length=60 b-frames=0 target-bitrate=60000 num-slices=8 control-rate=constant prefetch-buffer=true low-bandwidth=false filler-data=true cpb-size=1000 initial-delay=500 periodicity-idr=60 ! video/x-h265,profile=main-422, alignment=au ! queue ! mpegtsmux alignment=7 name=mux ! rtpmp2tpay ! udpsink host=169.254.142.239 port=5005
注意!!!
注意!!!
上述指令中的《udpsink host=169.254.142.239 port=5005》
這里的IP是根據我自己的電腦配置的,你的電腦請根據實際情況修改;端口號5005為固定值;
配置VLC播放器
開發板網線連接電腦,打開VLC播放器,配置如下:
這里一定要注意:這里的IP是根據我自己的電腦配置的,你的電腦請根據實際情況修改;
注意!!!
注意!!!
電腦端一定要用有顯卡的電腦,不要用筆記本電腦,不然延時很大,根本無法播放。。。
VLC播放H265碼流視頻演示
VLC播放H265碼流視頻演示如下:
IMX317-H265壓縮
7、福利:工程源碼獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發送,以某度網盤鏈接方式發送,
資料獲取方式:私,或者文章末尾的V名片。
網盤資料如下: