潮州網(wǎng)站開發(fā)黃頁推廣2021
目錄
- 1、前言
- 版本更新說明
- 給讀者的一封信
- FPGA就業(yè)高端項(xiàng)目培訓(xùn)計(jì)劃
- 免責(zé)聲明
- 2、相關(guān)方案推薦
- 我這里已有的FPGA圖像縮放方案
- 本方案在Xilinx Kintex7 系列FPGA上的應(yīng)用
- 本方案在Xilinx Artix7 系列FPGA上的應(yīng)用
- 本方案在國產(chǎn)FPGA紫光同創(chuàng)系列上的應(yīng)用
- 本方案在國產(chǎn)FPGA高云系列上的應(yīng)用
- 3、設(shè)計(jì)思路框架
- 設(shè)計(jì)框圖
- 視頻源選擇
- ov5640 i2c配置及采集
- 動(dòng)態(tài)彩條
- 圖像縮放模塊詳解
- 圖像縮放模塊使用
- 圖像緩存
- 視頻輸出
- PL端邏輯工程源碼架構(gòu)
- PS端SDK軟件工程源碼架構(gòu)
- 4、vivado和matlab聯(lián)合仿真
- 5、工程代碼9詳解:掌握?qǐng)D像縮放模塊用法
- 6、工程代碼10詳解:掌握?qǐng)D像縮小操作
- 7、工程代碼11詳解:掌握?qǐng)D像放大操作
- 8、工程移植說明
- vivado版本不一致處理
- FPGA型號(hào)不一致處理
- 其他注意事項(xiàng)
- 9、上板調(diào)試驗(yàn)證并演示
- 準(zhǔn)備工作
- 工程9輸出演示
- 工程10輸出演示
- 工程11輸出演示
- 10、福利:工程源碼獲取
FPGA高端項(xiàng)目:Xilinx Zynq7020 系列FPGA純verilog圖像縮放工程解決方案 提供3套工程源碼和技術(shù)支持
1、前言
沒玩過圖像縮放都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。目前市面上主流的FPGA圖像縮放方案如下:
1:Xilinx的HLS方案,該方案簡單,易于實(shí)現(xiàn),但只能用于Xilinx自家的FPGA;關(guān)于HLS實(shí)現(xiàn)圖像縮放請(qǐng),參考我之前寫的文章HLS實(shí)現(xiàn)圖像縮放點(diǎn)擊查看:HLS圖像縮放
2:非純Verilog方案,大部分代碼使用Verilog實(shí)現(xiàn),但中間的fifo或ram等使用了IP,導(dǎo)致移植性變差,難以在Xilinx、Altera和國產(chǎn)FPGA之間自由移植;
3:純Verilog方案,也就是本方案,一個(gè)字:牛逼!!!
本文使用Xilinx的Zynq7020系列FPGA純verilog代碼實(shí)現(xiàn)圖像縮放,視頻源有兩種,分別對(duì)應(yīng)開發(fā)者手里有沒有攝像頭的情況,一種是使用廉價(jià)的OV5640攝像頭模組;如果你的手里沒有攝像頭,或者你的開發(fā)板沒有攝像頭接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行,默認(rèn)使用ov5640作為視頻源;圖像縮放模塊支持領(lǐng)域插值和雙線性插值2種算法,通過模塊頂層參數(shù)選擇,默認(rèn)使用雙線性插值;縮放后的圖像使用我常用的FDMA圖像緩存架構(gòu)進(jìn)出DDR3等存儲(chǔ)設(shè)備進(jìn)行圖像的三幀緩存,縮放后的視頻最好進(jìn)行緩存操作,因?yàn)榭s放后原本的視頻時(shí)序已經(jīng)被打亂,不緩存的話直接讀出基本是錯(cuò)誤且不對(duì)齊的數(shù)據(jù),輸出的圖像是亂碼;從DDR3讀出視頻經(jīng)過VGA時(shí)序生成標(biāo)準(zhǔn)的VGA時(shí)序視頻,最后用純verilog顯示的HDMI輸出模塊送顯示器顯示即可;針對(duì)目前市面上主流的FPGA,本純verilog圖像縮放方案一共移植了17套工程源碼,本博文介紹其中基于Xilinx Zynq7020系列FPGA的3套工程,詳情如下:
這里說明一下提供的3套工程源碼的作用和價(jià)值,如下:
工程源碼1:圖像不縮放操作
ov5640或者動(dòng)態(tài)彩條輸入,HDMI輸出,圖像經(jīng)過圖像縮放模塊,但并不做縮放操作,即圖像進(jìn)入圖像縮放模塊前的分辨率為1280x720,圖像經(jīng)過圖像縮放模塊出來后的分辨率依然為1280x720,目的是讓讀者知道圖像縮放模塊的用法,為后面的縮小和放大等操作打好基礎(chǔ);
工程源碼2:圖像縮小操作
ov5640或者動(dòng)態(tài)彩條輸入,HDMI輸出,圖像經(jīng)過圖像縮放模塊,并進(jìn)行縮小操作,即圖像進(jìn)入圖像縮放模塊前的分辨率為1280x720,圖像經(jīng)過圖像縮放模塊出來后的分辨率為800x600,目的是讓讀者知道圖像縮放模塊縮小操作的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程源碼3:圖像放大操作
ov5640或者動(dòng)態(tài)彩條輸入,HDMI輸出,圖像經(jīng)過圖像縮放模塊,并進(jìn)行放大操作,即圖像進(jìn)入圖像縮放模塊前的分辨率為1280x720,圖像經(jīng)過圖像縮放模塊出來后的分辨率為1920x1080,目的是讓讀者知道圖像縮放模塊放大操作的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
本博客詳細(xì)描述了FPGA高端項(xiàng)目:Xilinx Zynq7020 系列的純verilog圖像縮放工程解決方案的設(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ū)域圖像的方式,在后面有貼圖;
現(xiàn)在根據(jù)讀者的建議,又對(duì)第2版工程做了改進(jìn)和更新形成如下的第3版:
1:優(yōu)化了圖像縮放模塊代碼結(jié)構(gòu),將原來的跨時(shí)鐘域FIFO納入圖像縮放模塊內(nèi)部,并添加了新的頂層接口和配置參數(shù),使能原來復(fù)雜的頂層接口和參數(shù)變得十分簡潔;
2:新增了純verilog實(shí)現(xiàn)的異步FIFO,代碼里可選Xilinx的FIFO IP核,也可選verilog實(shí)現(xiàn)的異步FIFO,通過頂層參數(shù)選擇,這樣就使得圖像縮放模塊移植性和通用性更強(qiáng);
3:新增了一套工程源碼,該工程主要針對(duì)高分辨率輸入視頻的圖像縮放的項(xiàng)目需求,新增的工程采用高達(dá)1920x1080@60Hz的HDMI輸入視頻進(jìn)行圖像縮放操作;
4:工程整體使用難度大大降低,由于優(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);其次它簡單,只需要你花時(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)目,就能在公司呆下去了,原因很簡單,老板招你來是干活兒的,不是招你來學(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ā)你上述17套工程源碼和對(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)擊直接前往
本方案在Xilinx Kintex7 系列FPGA上的應(yīng)用
本方案適應(yīng)于所有FPGA平臺(tái),針對(duì)目前市面上主流的FPGA,本博將本方案分別移植到了Xilinx 的Artix7、Kintex7、Zynq7020、紫光同創(chuàng)、高云等平臺(tái),本文講述的是在Xilinx Zynq7020 系列FPGA上的應(yīng)用,想要直接應(yīng)用于Xilinx Kintex7 系列FPGA的讀者,可以參考我之前寫得博客,以下是博客地址:
點(diǎn)擊直接前往
本方案在Xilinx Artix7 系列FPGA上的應(yīng)用
本方案適應(yīng)于所有FPGA平臺(tái),針對(duì)目前市面上主流的FPGA,本博將本方案分別移植到了Xilinx 的Artix7、Kintex7、Zynq7020、紫光同創(chuàng)、高云等平臺(tái),本文講述的是在Xilinx Zynq7020 系列FPGA上的應(yīng)用,想要直接應(yīng)用于Xilinx Artix7 系列FPGA的讀者,可以參考我之前寫得博客,以下是博客地址:
點(diǎn)擊直接前往
本方案在國產(chǎn)FPGA紫光同創(chuàng)系列上的應(yīng)用
本方案適應(yīng)于所有FPGA平臺(tái),針對(duì)目前市面上主流的FPGA,本博將本方案分別移植到了Xilinx 的Artix7、Kintex7、Zynq7020、紫光同創(chuàng)、高云等平臺(tái),本文講述的是在Xilinx Zynq7020 系列FPGA上的應(yīng)用,想要直接應(yīng)用于國產(chǎn)FPGA紫光同創(chuàng)系列FPGA的讀者,可以參考我之前寫得博客,以下是博客地址:
點(diǎn)擊直接前往
本方案在國產(chǎn)FPGA高云系列上的應(yīng)用
本方案適應(yīng)于所有FPGA平臺(tái),針對(duì)目前市面上主流的FPGA,本博將本方案分別移植到了Xilinx 的Artix7、Kintex7、Zynq7020、紫光同創(chuàng)、高云等平臺(tái),本文講述的是在Xilinx Zynq7020 系列FPGA上的應(yīng)用,想要直接應(yīng)用于國產(chǎn)FPGA高云系列FPGA的讀者,可以參考我之前寫得博客,以下是博客地址:
點(diǎn)擊直接前往
3、設(shè)計(jì)思路框架
設(shè)計(jì)框圖
本博客提供4套vivado工程源碼,設(shè)計(jì)框圖如下:
本設(shè)計(jì)的圖像緩存在Zynq7020 PS側(cè)DDR3中,需要調(diào)用Zynq7軟核完成DDR3的配置;
視頻源選擇
視頻源有兩種,分別對(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è)為0parameter 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視頻場同步信號(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ū)挾?#xff0c;動(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-fifoparameter DATA_WIDTH = 8 , //Width of input/output dataparameter CHANNELS = 1 , //Number of channels of DATA_WIDTH, for color imagesparameter 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 , // 輸入視頻--即縮前視頻的場同步信號(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 , // 輸出視頻--即縮后視頻的場同步信號(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選擇鄰域插值算法;
代碼里的配置如下:
圖像縮放模塊使用
圖像縮放模塊使用非常簡單,頂層代碼里設(shè)置了四個(gè)參數(shù),如下:
上圖視頻通過圖像縮放模塊但不進(jìn)行縮放操作,旨在掌握?qǐng)D像縮放模塊的用法;如果需要將圖像放大到1080P,則修改為如下:
當(dāng)然,需要修改的不僅僅這一個(gè)地方,FDMA的配置也需要相應(yīng)修改,詳情請(qǐng)參考代碼,但我想要證明的是,圖像縮放模塊使用非常簡單,你都不需要知道它內(nèi)部具體怎么實(shí)現(xiàn)的,上手就能用;
圖像緩存
Xilinx系列FPGA工程使用我常用的FDMA架構(gòu),紫光同創(chuàng)系列FPGA工程使用我常用的HDMA架構(gòu),高云系列FPGA工程使用自家?guī)У腎P架構(gòu);圖像緩存的作用是將圖像送入DDR中做3幀緩存再讀出顯示,目的是匹配輸入輸出的時(shí)鐘差和提高輸出視頻質(zhì)量,關(guān)于FDMA,請(qǐng)參考我之前的博客,博客地址:點(diǎn)擊直接前往
FDMA圖像緩存架構(gòu)在Block Design中如下:
需要注意的是,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讀寫;
視頻輸出
視頻從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)擊直接前往
PL端邏輯工程源碼架構(gòu)
Xilinx Zynq7020 系列FPGA工程源碼架構(gòu)具有高度相似性,以工程9為例截圖如下:
PS端SDK軟件工程源碼架構(gòu)
Xilinx Zynq7020 系列FPGA純verilog圖像縮放工程沒有用官方推薦的VDMA方案,而是用了自定義的FDMA方案,雖然不需要SDK配置,但FDMA的AXI4接口時(shí)鐘由Zynq提供,所以需要運(yùn)行SDK程序才能啟動(dòng)Zynq,從而為PL端邏輯提供時(shí)鐘;由于不需要SDK配置,所以SDK軟件代碼就變得極度簡單,只需運(yùn)行一個(gè)“Hello World”即可,如下:
4、vivado和matlab聯(lián)合仿真
需要注意的是,方針的目的是為了驗(yàn)證,這一步我已經(jīng)替你們做完了,所以讀者不再需要單獨(dú)仿真,如果讀者是在需要自己仿真玩玩兒,需要自己寫仿真代碼;vivado和matlab聯(lián)合仿真詳細(xì)步驟如下:
第一步:網(wǎng)上下載一張1280X720的圖片,并用matlab將圖片轉(zhuǎn)換為RGB格式的txt文檔;
第二步:在vivado下設(shè)計(jì)tstbench,將RGB格式的txt文檔作為視頻輸入源給到圖像縮放模塊,并將縮放后的圖像數(shù)據(jù)寫入輸出txt文檔;
第二步:用matlab將輸出txt文檔轉(zhuǎn)換為圖片,并于原圖一并輸出顯示以做比較;
根據(jù)以上方法得到以下仿真結(jié)果:
雙線性插值算法原圖1280X720縮小到800x600如下:
鄰域插值算法原圖1280X720縮小到800x600如下:
雙線性插值算法原圖1280X720放大到1920x1080如下:
鄰域插值算法原圖1280X720放大到1920x1080如下:
5、工程代碼9詳解:掌握?qǐng)D像縮放模塊用法
開發(fā)板FPGA型號(hào):Xilinx–Zynq7020–xc7z020clg400-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭或動(dòng)態(tài)彩條,分辨率1280x720;
輸出:HDMI,1080P分辨率下的720P有效區(qū)域顯示;
輸入輸出縮放方案:輸入1280x720–>輸出1280x720;
工程作用:掌握?qǐng)D像縮放模塊的用法,為后面的縮小和放大等操作打好基礎(chǔ);
工程Block Design請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“圖像緩存”小節(jié)內(nèi)容;
工程代碼架構(gòu)請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“PL端邏輯工程源碼架構(gòu)”和“PS端SDK軟件工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:該工程使用的是純verilog fifo方案;
6、工程代碼10詳解:掌握?qǐng)D像縮小操作
開發(fā)板FPGA型號(hào):Xilinx–Zynq7020–xc7z020clg400-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭或動(dòng)態(tài)彩條,分辨率1280x720;
輸出:HDMI,1080P分辨率下的800x600有效區(qū)域顯示;
輸入輸出縮放方案:輸入1280x720–>輸出800x600;
工程作用:掌握?qǐng)D像縮放模塊縮小操作的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程Block Design請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“圖像緩存”小節(jié)內(nèi)容;
工程代碼架構(gòu)請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“PL端邏輯工程源碼架構(gòu)”和“PS端SDK軟件工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:該工程使用的是純verilog fifo方案;
7、工程代碼11詳解:掌握?qǐng)D像放大操作
開發(fā)板FPGA型號(hào):Xilinx–Zynq7020–xc7z020clg400-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭或動(dòng)態(tài)彩條,分辨率1280x720;
輸出:HDMI,1080P分辨率下的1920x1080有效區(qū)域顯示;
輸入輸出縮放方案:輸入1280x720–>輸出1920x1080;
工程作用:掌握?qǐng)D像縮放模塊放大操作的用法,以便能夠移植和設(shè)計(jì)自己的項(xiàng)目;
工程Block Design請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“圖像緩存”小節(jié)內(nèi)容;
工程代碼架構(gòu)請(qǐng)參考第3章節(jié)“設(shè)計(jì)思路框架”的“PL端邏輯工程源碼架構(gòu)”和“PS端SDK軟件工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:該工程使用的是Xilinx fifo ip方案;
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連接線和顯示器;
工程9輸出演示
工程9輸出演示,我將動(dòng)態(tài)彩條原圖1280x720和ov5640攝像頭原圖1280x720輸出的視頻剪輯整理后如下:
視頻前半段為動(dòng)態(tài)彩條原圖1280x720輸出;
視頻前后段為ov5640攝像頭原圖1280x720輸出;
R-720P-720P-2024
工程10輸出演示
工程10輸出演示,我將動(dòng)態(tài)彩條原圖1280x720縮小到800x600和ov5640攝像頭原圖1280x720縮小到800x600輸出的視頻剪輯整理后如下:
視頻前半段為動(dòng)態(tài)彩條原圖1280x720縮小到800x600輸出;
視頻前后段為ov5640攝像頭原圖1280x720縮小到800x600輸出;
R-720P-600P-2024
工程11輸出演示
工程11輸出演示,我將動(dòng)態(tài)彩條原圖1280x720放大到1920x1080和ov5640攝像頭原圖1280x720放大到1920x1080輸出的視頻剪輯整理后如下:
視頻前半段為動(dòng)態(tài)彩條原圖1280x720放大到1920x1080輸出;
視頻前后段為ov5640攝像頭原圖1280x720放大到1920x1080輸出;
R-720P-1080P-2024
10、福利:工程源碼獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤資料如下: