1、前言
FPGA實(shí)現(xiàn)SDI視頻編解碼目前有兩種方案:
一是使用專用編解碼芯片,比如典型的接收器GS2971,發(fā)送器GS2972,優(yōu)點(diǎn)是簡單,比如GS2971直接將SDI解碼為并行的YCRCB,缺點(diǎn)是成本較高,可以百度一下GS2971的價格;
另一種方案是使用FPGA實(shí)現(xiàn)編解碼,利用FPGA的GTP/GTX資源實(shí)現(xiàn)解串,優(yōu)點(diǎn)是合理利用了FPGA資源,GTP/GTX資源不用白不用,缺點(diǎn)是操作難度大一些,對FPGA水平要求較高;我的主頁有SDI專欄,里面包含了利用FPGA的GTP/GTX資源的部分工程源碼;
本文詳細(xì)描述了FPGA基于GS2971/GS2972收發(fā)SDI視頻的實(shí)現(xiàn)設(shè)計方案,工程代碼編譯通過后上板調(diào)試驗(yàn)證,文章末尾有演示視頻,可直接項(xiàng)目移植,適用于在校學(xué)生做畢業(yè)設(shè)計、研究生項(xiàng)目開發(fā),也適用于在職工程師做項(xiàng)目開發(fā),可應(yīng)用于醫(yī)療、軍工等行業(yè)的數(shù)字成像和圖像傳輸領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請耐心看到最后;
本設(shè)計提供兩套vivado工程;
一是GS2971解碼SDI視頻,經(jīng)DDR圖像緩存后由HDMI輸出;SDI 1080P@30Hz幀視頻輸入;1080P@60Hz幀輸出;
二是GS2971解碼SDI視頻,經(jīng)DDR圖像緩存后由GS2972編碼SDI輸出;SDI 1080P@30Hz幀視頻輸入;SDI 1080P@30Hz幀輸出;
2、我目前已有的SDI編解碼方案
我的博客主頁開設(shè)有SDI視頻專欄,里面全是FPGA編解碼SDI的工程源碼及博客介紹;既有基于GS2971/GS2972的SDI編解碼,也有基于GTP/GTX資源的SDI編解碼;專欄地址鏈接:https://blog.csdn.net/qq_41667729/category_12243350.html?spm=1001.2014.3001.5482
3、GS2971/GS2972芯片解讀
GS2971解讀
GS2971是SDI解碼芯片,將輸入的SDI視頻解碼為yuv422視頻輸出;GS2971數(shù)據(jù)手冊框圖如下:
GS2971數(shù)據(jù)手冊共152頁,但作為一名FPGA開發(fā)者而言,大多數(shù)都是廢話,我們只需關(guān)心視頻的輸入與輸出格式即可;
由上圖可知,GS2971輸入為SDI視頻,輸出為yuv422視頻流;中間的解碼和轉(zhuǎn)換過程我們無需關(guān)心,這就是數(shù)字IC的魅力,將復(fù)雜的電路封裝為專用IC,用戶僅需讀讀手冊即可傻瓜式使用;
輸出yuv422視頻流屬于VGA視頻格式,有像素時鐘PCLK,行同步信號HS,場同步信號VS,數(shù)據(jù)有效信號DE,20位像素數(shù)據(jù)DOUT;GS2971輸出視頻直接與輸入的SDI視頻速率關(guān)聯(lián),以3G-SDI為例,輸入3G-SDI,輸出視頻像素時鐘則為148.5M,具體見手冊截圖:
另外,GS2971不需要軟件配置,電阻上下拉即可完成配置,這部分是畫原理圖的硬件工程師關(guān)心的事,不再多說;
GS2972解讀
GS2972的作用正好與GS2971相反,是SDI編碼芯片,將輸入的yuv422視頻編碼為SDI視頻輸出;芯片一樣不需要軟件配置,所以這里就不多說了;
4、詳細(xì)設(shè)計方案
本設(shè)計提供了兩套工程;
工程1:SDI輸入,經(jīng)GS2971解碼后緩存DDR3,最后由HDMI輸出;
工程2:SDI輸入,經(jīng)GS2971解碼后緩存DDR3,最后由GS2971編碼后SDI輸出;
設(shè)計框圖如下:兩個工程一同畫在框圖中;
5、vivado工程1解讀
硬件邏輯工程
開發(fā)板FPGA型號:Xilinx–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:3G-SDI視頻;
輸出:HDMI,1080P;
工程Block Design如下:
工程代碼架構(gòu)如下:
資源消耗和功耗預(yù)估如下:
軟件SDK工程
軟件SDK工程如下:只做了VDMA的配置;
主函數(shù)如下:
#include <stdio.h>
#include "xgpio.h"
#include "unistd.h"
#include "helai_vdma.h"
XGpio_Config *XGpioCfg;
XGpio led_gpio;
#define AXI_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
int main(){
XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
XGpio_CfgInitialize(&led_gpio, XGpioCfg, XGpioCfg->BaseAddress);
XGpio_SetDataDirection(&led_gpio, 1, 0); //output
XGpio_DiscreteWrite(&led_gpio, 1, 0);
helai_vdma();
while(1){
usleep(500000);
XGpio_DiscreteWrite(&led_gpio, 1, 1);
usleep(500000);
XGpio_DiscreteWrite(&led_gpio, 1, 0);
}
}
6、vivado工程2解讀
硬件邏輯工程
開發(fā)板FPGA型號:Xilinx–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:3G-SDI視頻;
輸出:3G-SDI視頻;
工程Block Design如下:
工程代碼架構(gòu)如下:
資源消耗和功耗預(yù)估如下:
軟件SDK工程
軟件SDK工程如下:只做了VDMA的配置;
主函數(shù)如下:
#include <stdio.h>
#include "xgpio.h"
#include "unistd.h"
#include "helai_vdma.h"
XGpio_Config *XGpioCfg;
XGpio led_gpio;
#define AXI_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
int main(){
XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
XGpio_CfgInitialize(&led_gpio, XGpioCfg, XGpioCfg->BaseAddress);
XGpio_SetDataDirection(&led_gpio, 1, 0); //output
XGpio_DiscreteWrite(&led_gpio, 1, 0);
helai_vdma();
while(1){
usleep(500000);
XGpio_DiscreteWrite(&led_gpio, 1, 1);
usleep(500000);
XGpio_DiscreteWrite(&led_gpio, 1, 0);
}
}
7、上板調(diào)試驗(yàn)證
以工程1為例,SDI進(jìn),HDMI輸出效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-471978.html
8、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式1:私,或者文章末尾的V名片。
資料獲取方式2:文章末尾的XX號,回復(fù) 001009
網(wǎng)盤資料如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-471978.html
到了這里,關(guān)于FPGA基于GS2971/GS2972實(shí)現(xiàn)SDI視頻收發(fā) 提供工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!