1、前言
FPGA實現(xiàn)SDI視頻編解碼目前有兩種方案:
一是使用專用編解碼芯片,比如典型的接收器GS2971,發(fā)送器GS2972,優(yōu)點是簡單,比如GS2971接收器直接將SDI解碼為并行的YCRCB,GS2972發(fā)送器直接將并行的YCRCB編碼為SDI視頻,缺點是成本較高,可以百度一下GS2971和GS2972的價格;
另一種方案是使用FPGA實現(xiàn)編解碼,利用FPGA的GTP/GTX資源實現(xiàn)解串,優(yōu)點是合理利用了FPGA資源,GTP/GTX資源不用白不用,缺點是操作難度大一些,對FPGA水平要求較高。
本文詳細描述了FPGA純verilog編解碼SDI視頻,然后任意尺寸縮放拼接輸出的實現(xiàn)設(shè)計方案,工程代碼編譯通過后上板調(diào)試驗證,文章末尾有演示視頻,可直接項目移植,適用于在校學生、研究生項目開發(fā),也適用于在職工程師做項目開發(fā),可應用于醫(yī)療、軍工等行業(yè)的數(shù)字成像和圖像傳輸領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請耐心看到最后;
2、SDI理論練習
SDI視頻協(xié)議比較復雜,我前面已經(jīng)寫過多篇文章,建議先回頭看看前面的文章再往下看有利于理解。
1、FPGA使用GTX解碼SDI參考鏈接:直接點擊查看
2、FPGA使用GTH解碼SDI參考鏈接:直接點擊查看
3、FPGA使用GTX實現(xiàn)SDI接收和發(fā)送參考鏈接:直接點擊查看
4、FPGA使用GTX實現(xiàn)SDI光口SFP收發(fā)參考鏈接:直接點擊查看
5、FPGA使用GTX實現(xiàn)SDI UDP網(wǎng)絡發(fā)送參考鏈接:直接點擊查看
6、FPGA使用GTX實現(xiàn)SDI視頻任意尺寸縮放參考鏈接:直接點擊查看
3、設(shè)計思路和架構(gòu)
設(shè)計思路和架構(gòu)如下:
本設(shè)計的流程為:
FPGA解碼3G-SDI輸入視頻,輸入分辨率為1920x1080@30Hz,經(jīng)硬件解碼后,將圖像縮小到960X540,并復制為4路視頻,模擬4路輸入,送到DDR3緩存做視頻拼接,最后4路視頻拼接顯示到1920X1080的顯示屏上,具體請看文章末尾的演示視頻。。。
SDI攝像頭
我用到的SDI攝像頭輸出視頻分辨率1080P@30Hz;根據(jù)不同相機有所區(qū)別;
Gv8601a單端轉(zhuǎn)差
Gv8601a起到均衡 EQ 功能,這里選用Gv8601a是因為抄襲了Xilinx官方的板子,當然也可以用其他型號器件。
GTX解串
GTX負責解串,將原始SDI視頻解為20位的并行數(shù)據(jù),我的板子是K7,所以用GTX,如果是A7的板子則用GTP,這里使用GTX并沒有調(diào)用IP,而是直接調(diào)用GTXE2_CHANNEL和GTXE2_COMMON源語,這一點可謂將Xilinx的GTX資源用到了極致水平,值得好好品讀,其實調(diào)用IP無非也就是把調(diào)用源語變得界面化而已,直接調(diào)用源語或許理解更為深刻,這一點,在市面上的所謂FPGA教程里都學不到。
SDI解碼
調(diào)用SMPTE-SDI IP核實現(xiàn),GTX只是將高速串行數(shù)據(jù)解為了并行,但并沒有解析SDI協(xié)議,SMPTE-SDI IP核則完成了SDI協(xié)議的解碼,去掉了SDI協(xié)議中的數(shù)據(jù)包信息和控制信息,解析出有效的視頻數(shù)據(jù),詳細的SMPTE-SDI IP核接口定義請參考官方的使用手冊;
VGA時序恢復
此模塊的作用就是解碼恢復出hs、vs以及de信號,即恢復正常的VGA視頻時序;
要恢復正常的VGA視頻時序,首先得看懂下面這張圖:
根據(jù)這張表即可恢復出圖像時序,具體看代碼,這里一兩句話實在講不清楚,如果要完全講明白,寫5本書都搓搓有余;
YUV轉(zhuǎn)RGB
這里就簡單了,YUV4:4:4轉(zhuǎn)RGB8:8:8,幾條公式和幾行代碼的事兒,屬于低端操作;
至此,SDI解碼過程就完成了,接下來就是圖像輸出過程;
圖像縮放
圖像縮放模塊采用純verilog代碼實現(xiàn),沒有任何IP,可在包括國產(chǎn)FPGA在內(nèi)的各種FPGA平臺間任意移植,支持任意比例、任意分辨率、任意尺寸圖像縮放,將臨近插值和雙線性插值兩種算法合二為一,通過輸入信號高低電平選擇其一,本設(shè)計選擇的雙線性插值算法。關(guān)于圖像縮放,請參考我之前的文章直接點擊查看
由于SDI攝像頭輸入是1920x1080,我的顯示器最高只支持1080P顯示,所以本設(shè)計只能做縮小,不能做放大,為了適應1080P屏幕的視頻拼接效果,所以將SDI圖像縮小到960X540分辨率。
FDMA圖像緩存實現(xiàn)拼接
我常用的FDMA數(shù)據(jù)緩存架構(gòu),詳情請參考我之前的文章:直接點擊查看
視頻拼接方案如下:
輸出屏幕分辨率為1920X1080;
輸入攝像頭分辨率為960X540;
4路輸入剛好可以占滿整個屏幕;
多路視頻的拼接顯示原理如下:
以把 2 個攝像頭 CAM0 和 CAM1 輸出到同一個顯示器上為列,為了把 2 個圖像顯示到 1 個顯示器,首先得搞清楚以下關(guān)系:
hsize:每 1 行圖像實際在內(nèi)存中占用的有效空間,以 32bit 表示一個像素的時候占用內(nèi)存大小為 hsize4;
hstride:用于設(shè)置每行圖像第一個像素的地址,以 32bit 表示一個像素的時候 v_cnt hstride4;
vsize:有效的行;
因此很容易得出 cam0 的每行第一個像素的地址也是 v_cnt hstride4;
同理如果我們需要把 cam1 在 hsize 和 vsize 空間的任何位置顯示,我們只要關(guān)心 cam1 每一行圖像第一個像素的地址,可以用以下公式 v_cnt hstride*4+offset;
uifdma_dbuf 支持 stride 參數(shù)設(shè)置,stride 參數(shù)可以設(shè)置輸入數(shù)據(jù) X(hsize)方向每一行數(shù)據(jù)的第一個像素到下一個起始像素的間隔地址,利用 stride 參數(shù)可以非常方便地擺放輸入視頻到內(nèi)存中的排列方式。
根據(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è)置完畢后基本就完事兒了;
關(guān)于視頻拼接的詳細設(shè)計方案,請參考我之前寫的文章:直接點擊查看
HDMI驅(qū)動
我常用的串口解析架構(gòu),純verilog代碼實現(xiàn)HDMI發(fā)送,詳情請參考我之前的文章:直接點擊查看
4、vivado工程詳解
開發(fā)板:Xilinx Kintex7開發(fā)板;
開發(fā)環(huán)境:vivado2019.1;
輸入:3G-SDI攝像頭,分辨率1920x1080@30Hz;
輸出:HDMI,分辨率1920x1080@60Hz,4路960X540視頻拼接顯示;
工程Block Design部分如下:
Block Design部分只做到了FDMA圖像緩存部分,本設(shè)計的FDMA較之前的FDMA做了小幅改動,目的是為了實現(xiàn)動態(tài)分辨率的配置。。。
綜合后的工程代碼架構(gòu)如下:
資源消耗和功耗預估如下:
5、上板調(diào)試驗證并演示
直接看演示視頻:
SDI-縮放-拼接文章來源:http://www.zghlxwxcb.cn/news/detail-707567.html
6、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式1:私,或者文章末尾的V名片。
資料獲取方式2:文章末尾的XX號,回復 001005
網(wǎng)盤資料如下:
自定義IP和源碼在這個文件夾里:文章來源地址http://www.zghlxwxcb.cn/news/detail-707567.html
到了這里,關(guān)于FPGA解碼SDI視頻任意尺寸縮放拼接輸出 提供工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!