FPGA解碼MIPI視頻:Xilinx Zynq7000高端FPGA,基于MIPI CSI-2 RX Subsystem架構(gòu)實(shí)現(xiàn),提供工程源碼和技術(shù)支持
1、前言
FPGA圖像采集領(lǐng)域目前協(xié)議最復(fù)雜、技術(shù)難度最高的應(yīng)該就是MIPI協(xié)議了,MIPI解碼難度之高,令無(wú)數(shù)英雄競(jìng)折腰,以至于Xilinx官方不得不推出專用的IP核供開(kāi)發(fā)者使用,不然太高端的操作直接嚇退一大批FPGA開(kāi)發(fā)者,就沒(méi)人玩兒了。
本設(shè)計(jì)基于Xilinx的 zynq 7000系列中端FPGA開(kāi)發(fā)板,采集OV5640攝像頭的2Lane MIPI視頻,OV5640攝像頭配置為MIPI模式,引腳經(jīng)過(guò)權(quán)電阻方案后接入FPGA的HS BANK的LVDS差分IO;調(diào)用Xilinx的MIPI CSI-2 RX Subsystem IP實(shí)現(xiàn)MIPI的D-PHY功能,該IP由Xilinx免費(fèi)提供,將MIPI視頻解碼后以AXIS視頻流格式輸出;再調(diào)用Xilinx的Sensor Demosaic IP實(shí)現(xiàn)RAM轉(zhuǎn)RGB功能; 再調(diào)用Xilinx的Gammer LUT IP實(shí)現(xiàn)伽馬校正功能;再調(diào)用Xilinx的VDMA IP實(shí)現(xiàn)圖像三幀緩存功能,VDMA調(diào)用兩個(gè),一個(gè)用于視頻寫(xiě)入DDR3,另一個(gè)用于視頻讀出DDR3,這樣分開(kāi)讀寫(xiě)的目的在于使用AXI的帶寬;再調(diào)用Xilinx的Video Timing Controller和AXI4-Stream toVideo Out IP實(shí)現(xiàn)視頻流從AXI4-Stream到VGA時(shí)序的轉(zhuǎn)換;最后用自定義的HDMI發(fā)送IP將視頻輸出顯示器顯示;本方案提供5套工程源碼,5套工程源碼的區(qū)別在于使用的zynq主控芯片不同,分別是Zynq7020、Zynq7030、Zynq7035、Zynq7045、Zynq7100;針對(duì)目前市面上主流的FPGA,本Xilinx系列FPGA解碼OV5640-MIPI視頻方案一共移植了15套工程源碼,本博文介紹其中基于Zynq7000中端FPGA 的5套工程,詳情如下:
本文詳細(xì)描述了Xilinx zynq 中端FPGA解碼MIPI視頻的設(shè)計(jì)方案,工程代碼編譯通過(guò)后上板調(diào)試驗(yàn)證,可直接項(xiàng)目移植,適用于在校學(xué)生做畢業(yè)設(shè)計(jì)、研究生項(xiàng)目開(kāi)發(fā),也適用于在職工程師做項(xiàng)目開(kāi)發(fā),可應(yīng)用于醫(yī)療、軍工等行業(yè)的數(shù)字成像和圖像傳輸領(lǐng)域;整個(gè)工程調(diào)用Zynq軟核做IP的配置,Zynq的配置在Vitis SDK里以C語(yǔ)言軟件代碼的形式運(yùn)行,所以整個(gè)工程包括FPGA邏輯設(shè)計(jì)和Vitis SDK軟件設(shè)計(jì)兩部分,需要具備FPGA和嵌入式C語(yǔ)言的綜合能力,不適合初學(xué)者或者小白;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請(qǐng)耐心看到最后;
關(guān)于MIPI協(xié)議,請(qǐng)自行搜索,csdn就有很多大佬講得很詳細(xì),我就不多寫(xiě)這塊了;
免責(zé)聲明
本工程及其源碼即有自己寫(xiě)的一部分,也有網(wǎng)絡(luò)公開(kāi)渠道獲取的一部分(包括CSDN、Xilinx官網(wǎng)、Altera官網(wǎng)以及其他開(kāi)源免費(fèi)獲取渠道等等),若大佬們覺(jué)得有所冒犯,請(qǐng)私信批評(píng)教育;部分模塊源碼轉(zhuǎn)載自上述網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系我們刪除;基于此,本工程及其源碼僅限于讀者或粉絲個(gè)人學(xué)習(xí)和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導(dǎo)致的法律問(wèn)題,與本博客及博主無(wú)關(guān),請(qǐng)謹(jǐn)慎使用。。。
2、相關(guān)方案推薦
我這里已有的 MIPI 編解碼方案
我這里目前已有豐富的基于FPGA的MIPI編解碼方案,主要是MIPI解碼的,既有純vhdl實(shí)現(xiàn)的MIPI解碼,也有調(diào)用Xilinx官方IP實(shí)現(xiàn)的MIPI解碼,既有2line的MIPI解碼,也有4line的MIPI解碼,既有4K分辨率的MIPI解碼,也有小到720P分辨率的MIPI解碼,既有基于Xilinx平臺(tái)FPGA的MIPI解碼也有基于Altera平臺(tái)FPGA的MIPI解碼,還有基于Lattice平臺(tái)FPGA的MIPI解碼,后續(xù)還將繼續(xù)推出更過(guò)國(guó)產(chǎn)FPGA的MIPI解碼方案,畢竟目前國(guó)產(chǎn)化方案才是未來(lái)主流,后續(xù)也將推出更多MIPI編碼的DSI方案,努力將FPGA的MIPI編解碼方案做成白菜價(jià)。。。
基于此,我專門(mén)建了一個(gè)MIPI編解碼的專欄,并將MIPI編解碼的博客都放到了專欄里整理,對(duì)FPGA編解碼MIPI有項(xiàng)目需求或?qū)W習(xí)興趣的兄弟可以去我的專欄看看,專欄地址如下:
點(diǎn)擊直接前往專欄
本方案在Xilinx Artix7-35T上解碼MIPI視頻的應(yīng)用
本方案適應(yīng)于Xilinx系列FPGA平臺(tái),針對(duì)目前市面上主流的FPGA,本博將本方案分別移植到了Xilinx 的Artix7、Kintex7、Zynq7000、Zynq UltraScale等平臺(tái)共計(jì)16套工程源碼,本文講述的是在Zynq7000中端FPGA上的應(yīng)用,想要直接應(yīng)用于Xilinx Artix7-35T 系列FPGA上的ov5640-MIPI視頻解碼應(yīng)用的讀者,可以參考我之前寫(xiě)得博客,以下是博客地址:
點(diǎn)擊直接前往
本方案在Xilinx Artix7-100T上解碼MIPI視頻的應(yīng)用
本方案適應(yīng)于Xilinx系列FPGA平臺(tái),針對(duì)目前市面上主流的FPGA,本博將本方案分別移植到了Xilinx 的Artix7、Kintex7、Zynq7000、Zynq UltraScale等平臺(tái)共計(jì)16套工程源碼,本文講述的是在Zynq7000中端FPGA上的應(yīng)用,想要直接應(yīng)用于Xilinx Artix7-100T 系列FPGA上的ov5640-MIPI視頻解碼應(yīng)用的讀者,可以參考我之前寫(xiě)得博客,以下是博客地址:
點(diǎn)擊直接前往
本方案在Xilinx Zynq UltraScale上解碼MIPI視頻的應(yīng)用
本方案適應(yīng)于Xilinx系列FPGA平臺(tái),針對(duì)目前市面上主流的FPGA,本博將本方案分別移植到了Xilinx 的Artix7、Kintex7、Zynq7000、Zynq UltraScale等平臺(tái)共計(jì)16套工程源碼,本文講述的是在Zynq7000中端FPGA上的應(yīng)用,想要直接應(yīng)用于Xilinx Zynq UltraScale系列FPGA上的ov5640-MIPI視頻解碼應(yīng)用的讀者,可以參考我之前寫(xiě)得博客,里面包括了Zynq UltraScale XCZU2CG、Zynq UltraScale XCZU3EG、Zynq UltraScale XCZU4EV、Zynq UltraScale XCZU7EV、Zynq UltraScale XCZU9EG等平臺(tái);以下是博客地址:
點(diǎn)擊直接前往
純VHDL代碼解碼ov5640-MIPI視頻方案
與上述基于MIPI CSI-2 RX Subsystem方案不同,本博也提供基于純VHDL代碼解碼ov5640-MIPI視頻的方案,該方案的區(qū)別與優(yōu)勢(shì)在于可以看到VHDL源碼而非單純的IP,能看到源碼的意思就是你可以任意修改源碼以適配自己的項(xiàng)目,其意義與價(jià)值無(wú)需多言,該方案目前已在Xilinx Zynq7020上移植成功,共有兩套工程源碼,一套是單路ov5640-MIPI視頻解碼后HDMI輸出;另一套是4路ov5640-MIPI視頻解碼經(jīng)縮放拼接后HDMI 4分屏輸出;感興趣的可以參考我之前的博客;
單路MIPI解碼輸出博客地址如下:
點(diǎn)擊直接前往
4路MIPI解碼縮放拼接輸出博客地址如下:
點(diǎn)擊直接前往
3、本 MIPI CSI2 模塊性能及其優(yōu)缺點(diǎn)
由于調(diào)用了Xilinx的MIPI CSI-2 RX Subsystem IP核,所以性能上就取決于你的FPGA型號(hào),理論上FPGA越高端,支持的IO線速率或者GT高速接口線速率就越高,就能跑速率更高的MIPI視頻;
該IP適應(yīng)性極強(qiáng),支持的MIPI相機(jī)性能參數(shù)如下:
并且,在越高端的FPGA型號(hào)上,該IP支持的高端性能也越多;
由于調(diào)用了Xilinx的MIPI CSI-2 RX Subsystem IP核,NIPI視頻解碼的穩(wěn)定性很好,且使用及其簡(jiǎn)單,缺點(diǎn)是看不到源碼,出了問(wèn)題后不好排查,只能在輸入輸出接口添加ila進(jìn)行逐級(jí)追蹤;
本方案使用的FPGA型號(hào)為Xilinx zynq 7000系列,屬于中端FPGA的MIPI解碼應(yīng)用,再小型的Artix7-35T或者Spartan7、Spartan6等就已經(jīng)不能使用MIPI CSI-2 RX Subsystem了;
4、詳細(xì)設(shè)計(jì)方案
本設(shè)計(jì)基于Xilinx的 zynq 7000系列中端FPGA開(kāi)發(fā)板,采集OV5640攝像頭的2Lane MIPI視頻,OV5640攝像頭配置為MIPI模式,引腳經(jīng)過(guò)權(quán)電阻方案后接入FPGA的HS BANK的LVDS差分IO;調(diào)用Xilinx的MIPI CSI-2 RX Subsystem IP實(shí)現(xiàn)MIPI的D-PHY功能,該IP由Xilinx免費(fèi)提供,將MIPI視頻解碼后以AXIS視頻流格式輸出;再調(diào)用Xilinx的Sensor Demosaic IP實(shí)現(xiàn)RAM轉(zhuǎn)RGB功能; 再調(diào)用Xilinx的Gammer LUT IP實(shí)現(xiàn)伽馬校正功能;再調(diào)用Xilinx的VDMA IP實(shí)現(xiàn)圖像三幀緩存功能,VDMA調(diào)用兩個(gè),一個(gè)用于視頻寫(xiě)入DDR3,另一個(gè)用于視頻讀出DDR3,這樣分開(kāi)讀寫(xiě)的目的在于使用AXI的帶寬;再調(diào)用Xilinx的Video Timing Controller和AXI4-Stream toVideo Out IP實(shí)現(xiàn)視頻流從AXI4-Stream到VGA時(shí)序的轉(zhuǎn)換;最后用自定義的HDMI發(fā)送IP將視頻輸出顯示器顯示;
本方案提供5套工程源碼,5套工程源碼的區(qū)別在于使用的zynq主控芯片不同,分別是Zynq7020、Zynq7030、Zynq7035、Zynq7045、Zynq7100;
設(shè)計(jì)原理框圖
設(shè)計(jì)原理框圖如下:
OV5640及其配置
輸入視頻采用廉價(jià)的OV5640攝像頭模組,配置為MIPI模式,2 Lane,數(shù)據(jù)格式為RAW10,線速率為1000Mbps,視頻分辨率為1280X720,一個(gè)時(shí)鐘一個(gè)像素,OV5640需要SCCB總線配置才能運(yùn)行,該總線等價(jià)于I2C總線,調(diào)用一個(gè)AXI-GPIO模擬I2C,利用Vitis軟件配置OV5640,配置部分代碼有C語(yǔ)言實(shí)現(xiàn),具體參考Vitis程序;AXI-GPIO調(diào)用和SCCB軟件配置代碼截圖如下:
權(quán)電阻硬件方案
使用Xilinx官方推薦的權(quán)電阻硬件方案將輸入的差分MIPI對(duì)恢復(fù)HS和PL,原理圖部分截圖如下:
注意:權(quán)電阻方案只在低速率的MIPI模式下可用,高速率的MIPI請(qǐng)用專用芯片實(shí)現(xiàn),比如MC20001,MC系列這種方案可以支持到2Gbps/Lane速率以上,只要FPGA的IO速率夠用;
MIPI CSI-2 RX Subsystem
調(diào)用Xilinx的MIPI CSI-2 RX Subsystem IP實(shí)現(xiàn)MIPI的D-PHY功能,該IP由Xilinx免費(fèi)提供,將MIPI視頻解碼后以AXIS視頻流格式輸出;調(diào)用和配置如下:
Sensor Demosaic圖像格式轉(zhuǎn)換
調(diào)用Xilinx的Sensor Demosaic IP實(shí)現(xiàn)RAM轉(zhuǎn)RGB功能,該IP通過(guò)Vitis的C代碼軟件配置,Sensor Demosaic調(diào)用和C代碼軟件配置代碼截圖如下:
Gammer LUT伽馬校正
調(diào)用Xilinx的Gammer LUT IP實(shí)現(xiàn)伽馬校正功能,該IP通過(guò)Vitis的C代碼軟件配置,Gammer LUT調(diào)用和C代碼軟件配置代碼截圖如下:
VDMA圖像緩存
調(diào)用Xilinx的VDMA IP實(shí)現(xiàn)圖像三幀緩存功能,VDMA調(diào)用兩個(gè),一個(gè)用于視頻寫(xiě)入DDR3,另一個(gè)用于視頻讀出DDR3,這樣分開(kāi)讀寫(xiě)的目的在于使用AXI的帶寬;該IP通過(guò)Vitis的C代碼軟件配置;VDMA調(diào)用和C代碼軟件配置代碼截圖如下:
AXI4-Stream toVideo Out
再調(diào)用Xilinx的Video Timing Controller和AXI4-Stream toVideo Out IP實(shí)現(xiàn)視頻流從AXI4-Stream到VGA時(shí)序的轉(zhuǎn)換;Video Timing Controller配置為1280*720@60Hz,這兩個(gè)IP不需要軟件配置;Video Timing Controller和AXI4-Stream toVideo Out調(diào)用截圖如下:
HDMI輸出
最后用自定義的HDMI發(fā)送IP將視頻輸出顯示器顯示,該IP最大輸出分辨率只支持1920*1080@60Hz;IP調(diào)用截圖如下:
5、vivado工程1:Zynq7020版本
FPGA邏輯設(shè)計(jì)
開(kāi)發(fā)板FPGA型號(hào):Xilinx–Zynq7020–xc7z020clg400-2;
開(kāi)發(fā)環(huán)境:Vivado2021.1;
輸入:OV5640攝像頭–MIPI–2 Line–RAW10-1280X720;
輸出:HDMI ,分辨率720P;
應(yīng)用:Xilinx Zynq 7000系列中端FPGA解碼MIPI視頻;
工程Block Design如下:
由于調(diào)用IP較多,分散開(kāi)來(lái)很不好看,也不利于閱讀,我們將MIPI解碼和緩存的核心IP進(jìn)行了再封裝,如上圖中紅框標(biāo)記部分,該封裝只是形式上的好看而已,沒(méi)有特殊功能,可以通過(guò)如下方法將其展開(kāi),查看里面的詳細(xì)組成和結(jié)構(gòu),如下:
展開(kāi)后如下:
工程代碼架構(gòu)如下:
工程的資源消耗和功耗如下:
Vitis SDK軟件設(shè)計(jì)
Vitis SDK C語(yǔ)言軟件是為了配置FPGA調(diào)用的IP,用VItis打開(kāi)即可查看,代碼內(nèi)容如下:
Vitis HLS補(bǔ)丁
由于工程中用到了HLS生成的IP,Sensor Demosaic和Gammer LUT,可能會(huì)出現(xiàn)綜合編譯失敗,或者警告后在Vitis SDK里找不到設(shè)備ID等情況,此時(shí)需要更改電腦系統(tǒng)時(shí)間或者打上官方補(bǔ)丁解決這件事情,具體方法參考這位大佬博文:直接點(diǎn)擊前往
6、vivado工程2:Zynq7030版本
開(kāi)發(fā)板FPGA型號(hào):Xilinx–Zynq7030–xc7z030ffg676-2;
開(kāi)發(fā)環(huán)境:Vivado2021.1;
輸入:OV5640攝像頭–MIPI–2 Line–RAW10-1280X720;
輸出:HDMI ,分辨率720P;
應(yīng)用:Xilinx Zynq 7000系列中端FPGA解碼MIPI視頻;
工程Block Design、工程代碼架構(gòu)、工程的資源消耗、Vitis SDK軟件設(shè)計(jì)和第5章節(jié)的“vivado工程1:Zynq7020版本”大同小異;
7、vivado工程3:Zynq7035版本
開(kāi)發(fā)板FPGA型號(hào):Xilinx–Zynq7035–xc7z035ffg676-2;
開(kāi)發(fā)環(huán)境:Vivado2021.1;
輸入:OV5640攝像頭–MIPI–2 Line–RAW10-1280X720;
輸出:HDMI ,分辨率720P;
應(yīng)用:Xilinx Zynq 7000系列中端FPGA解碼MIPI視頻;
工程Block Design、工程代碼架構(gòu)、工程的資源消耗、Vitis SDK軟件設(shè)計(jì)和第5章節(jié)的“vivado工程1:Zynq7020版本”大同小異;
8、vivado工程4:Zynq7045版本
開(kāi)發(fā)板FPGA型號(hào):Xilinx–Zynq7045–xc7z045ffg900-2;
開(kāi)發(fā)環(huán)境:Vivado2021.1;
輸入:OV5640攝像頭–MIPI–2 Line–RAW10-1280X720;
輸出:HDMI ,分辨率720P;
應(yīng)用:Xilinx Zynq 7000系列中端FPGA解碼MIPI視頻;
工程Block Design、工程代碼架構(gòu)、工程的資源消耗、Vitis SDK軟件設(shè)計(jì)和第5章節(jié)的“vivado工程1:Zynq7020版本”大同小異;
9、vivado工程5:Zynq7100版本
開(kāi)發(fā)板FPGA型號(hào):Xilinx–Zynq7100–xc7z100ffg900-2;
開(kāi)發(fā)環(huán)境:Vivado2021.1;
輸入:OV5640攝像頭–MIPI–2 Line–RAW10-1280X720;
輸出:HDMI ,分辨率720P;
應(yīng)用:Xilinx Zynq 7000系列中端FPGA解碼MIPI視頻;
工程Block Design、工程代碼架構(gòu)、工程的資源消耗、Vitis SDK軟件設(shè)計(jì)和第5章節(jié)的“vivado工程1:Zynq7020版本”大同小異;
10、工程移植說(shuō)明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開(kāi)工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開(kāi)工程后,點(diǎn)擊文件–>另存為;但此方法并不保險(xiǎn),最保險(xiǎn)的方法是將你的vivado版本升級(jí)到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開(kāi)工程后會(huì)發(fā)現(xiàn)IP都被鎖住了,如下:
此時(shí)需要升級(jí)IP,操作如下:
FPGA型號(hào)不一致處理
如果你的FPGA型號(hào)與我的不一致,則需要更改FPGA型號(hào),操作如下:
更改FPGA型號(hào)后還需要升級(jí)IP,升級(jí)IP的方法前面已經(jīng)講述了;
其他注意事項(xiàng)
1:由于每個(gè)板子的DDR不一定完全一樣,所以MIG IP需要根據(jù)你自己的原理圖進(jìn)行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據(jù)你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
11、上板調(diào)試驗(yàn)證
準(zhǔn)備工作
需要準(zhǔn)備的器材如下:
FPHA開(kāi)發(fā)板;
OV5640攝像頭;
HDMI顯示器;
輸出視頻演示
輸出如下
輸出視頻演示文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-834731.html
12、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無(wú)法郵箱發(fā)送,以某度網(wǎng)盤(pán)鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤(pán)資料如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-834731.html
到了這里,關(guān)于FPGA解碼MIPI視頻:Xilinx Zynq7000中端FPGA,基于MIPI CSI-2 RX Subsystem架構(gòu)實(shí)現(xiàn),提供工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!