FPGA高端項(xiàng)目:Xilinx Kintex7系列FPGA 多路視頻縮放拼接 工程解決方案 ov5640版本 提供4套工程源碼+技術(shù)支持
1、前言
沒玩過圖像縮放和視頻拼接都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。本文使用Xilinx的Kintex7系列FPGA實(shí)現(xiàn)多路視頻縮放拼接方案,視頻源有兩種,分別對(duì)應(yīng)開發(fā)者手里有沒有攝像頭的情況,一種是使用廉價(jià)的OV5640攝像頭模組,如果你的手里沒有攝像頭或者沒有攝像頭輸入接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行選擇,默認(rèn)使用ov5640作為視頻源;FPGA采集到輸入視頻后,首先經(jīng)過圖像縮放模塊對(duì)圖像進(jìn)行縮放操作,圖像縮放模塊支持領(lǐng)域插值和雙線性插值2種算法,通過模塊頂層參數(shù)選擇,默認(rèn)使用雙線性插值;縮放后的圖像進(jìn)入我常用的FDMA圖像緩存架構(gòu)進(jìn)行圖像拼接和緩存;這里需要注意的是,我的手里沒有多路攝像頭,所以用采集到的視頻復(fù)制N路,以模擬N路視頻;視頻拼接在調(diào)用FDMA的不同方案中得以實(shí)現(xiàn),比如你需要進(jìn)行4路視頻拼接,則需要調(diào)用4路FDMA,并對(duì)其進(jìn)行不同的配置,具體方案在后面會(huì)介紹;拼接緩存的圖像寫入DDR中,然后在VGA時(shí)序生成模塊的控制下讀出視頻;最后送入HDMI輸出模塊發(fā)送視頻至顯示器即可;針對(duì)目前市面上主流的FPGA,本純verilog圖像縮放拼接方案一共移植了18套工程源碼,本博文介紹其中基于Xilinx Kintex7 系列FPGA ov5640版本的4套工程,詳情如下:
這里說明一下提供的4套工程源碼的作用和價(jià)值,如下:
工程源碼5:2路視頻縮放+拼接
ov5640或者動(dòng)態(tài)彩條輸入,輸入視頻分辨率為1280x720,經(jīng)過圖像縮放模塊后視頻辨率為960x1080,縮放后的視頻復(fù)制2份,用以模擬2路視頻,調(diào)用2路FDMA圖像緩存架構(gòu)做視頻拼接和圖像緩存,最后HDMI輸出,1920x1080的輸出分辨率背景上疊加2路分辨率為960x1080的縮放拼接的視頻,即2分屏輸出顯示;此工程目的是讓讀者掌握2路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程源碼6:4路視頻縮放+拼接
ov5640或者動(dòng)態(tài)彩條輸入,輸入視頻分辨率為1280x720,經(jīng)過圖像縮放模塊后視頻辨率為960x540,縮放后的視頻復(fù)制4份,用以模擬4路視頻,調(diào)用4路FDMA圖像緩存架構(gòu)做視頻拼接和圖像緩存,最后HDMI輸出,1920x1080的輸出分辨率背景上疊加4路分辨率為960x540的縮放拼接的視頻,即4分屏輸出顯示;此工程目的是讓讀者掌握4路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程源碼7:8路視頻縮放+拼接
ov5640或者動(dòng)態(tài)彩條輸入,輸入視頻分辨率為1280x720,經(jīng)過圖像縮放模塊后視頻辨率為480x540,縮放后的視頻復(fù)制8份,用以模擬8路視頻,調(diào)用8路FDMA圖像緩存架構(gòu)做視頻拼接和圖像緩存,最后HDMI輸出,1920x1080的輸出分辨率背景上疊加4路分辨率為480x540的縮放拼接的視頻,即8分屏輸出顯示;此工程目的是讓讀者掌握4路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程源碼8:16路視頻縮放+拼接
ov5640或者動(dòng)態(tài)彩條輸入,輸入視頻分辨率為1280x720,經(jīng)過圖像縮放模塊后視頻辨率為240x540,縮放后的視頻復(fù)制16份,用以模擬16路視頻,調(diào)用16路FDMA圖像緩存架構(gòu)做視頻拼接和圖像緩存,最后HDMI輸出,1920x1080的輸出分辨率背景上疊加16路分辨率為240x540的縮放拼接的視頻,即16分屏輸出顯示;此工程目的是讓讀者掌握16路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
本博客詳細(xì)描述了Xilinx Kintex7系列FPGA 多路視頻縮放拼接工程解決方案的設(shè)計(jì)方案,工程代碼可綜合編譯上板調(diào)試,可直接項(xiàng)目移植,適用于在校學(xué)生、研究生項(xiàng)目開發(fā),也適用于在職工程師做學(xué)習(xí)提升,可應(yīng)用于醫(yī)療、軍工等行業(yè)的高速接口或圖像處理領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請(qǐng)耐心看到最后;
版本更新說明
此版本為第3版,根據(jù)讀者的建議,對(duì)第1版工程做了改進(jìn)和更新形成如下第2版本:
1:增加了輸入視頻動(dòng)態(tài)彩條的選擇,有的讀者說他手里沒有OV5640攝像頭或者攝像頭原理圖和我的不一致,導(dǎo)致在移植過程中困難很大,基于此,增加了動(dòng)態(tài)彩條,它由FPGA內(nèi)部產(chǎn)生,不需要外接攝像頭就可以使用,使用方法在后文有說明;
2:優(yōu)化了FDMA,之前的FDMA內(nèi)AXI4的數(shù)據(jù)讀寫突發(fā)長度為256,導(dǎo)致在低端FPGA上帶寬不夠,從而圖像質(zhì)量不佳,基于此,將FDMA內(nèi)AXI4的數(shù)據(jù)讀寫突發(fā)長度改為128;
3:優(yōu)化了HDMI輸出模塊,之前用的自定義IP,有讀者說IP無法更新,雖能正常使用,但看源碼不方便,基于此,將HDMI輸出模塊改為純verilog實(shí)現(xiàn)的,直接了當(dāng);
4:更新了輸出時(shí)序模塊,我的輸出時(shí)序模塊采用1080P背景中顯示有效區(qū)域圖像的方式,之前的版本,除有效區(qū)域圖像外,其他區(qū)域是花屏的,有讀者說看著不舒服,基于此,將,除有效區(qū)域圖像外的圖像優(yōu)化為黑色,即黑色背景中顯示有效區(qū)域圖像的方式,在后面有貼圖;
根據(jù)讀者的建議,對(duì)第2版工程做了改進(jìn)和更新形成如下第3版本:
1:優(yōu)化了圖像縮放模塊代碼結(jié)構(gòu),將原來的跨時(shí)鐘域FIFO納入圖像縮放模塊內(nèi)部,并添加了新的頂層接口和配置參數(shù),使能原來復(fù)雜的頂層接口和參數(shù)變得十分簡(jiǎn)潔;
2:新增了純verilog實(shí)現(xiàn)的異步FIFO,代碼里可選Xilinx的FIFO IP核,也可選verilog實(shí)現(xiàn)的異步FIFO,通過頂層參數(shù)選擇,這樣就使得圖像縮放模塊移植性和通用性更強(qiáng);
3:工程整體使用難度大大降低,由于優(yōu)化了圖像縮放模塊和整體代碼架構(gòu),加之將原來很多參數(shù)進(jìn)行了統(tǒng)一的設(shè)置,代碼量和行數(shù)減少了近45%,僅需修改集合參數(shù)就能快速實(shí)現(xiàn)工程的移植和修改;
給讀者的一封信
FPGA作為當(dāng)今熱門行業(yè),入行門檻很高,工資待遇不錯(cuò),一時(shí)間引無數(shù)英雄盡折腰,但很多初學(xué)者甚至工程師都還有很多誤區(qū),現(xiàn)給讀者一封信如下:
1、矮要承認(rèn)挨打站穩(wěn)
要學(xué)FPGA,甚至吃這碗飯,每個(gè)人都是從零基礎(chǔ)開始的,你對(duì)自己有自信,認(rèn)為你行,就自學(xué);你不自信,就找別人學(xué);和古代拜師學(xué)藝是一回事兒;首先思維要符合邏輯;
2、基礎(chǔ)問題需要自己解決
最基礎(chǔ)的知識(shí),比如:verilog語法、vivado工具使用、模電數(shù)電基礎(chǔ)常識(shí)、電腦使用、計(jì)算機(jī)基本結(jié)構(gòu)。。。這些基礎(chǔ)知識(shí)在網(wǎng)上都是免費(fèi)的,既有文字資料也有視頻資料;這些基礎(chǔ)知識(shí)你一定要具備,因?yàn)檫@是你能獲得的性價(jià)比最高的東西了,首先它免費(fèi);其次它簡(jiǎn)單,只需要你花時(shí)間,不需要花腦子;最后它重要,這是你干FPGA的基礎(chǔ);
3、有了源碼等于零
你可能認(rèn)為,我有了源碼就能做項(xiàng)目了,我可以肯定的告訴你,該醒醒了;原子彈的詳細(xì)原理和原料配方甚至生產(chǎn)工藝流程在網(wǎng)上都是公開的,為啥全世界就那聯(lián)合國幾大流氓能造出來的?同樣的,源碼給你,你看得懂嗎?你知道怎么用嗎?看不懂不會(huì)用的源碼,跟廢物有什么區(qū)別?你需要的是源碼+工程,最完美的是源碼+工程+技術(shù)支持;有了源碼,就有了可開發(fā)的底層架構(gòu),有了工程就知道源碼或者模塊怎么使用,有了技術(shù)支持就可以根據(jù)源碼修改開發(fā)自己的項(xiàng)目;
4、先學(xué)會(huì)爬在學(xué)會(huì)跑
對(duì)于初學(xué)者,沒有資格研究代碼,你首先需要做的是對(duì)工程進(jìn)行復(fù)現(xiàn);比如給你一個(gè)圖像的工程,你首先在自己的開發(fā)板上復(fù)現(xiàn)這個(gè)工程的功能,然后再去閱讀理解代碼,然后對(duì)代碼的功能部分做小幅修改,比如改一下接口,增加幾個(gè)輸出接口,比如加一個(gè)LED輸出;小幅修改后再慢慢增加修改幅度,以符合自己的需求;
5、學(xué)FPGA要不求甚解
學(xué)FPGA要不求甚解,甚至不需要理解,這句話咋聽著有點(diǎn)不符合邏輯呢?對(duì)于很多功能性模塊而言,你不需要理解它怎么實(shí)現(xiàn)的,你只需要知道怎么使用它,比如一個(gè)圖像縮放模塊,這種東西都是很老的知識(shí),以你目前的知識(shí)水平,該模塊的代碼你怎么看也看不懂的,但你只要知道怎么使用它就行了,知道怎么使用,就能做項(xiàng)目,就能在公司呆下去了,原因很簡(jiǎn)單,老板招你來是干活兒的,不是招你來學(xué)習(xí)的,那是學(xué)校的事兒;如果要等什么都懂了才干活兒,那公司早垮了,學(xué)FPGA就是在實(shí)踐中學(xué)習(xí),先上前線去干活,邊干邊學(xué),在實(shí)踐中遇到問題,并主動(dòng)去查資料問大佬理解問題,才是成長最快的,而不是一味的咬文嚼字刨根問底;
FPGA就業(yè)高端項(xiàng)目培訓(xùn)計(jì)劃
鑒于目前的FPGA就業(yè)和行業(yè)現(xiàn)狀,本博推出了FPGA就業(yè)高端項(xiàng)目培訓(xùn):純verilog多路視頻縮放+拼接 工程解決方案的計(jì)劃,該計(jì)劃旨在讓一部分人先學(xué)會(huì)FPGA純verilog圖像縮放,提高從業(yè)者的技術(shù)水平和工資待遇,詳細(xì)計(jì)劃如下:
FPGA就業(yè)高端項(xiàng)目培訓(xùn)計(jì)劃細(xì)節(jié):
1、我發(fā)你上述18套工程源碼和對(duì)應(yīng)的工程設(shè)計(jì)文檔網(wǎng)盤鏈接,你保存下載,作為培訓(xùn)的核心資料;
2、你根據(jù)自己的實(shí)際情況安裝好對(duì)應(yīng)的開發(fā)環(huán)境,然后對(duì)著設(shè)計(jì)文檔進(jìn)行淺層次的學(xué)習(xí);
3、遇到不懂的隨時(shí)問我,包括代碼、職業(yè)規(guī)劃、就業(yè)咨詢、人生規(guī)劃、戰(zhàn)略規(guī)劃等等;
4、每周末進(jìn)行一次騰訊會(huì)議,我會(huì)檢查你的學(xué)習(xí)情況和面對(duì)面溝通交流;
5、你可以移植代碼到你自己的FPGA開發(fā)板上跑,如果你沒有板子,你根據(jù)你自己的需求修改代碼后,編譯工程,把bit發(fā)我,我?guī)湍阆螺d到我的板子上驗(yàn)證;
免責(zé)聲明
本工程及其源碼即有自己寫的一部分,也有網(wǎng)絡(luò)公開渠道獲取的一部分(包括CSDN、Xilinx官網(wǎng)、Altera官網(wǎng)等等),若大佬們覺得有所冒犯,請(qǐng)私信批評(píng)教育;基于此,本工程及其源碼僅限于讀者或粉絲個(gè)人學(xué)習(xí)和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導(dǎo)致的法律問題,與本博客及博主無關(guān),請(qǐng)謹(jǐn)慎使用。。。
2、相關(guān)方案推薦
我這里已有的FPGA圖像縮放方案
我的主頁目前有FPGA圖像縮放專欄,改專欄收錄了我目前手里已有的FPGA圖像縮放方案,從實(shí)現(xiàn)方式分類有基于HSL實(shí)現(xiàn)的圖像縮放、基于純verilog代碼實(shí)現(xiàn)的圖像縮放;從應(yīng)用上分為單路視頻圖像縮放、多路視頻圖像縮放、多路視頻圖像縮放拼接;從輸入視頻分類可分為OV5640攝像頭視頻縮放、SDI視頻縮放、MIPI視頻縮放等等;以下是專欄地址:
點(diǎn)擊直接前往
我已有的FPGA視頻拼接疊加融合方案
我的主頁目前有FPGA視頻拼接疊加融合專欄,改專欄收錄了我目前手里已有的FPGA視頻拼接疊加融合方案,從實(shí)現(xiàn)方式分類有基于HSL實(shí)現(xiàn)的視頻拼接、基于純verilog代碼實(shí)現(xiàn)的視頻拼接;從應(yīng)用上分為單路、2路、3路、4路、8路、16路視頻拼接;視頻縮放+拼接;視頻融合疊加;從輸入視頻分類可分為OV5640攝像頭視頻拼接、SDI視頻拼接、CameraLink視頻拼接等等;以下是專欄地址:
點(diǎn)擊直接前往
3、設(shè)計(jì)思路框架
設(shè)計(jì)框圖
本博客提供4套vivado工程源碼,設(shè)計(jì)框圖如下:
視頻源選擇
視頻源有兩種,分別對(duì)應(yīng)開發(fā)者手里有沒有攝像頭的情況,一種是使用廉價(jià)的OV5640攝像頭模組;如果你的手里沒有攝像頭,或者你的開發(fā)板沒有攝像頭接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行,默認(rèn)使用ov5640作為視頻源;視頻源的選擇通過代碼頂層的`define宏定義進(jìn)行;如下:
選擇邏輯代碼部分如下:
選擇邏輯如下:
當(dāng)(注釋) define COLOR_TEST時(shí),輸入源視頻是ov5640攝像頭;
當(dāng)(不注釋) define COLOR_TEST時(shí),輸入源視頻是動(dòng)態(tài)彩條;
ov5640 i2c配置及采集
視頻源有兩種,分別對(duì)應(yīng)開發(fā)者手里有沒有攝像頭的情況,一種是使用廉價(jià)的OV5640攝像頭模組;如果你的手里沒有攝像頭,或者你的開發(fā)板沒有攝像頭接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行,默認(rèn)使用ov5640作為視頻源;ov5640需要i2c配置才能使用,需要i2c配置分辨率,然后將DVP接口的兩個(gè)時(shí)鐘一個(gè)像素的GRB565視頻數(shù)據(jù)采集為一個(gè)時(shí)鐘一個(gè)像素的RGB565或者RGB888視頻數(shù)據(jù);ov5640i2c配置及采集代碼如下:
ov5640配置和采集模塊頂層參數(shù)如下:
module helai_ov5640_rx #(
parameter DELAY = 1 , // 有的攝像頭使用轉(zhuǎn)接板與FPGA開發(fā)板連接,可能需要考慮上電延時(shí),不需要是設(shè)為0
parameter DEVID = 8'h78, // i2c 從機(jī)器件地址
parameter IMAGE_WIDTH = 1280 , // ov5640輸出視頻寬度
parameter IMAGE_HEIGHT = 720 , // ov5640輸出視頻高度
parameter RGB_TYPE = 1'd0 // 設(shè)為0-->輸出RGB565;設(shè)為1-->輸出RGB888
)(
input clk_25m , // 固定輸入 25M 時(shí)鐘
input rst_n , // 低電平復(fù)位
output cmos_scl , // ov5640的scl接口
inout cmos_sda , // ov5640的sda接口
input cmos_pclk_i , // ov5640的pclk接口
input cmos_href_i , // ov5640的href接口
input cmos_vsync_i, // ov5640的vsync接口
input [7:0] cmos_data_i , // ov5640的data接口
output cmos_xclk_o , // ov5640的xclk接口,如果你的攝像頭自帶晶振,則此信號(hào)不需要
output [23:0] ov5640_rgb , // 輸出的RGB視頻像素?cái)?shù)據(jù)
output ov5640_de , // 輸出的RGB視頻像素?cái)?shù)據(jù)有效信號(hào)
output ov5640_vs , // 輸出的RGB視頻場(chǎng)同步信號(hào)
output ov5640_hs , // 輸出的RGB視頻行同步信號(hào)
output cfg_done // ov5640配置完成拉高信號(hào)
);
ov5640配置和采集模塊的例化請(qǐng)參考工程源碼的頂層代碼;
動(dòng)態(tài)彩條
如果你的手里沒有ov5640,或者你得開發(fā)板沒有ov5640接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行,動(dòng)態(tài)彩條可配置為不同分辨率的視頻,視頻的邊框?qū)挾?,?dòng)態(tài)移動(dòng)方塊的大小,移動(dòng)速度等都可以參數(shù)化配置,我這里配置為辨率1280x720,動(dòng)態(tài)彩條模塊代碼位置和頂層接口和例化如下:
動(dòng)態(tài)彩條模塊的例化請(qǐng)參考工程源碼的頂層代碼;
圖像縮放模塊詳解
圖像縮放模塊功能框圖如下,由跨時(shí)鐘FIFO、插值+RAM陣列構(gòu)成,跨時(shí)鐘FIFO的目的是解決跨時(shí)鐘域的問題,比如從低分辨率視頻放大到高分辨率視頻時(shí),像素時(shí)鐘必然需要變大,這是就需要異步FIFO了,插值算法和RAM陣列具體負(fù)責(zé)圖像縮放算法層面的實(shí)現(xiàn);
插值算法和RAM陣列以ram和fifo為核心進(jìn)行數(shù)據(jù)緩存和插值實(shí)現(xiàn),設(shè)計(jì)架構(gòu)如下:
圖像縮放模塊代碼架構(gòu)如下:模塊的例化請(qǐng)參考工程源碼的頂層代碼;
圖像縮放模塊FIFO的選擇可以調(diào)用工程對(duì)應(yīng)的vivado工具自帶的FIFO IP核,也可以使用純verilog實(shí)現(xiàn)的FIFO,可通過接口參數(shù)選擇,圖像縮放模塊頂層接口如下:
module helai_video_scale #(
//---------------------------Parameters----------------------------------------
parameter FIFO_TYPE = "xilinx", // "xilinx" for xilinx-fifo ; "verilog" for verilog-fifo
parameter DATA_WIDTH = 8 , //Width of input/output data
parameter CHANNELS = 1 , //Number of channels of DATA_WIDTH, for color images
parameter INPUT_X_RES_WIDTH = 11 //Widths of input/output resolution control signals
)(
input i_reset_n , // 輸入--低電平復(fù)位信號(hào)
input [INPUT_X_RES_WIDTH-1:0] i_src_video_width , // 輸入視頻--即縮放前視頻的寬度
input [INPUT_X_RES_WIDTH-1:0] i_src_video_height, // 輸入視頻--即縮放前視頻的高度
input [INPUT_X_RES_WIDTH-1:0] i_des_video_width , // 輸出視頻--即縮后前視頻的寬度
input [INPUT_X_RES_WIDTH-1:0] i_des_video_height, // 輸出視頻--即縮后前視頻的高度
input i_src_video_pclk , // 輸入視頻--即縮前視頻的像素時(shí)鐘
input i_src_video_vs , // 輸入視頻--即縮前視頻的場(chǎng)同步信號(hào),必須為高電平有效
input i_src_video_de , // 輸入視頻--即縮前視頻的數(shù)據(jù)有效信號(hào),必須為高電平有效
input [DATA_WIDTH*CHANNELS-1:0] i_src_video_pixel , // 輸入視頻--即縮前視頻的像素?cái)?shù)據(jù)
input i_des_video_pclk , // 輸出視頻--即縮后視頻的像素時(shí)鐘,一般為寫入DDR緩存的時(shí)鐘
output o_des_video_vs , // 輸出視頻--即縮后視頻的場(chǎng)同步信號(hào),高電平有效
output o_des_video_de , // 輸出視頻--即縮后視頻的數(shù)據(jù)有效信號(hào),高電平有效
output [DATA_WIDTH*CHANNELS-1:0] o_des_video_pixel // 輸出視頻--即縮后視頻的像素?cái)?shù)據(jù)
);
FIFO_TYPE選擇原則如下:
1:總體原則,選擇"xilinx"好處大于選擇"verilog";
2:當(dāng)你的FPGA邏輯資源不足時(shí),請(qǐng)選"xilinx";
3:當(dāng)你圖像縮放的視頻分辨率較大時(shí),請(qǐng)選"xilinx";
4:當(dāng)你的FPGA沒有FIFO IP或者FIFO IP快用完了,請(qǐng)選"verilog";
5:當(dāng)你向自學(xué)一下異步FIFO時(shí),,請(qǐng)選"verilog";
6:不同F(xiàn)PGA型號(hào)對(duì)應(yīng)的工程FIFO_TYPE參數(shù)不一樣,但選擇原則一樣,具體參考代碼;
2種插值算法的整合與選擇
本設(shè)計(jì)將常用的雙線性插值和鄰域插值算法融合為一個(gè)代碼中,通過輸入?yún)?shù)選擇某一種算法;
具體選擇參數(shù)如下:
input wire i_scaler_type //0-->bilinear;1-->neighbor
通過輸入i_scaler_type 的值即可選擇;
輸入0選擇雙線性插值算法;
輸入1選擇鄰域插值算法;
代碼里的配置如下:
圖像縮放模塊使用
圖像縮放模塊使用非常簡(jiǎn)單,頂層代碼里設(shè)置了四個(gè)參數(shù),如下:
上圖視頻通過圖像縮放模塊但不進(jìn)行縮放操作,旨在掌握?qǐng)D像縮放模塊的用法;如果需要將圖像放大到1080P,則修改為如下:
當(dāng)然,需要修改的不僅僅這一個(gè)地方,F(xiàn)DMA的配置也需要相應(yīng)修改,詳情請(qǐng)參考代碼,但我想要證明的是,圖像縮放模塊使用非常簡(jiǎn)單,你都不需要知道它內(nèi)部具體怎么實(shí)現(xiàn)的,上手就能用;
多路視頻拼接算法
純verilog多路視頻拼接方案如下:以4路OV5640攝像頭拼接為例;
輸出屏幕分辨率為1920X1080;
輸入攝像頭分辨率為960X540;
4路輸入剛好可以占滿整個(gè)屏幕;
多路視頻的拼接顯示原理如下:
以把 2 個(gè)攝像頭 CAM0 和 CAM1 輸出到同一個(gè)顯示器上為列,為了把 2 個(gè)圖像顯示到 1 個(gè)顯示器,首先得搞清楚以下關(guān)系:
hsize:每 1 行圖像實(shí)際在內(nèi)存中占用的有效空間,以 32bit 表示一個(gè)像素的時(shí)候占用內(nèi)存大小為 hsize X 4;
hstride:用于設(shè)置每行圖像第一個(gè)像素的地址,以 32bit 表示一個(gè)像素的時(shí)候 v_cnt X hstride X 4;
vsize:有效的行;
因此很容易得出 cam0 的每行第一個(gè)像素的地址也是 v_cnt X hstride X 4;
同理如果我們需要把 cam1 在 hsize 和 vsize 空間的任何位置顯示,我們只要關(guān)心 cam1 每一行圖像第一個(gè)像素的地址,可以用以下公式 v_cnt X hstride X 4 + offset;
uifdma_dbuf 支持 stride 參數(shù)設(shè)置,stride 參數(shù)可以設(shè)置輸入數(shù)據(jù) X(hsize)方向每一行數(shù)據(jù)的第一個(gè)像素到下一個(gè)起始像素的間隔地址,利用 stride 參數(shù)可以非常方便地?cái)[放輸入視頻到內(nèi)存中的排列方式。
關(guān)于uifdma_dbuf,可以參考我之前寫的文章點(diǎn)擊查看:FDMA實(shí)現(xiàn)視頻數(shù)據(jù)三幀緩存
根據(jù)以上鋪墊,每路攝像頭緩存的基地址如下:
CAM0:ADDR_BASE=0x80000000;
CAM1:ADDR_BASE=0x80000000+(1920-960)X4;
CAM2:ADDR_BASE=0x80000000+(1080-540)X1920X4;
CAM3:ADDR_BASE=0x80000000+(1080-540)X1920X4+(1920-960)X4;
地址設(shè)置完畢后基本就完事兒了;
注意!
注意!
注意!
在Zynq的地址分配中,F(xiàn)DMA的基地址不是上述的0x80000000,而是0x01000000;因?yàn)?x00000000是Zynq內(nèi)核啟動(dòng)及其片內(nèi)外設(shè)的基地址,所以不能以0x00000000作為PL端設(shè)備的基地址,由于Zynq地址分配從0x00000000開始,所以也不可能將FDMA基地址人為設(shè)置為0x80000000了;
圖像緩存
經(jīng)??次也┛偷睦戏蹜?yīng)該都知道,我做圖像緩存的套路是FDMA,他的作用是將圖像送入DDR中做3幀緩存再讀出顯示,目的是匹配輸入輸出的時(shí)鐘差和提高輸出視頻質(zhì)量,關(guān)于FDMA,請(qǐng)參考我之前的博客,博客地址:點(diǎn)擊直接前往
FDMA圖像緩存架構(gòu)如下圖所示:截圖為4路視頻拼接,其他多路視頻拼接與之類似;
需要注意的是,Xilinx系列的Artix7、Kintex7以及紫光和高云工程都使用DDR3作為緩存,Zynq7020工程使用PS端的DDR3作為緩存;Artix7、Kintex7工程調(diào)用MIG IP實(shí)現(xiàn)DDR3讀寫;Zynq7020工程調(diào)用Zynq軟核實(shí)現(xiàn)DDR3讀寫;沒有用到VDMA之類的IP,所以不需要SDK配置;
這里多路視頻拼接時(shí),調(diào)用多路FDMA進(jìn)行緩存,具體講就是每一路視頻調(diào)用1路FDMA,以4路視頻拼接為例:
調(diào)用4路FDMA,其中三路配置為寫模式,因?yàn)檫@三路視頻在這里只需要寫入DDR3,讀出是由另一個(gè)FDMA完成,配置如下:
另外1路FDMA配置為讀寫模式,因?yàn)?路視頻需要同時(shí)一并讀出,配置如下:
視頻拼接的關(guān)鍵點(diǎn)在于4路視頻在DDR3中緩存地址的不同,還是以4路視頻拼接為例,4路FDMA的寫地址以此為:
第一路視頻緩存寫基地址:0x80000000;
第二路視頻緩存寫基地址:0x80000f00;
第三路視頻緩存寫基地址:0x803f4800;
第四路視頻緩存寫基地址:0x803f5700;
視頻緩存讀基地址:0x80000000;
視頻輸出
視頻從FDMA讀出后,經(jīng)過VGA時(shí)序模塊和HDMI發(fā)送模塊后輸出顯示器,代碼位置如下:
VGA時(shí)序配置為1920X1080,HDMI發(fā)送模塊采用verilog代碼手寫,可以用于FPGA的HDMI發(fā)送應(yīng)用,關(guān)于這個(gè)模塊,請(qǐng)參考我之前的博客,博客地址:點(diǎn)擊直接前往
工程源碼架構(gòu)
Xilinx Kintex7系列FPGA工程源碼架構(gòu)具有高度相似性,以工程5為例截圖如下:
4、工程代碼5詳解:掌握2路視頻縮放+拼接
開發(fā)板FPGA型號(hào):Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭或動(dòng)態(tài)彩條,分辨率1280x720;
輸出:1920x1080的輸出分辨率背景上疊加2路分辨率為960x1080的縮放拼接的視頻,即2分屏輸出顯示;
視頻縮放方案:輸入1280x720–>輸出960x1080;
視頻拼接方案:2路視頻拼接;
工程作用:此工程目的是讓讀者掌握2路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程Block Design請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“圖像緩存”小節(jié)內(nèi)容;
工程代碼架構(gòu)請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:該工程使用的是Xilinx fifo方案;
5、工程代碼6詳解:掌握4路視頻縮放+拼接
開發(fā)板FPGA型號(hào):Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭或動(dòng)態(tài)彩條,分辨率1280x720;
輸出:1920x1080的輸出分辨率背景上疊加4路分辨率為960x540的縮放拼接的視頻,即4分屏輸出顯示;
視頻縮放方案:輸入1280x720–>輸出960x540;
視頻拼接方案:4路視頻拼接;
工程作用:此工程目的是讓讀者掌握4路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程Block Design請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“圖像緩存”小節(jié)內(nèi)容;
工程代碼架構(gòu)請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:該工程使用的是Xilinx fifo方案;
6、工程代碼7詳解:掌握8路視頻縮放+拼接
開發(fā)板FPGA型號(hào):Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭或動(dòng)態(tài)彩條,分辨率1280x720;
輸出:1920x1080的輸出分辨率背景上疊加8路分辨率為480x540的縮放拼接的視頻,即8分屏輸出顯示;
視頻縮放方案:輸入1280x720–>輸出480x540;
視頻拼接方案:8路視頻拼接;
工程作用:此工程目的是讓讀者掌握8路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程Block Design請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“圖像緩存”小節(jié)內(nèi)容;
工程代碼架構(gòu)請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:該工程使用的是Xilinx fifo方案;
7、工程代碼7詳解:掌握16路視頻縮放+拼接
開發(fā)板FPGA型號(hào):Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭或動(dòng)態(tài)彩條,分辨率1280x720;
輸出:1920x1080的輸出分辨率背景上疊加16路分辨率為240x540的縮放拼接的視頻,即16分屏輸出顯示;
視頻縮放方案:輸入1280x720–>輸出240x540;
視頻拼接方案:16路視頻拼接;
工程作用:此工程目的是讓讀者掌握16路視頻縮放+拼接的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程Block Design請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“圖像緩存”小節(jié)內(nèi)容;
工程代碼架構(gòu)請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:該工程使用的是Xilinx fifo方案;
8、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點(diǎn)擊文件–>另存為;但此方法并不保險(xiǎn),最保險(xiǎn)的方法是將你的vivado版本升級(jí)到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會(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軟核;
9、上板調(diào)試驗(yàn)證并演示
準(zhǔn)備工作
需要如下器材設(shè)備:
1、FPGA開發(fā)板;
2、OV5640攝像頭或HDMI輸入設(shè)備,比如筆記本電腦,兩者都沒有則使用動(dòng)態(tài)彩條;
2、HDMI連接線和顯示器;
工程5:2路視頻縮放拼接輸出演示
工程5輸出演示,我將動(dòng)態(tài)彩條和ov5640攝像頭縮放拼接輸出的視頻剪輯整理后如下:
視頻前半段為動(dòng)態(tài)彩條縮放拼接輸出;
視頻前后段為ov5640攝像頭縮放拼接輸出;
2路視頻縮放拼接輸出演示
工程6:4路視頻縮放拼接輸出演示
工程6輸出演示,我將動(dòng)態(tài)彩條和ov5640攝像頭縮放拼接輸出的視頻剪輯整理后如下:
視頻前半段為動(dòng)態(tài)彩條縮放拼接輸出;
視頻前后段為ov5640攝像頭縮放拼接輸出;
4路視頻縮放拼接輸出演示
工程7:8路視頻縮放拼接輸出演示
工程7輸出演示,我將動(dòng)態(tài)彩條和ov5640攝像頭縮放拼接輸出的視頻剪輯整理后如下:
視頻前半段為動(dòng)態(tài)彩條縮放拼接輸出;
視頻前后段為ov5640攝像頭縮放拼接輸出;
8路視頻縮放拼接輸出演示
工程8:16路視頻縮放拼接輸出演示
工程8輸出演示,我將動(dòng)態(tài)彩條和ov5640攝像頭縮放拼接輸出的視頻剪輯整理后如下:
視頻前半段為動(dòng)態(tài)彩條縮放拼接輸出;
視頻前后段為ov5640攝像頭縮放拼接輸出;
16路視頻縮放拼接輸出演示文章來源:http://www.zghlxwxcb.cn/news/detail-716131.html
10、福利:工程源碼獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤資料如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-716131.html
到了這里,關(guān)于FPGA 多路視頻處理:圖像縮放+視頻拼接顯示,OV5640采集,提供2套工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!