目錄
- 1、前言
- 工程概述
- 免責聲明
- 2、相關方案推薦
- 本博已有的 SDI 編解碼方案
- 本方案在Xilinx--Kintex系列FPGA上的應用
- 3、詳細設計方案
- 設計原理框圖
- SDI 輸入設備
- Gv8601a 均衡器
- GTX 解串與串化
- SMPTE SD/HD/3G SDI IP核
- BT1120轉RGB
- 圖像緩存
- 視頻讀取控制
- HDMI輸出
- RGB轉BT1120
- Gv8500 驅動器
- SDI轉HDMI盒子
- 工程源碼架構
- 4、工程源碼1詳解-->3G-SDI轉HDMI,無緩存輸出方案
- 5、工程源碼2詳解-->3G-SDI轉HDMI,FDMA緩存輸出方案
- 6、工程源碼3詳解-->3G-SDI轉3G-SDI,FDMA緩存輸出方案
- 7、工程源碼4詳解-->3G-SDI轉HDMI,VDMA緩存輸出方案
- 8、工程源碼5詳解-->3G-SDI轉3G-SDI,VDMA緩存輸出方案
- 9、工程移植說明
- vivado版本不一致處理
- FPGA型號不一致處理
- 其他注意事項
- 10、上板調試驗證
- 準備工作
- 輸出視頻演示
- 11、福利:工程代碼的獲取
Zynq系列FPGA實現SDI視頻編解碼,基于GTX高速接口,提供5套工程源碼和技術支持
1、前言
目前FPGA實現SDI視頻編解碼有兩種方案:一是使用專用編解碼芯片,比如典型的接收器GS2971,發送器GS2972,優點是簡單,比如GS2971接收器直接將SDI解碼為并行的YCrCb422,GS2972發送器直接將并行的YCrCb422編碼為SDI視頻,缺點是成本較高,可以百度一下GS2971和GS2972的價格;另一種方案是使用FPGA邏輯資源部實現SDI編解碼,利用Xilinx系列FPGA的GTP/GTX資源實現解串,利用Xilinx系列FPGA的SMPTE SDI資源實現SDI編解碼,優點是合理利用了FPGA資源,GTP/GTX資源不用白不用,缺點是操作難度大一些,對FPGA開發者的技術水平要求較高。有意思的是,這兩種方案在本博這里都有對應的解決方案,包括硬件的FPGA開發板、工程源碼等等。
工程概述
本設計基于Zynq系列的Zynq7100 FPGA開發板實現SDI視頻編解碼,輸入源為一個3G-SDI相機或者HDMI轉3G-SDI盒子,也可以使用HD-SDI或者SD-SDI相機,因為本設計是三種SDI視頻自適應的;同軸的SDI視頻通過同軸線連接到FPGA開發板的BNC座子,然后同軸視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ的功能;然后差分SDI視頻信號進入FPGA內部的GTX高速資源,實現數據高速串行到并行的轉換,本博稱之為解串;解串后的并行視頻再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,進行SDI視頻解碼操作并輸出BT1120視頻,至此,SDI視頻解碼操作已經完成,可以進行常規的圖像處理操作了;
本設計的目的是輸出解碼的SDI視頻,針對目前市面上的主流項目需求,本博設計了兩種輸出方式,一種是HDMI輸出,另一種是3G-SDI輸出,這兩種方式都需要對解碼BT1120視頻進行轉RGB和圖像緩存操作;本設計使用BT1120轉RGB模塊實現視頻格式轉換;使用本博常用的FDMA或者Xilinx官方的VDMA圖像緩存架構實現圖像3幀緩存,緩存介質為板載的PS端DDR3;也可以不要緩存直接輸出,這種方式的優點是延時很低,適用于低延時場景;圖像從DDR3讀出后,進入HDMI發送模塊輸出HDMI顯示器,這是HDMI輸出方式;或者經過RGB轉BT1120模塊實現視頻格式轉換,然后視頻進入SMPTE SD/HD/3G SDI IP核,進行SDI視頻編碼操作并輸出SDI視頻,再經過FPGA內部的GTX高速資源,實現并行數據到高速串行的轉換,本博稱之為串化,差分高速信號再進入板載的Gv8500芯片實現差分轉單端和驅動增強的功能,SDI視頻通過FPGA開發板的BNC座子輸出,通過同軸線連接到SDI轉HDMI盒子連接到HDMI顯示器,這是SDI輸出方式;本博客提供5套工程源碼,具體如下:
現對上述5套工程源碼做如下解釋,方便讀者理解:
工程源碼1
開發板FPGA型號為Xilinx–>Xilinx-Zynq7100–xc7z100ffg900-2;輸入視頻為3G-SDI相機或者HDMI轉3G-SDI盒子,輸入分辨率為1920x1080@60Hz,輸入視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ后送入FPGA;再經過GTX將SDI視頻解串為并行數據;再經過SMPTE SDI IP核將SDI解碼BT1120數據;再經過BT1120轉RGB模塊將BT1120轉換為RGB888視頻;然后不經過任何緩存,直接將視頻送RGB轉HDMI模塊,將RGB888視頻轉換為HDMI視頻,輸出分辨率為1920x1080@60Hz;最后通過HDMI顯示器顯示圖像;該工程不需要緩存,適用于SDI轉HDMI的低延時場景;
工程源碼2
開發板FPGA型號為Xilinx–>Xilinx-Zynq7100–xc7z100ffg900-2;輸入視頻為3G-SDI相機或者HDMI轉3G-SDI盒子,輸入分辨率為1920x1080@60Hz,輸入視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ后送入FPGA;再經過GTX將SDI視頻解串為并行數據;再經過SMPTE SDI IP核將SDI解碼BT1120數據;再經過BT1120轉RGB模塊將BT1120轉換為RGB888視頻;再經過自研的FDMA圖像緩存方案將視頻寫入PS側DDR3做三幀緩存;然后讀出視頻送入RGB轉HDMI模塊,將RGB888視頻轉換為HDMI視頻,輸出分辨率為1920x1080@60Hz;最后通過HDMI顯示器顯示圖像;該工程需要緩存,需要運行Zynq軟核;適用于SDI轉HDMI場景;
工程源碼3
開發板FPGA型號為Xilinx–>Xilinx-Zynq7100–xc7z100ffg900-2;輸入視頻為3G-SDI相機或者HDMI轉3G-SDI盒子,輸入分辨率為1920x1080@60Hz,輸入視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ后送入FPGA;經過GTX將SDI視頻解串為并行數據;再經過SMPTE SDI IP核將SDI解碼BT1120數據;再經過BT1120轉RGB模塊將BT1120轉換為RGB888視頻;再經過自研的FDMA圖像緩存方案將視頻寫入PS側DDR3做三幀緩存;然后讀出視頻送RGB轉BT1120模塊,將RGB888視頻轉換為BT1120視頻;再經過SMPTE SD/HD/3G SDI IP核,將BT1120視頻編碼為SDI視頻;再經過FPGA內部的GTX高速資源,將SDI并行數據轉換為高速串行信號;再經過板載的Gv8500芯片實現差分轉單端和驅動增強后輸出,輸出分辨率為1920x1080@60Hz;最后使用SDI轉HDMI盒子連接到HDMI顯示器顯示;該工程需要緩存,需要運行Zynq軟核;適用于SDI轉HDMI場景;
工程源碼4
開發板FPGA型號為Xilinx–>Xilinx-Zynq7100–xc7z100ffg900-2;輸入視頻為3G-SDI相機或者HDMI轉3G-SDI盒子,輸入分辨率為1920x1080@60Hz,輸入視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ后送入FPGA;再經過GTX將SDI視頻解串為并行數據;再經過SMPTE SDI IP核將SDI解碼BT1120數據;再經過BT1120轉RGB模塊將BT1120轉換為RGB888視頻;再經過Xilinx官方的VDMA圖像緩存方案將視頻寫入PS側DDR3做三幀緩存;然后讀出視頻送入RGB轉HDMI模塊,將RGB888視頻轉換為HDMI視頻,輸出分辨率為1920x1080@60Hz;最后通過HDMI顯示器顯示圖像;該工程需要緩存,需要運行Zynq軟核;適用于SDI轉HDMI場景;
工程源碼5
開發板FPGA型號為Xilinx–>Xilinx-Zynq7100–xc7z100ffg900-2;輸入視頻為3G-SDI相機或者HDMI轉3G-SDI盒子,輸入分辨率為1920x1080@60Hz,輸入視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ后送入FPGA;經過GTX將SDI視頻解串為并行數據;再經過SMPTE SDI IP核將SDI解碼BT1120數據;再經過BT1120轉RGB模塊將BT1120轉換為RGB888視頻;再經過Xilinx官方的VDMA圖像緩存方案將視頻寫入PS側DDR3做三幀緩存;然后讀出視頻送RGB轉BT1120模塊,將RGB888視頻轉換為BT1120視頻;再經過SMPTE SD/HD/3G SDI IP核,將BT1120視頻編碼為SDI視頻;再經過FPGA內部的GTX高速資源,將SDI并行數據轉換為高速串行信號;再經過板載的Gv8500芯片實現差分轉單端和驅動增強后輸出,輸出分辨率為1920x1080@60Hz;最后使用SDI轉HDMI盒子連接到HDMI顯示器顯示;該工程需要緩存,需要運行Zynq軟核;適用于SDI轉HDMI場景;
免責聲明
本工程及其源碼即有自己寫的一部分,也有網絡公開渠道獲取的一部分(包括CSDN、Xilinx官網、Altera官網等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個人學習和研究,禁止用于商業用途,若由于讀者或粉絲自身原因用于商業用途所導致的法律問題,與本博客及博主無關,請謹慎使用。。。
2、相關方案推薦
本博已有的 SDI 編解碼方案
我的博客主頁開設有SDI視頻專欄,里面全是FPGA編解碼SDI的工程源碼及博客介紹;既有基于GS2971/GS2972的SDI編解碼,也有基于GTP/GTX資源的SDI編解碼;既有HD-SDI、3G-SDI,也有6G-SDI、12G-SDI等;專欄地址鏈接如下:
點擊直接前往
本方案在Xilinx–Kintex系列FPGA上的應用
本方案在Xilinx–Kintex系列FPGA上的也有應用,之前專門寫過一篇博客,博客地址鏈接如下:
點擊直接前往
3、詳細設計方案
設計原理框圖
設計原理框圖如下:
注意!!!!
注意!!!!
紅色箭頭:無緩存HDMI輸出路徑
紫色箭頭:有緩存3G-SDI輸出路徑
綠色箭頭:有緩存HDMI輸出路徑
SDI 輸入設備
SDI 輸入設備可以是SDI相機,代碼兼容HD/SD/3G-SDI三種模式;SDI相機相對比較貴,預算有限的朋友可以考慮用HDMI轉SDI盒子模擬SDI相機,這種盒子某寶一百塊左右;當使用HDMI轉SDI盒子時,輸入源可以用筆記本電腦,即用筆記本電腦通過HDMI線連接到HDMI轉SDI盒子的HDMI輸入接口,再用SDI線連接HDMI轉SDI盒子的SDI輸出接口到FPGA開發板,如下:
Gv8601a 均衡器
Gv8601a芯片實現單端轉差分和均衡EQ的功能,這里選用Gv8601a是因為借鑒了了Xilinx官方的方案,當然也可以用其他型號器件。Gv8601a均衡器原理圖如下:
GTX 解串與串化
本設計使用Xilinx特有的GTX高速信號處理資源實現SDI差分視頻信號的解串與串化,對于SDI視頻接收而言,GTX起到解串的作用,即將輸入的高速串行的差分信號解為并行的數字信號;對于SDI視頻發送而言,GTX起到串化的作用,即將輸入的并行的數字信號串化為高速串行的差分信號;GTX的使用一般需要例化GTX IP核,通過vivado的UI界面進行配置,但本設計需要對SD-SDI、HD-SDI、3G-SDI視頻進行自動識別和自適應處理,所以需要使得GTX具有動態改變線速率的功能,該功能可通過DRP接口配置,也可通過GTX的rate接口配置,所以不能使用vivado的UI界面進行配置,而是直接例化GTX的GTXE2_CHANNEL和GTXE2_COMMON源語直接使用GTX資源;此外,為了動態配置GTX線速率,還需要GTX控制模塊,該模塊參考了Xilinx的官方設計方案,具有動態監測SDI模式,動態配置DRP等功能;該方案參考了Xilinx官方的設計;GTX 解串與串化模塊代碼架構如下:
SMPTE SD/HD/3G SDI IP核
SMPTE SD/HD/3G SDI IP核是Xilinx系列FPGA特有的用于SDI視頻編解碼的IP,該IP配置使用非常簡單,vivado的UI界面如下:
SMPTE SD/HD/3G SDI IP核必須與GTX配合才能使用,對于SDI視頻接收而言,該IP接收來自于GTX的數據,然后將SDI視頻解碼為BT1120視頻輸出,對于SDI視頻發送而言,該IP接收來自于用戶側的的BT1120視頻數據,然后將BT1120視頻編碼為SDI視頻輸出;該方案參考了Xilinx官方的設計;SMPTE SD/HD/3G SDI IP核代碼架構如下:
BT1120轉RGB
BT1120轉RGB模塊的作用是將SMPTE SD/HD/3G SDI IP核解碼輸出的BT1120視頻轉換為RGB888視頻,它由BT1120轉CEA861模塊、YUV422轉YUV444模塊、YUV444轉RGB888三個模塊組成,該方案參考了Xilinx官方的設計;BT1120轉RGB模塊代碼架構如下:
圖像緩存
圖像緩存方案有兩種;一是自研的FDMA圖像緩存架構,二是Xilinx官方的的VDMA圖像緩存架構;緩存介質為PS端DDR3;FDMA圖像緩存架構由FDMA、FDMA控制器、緩存幀選擇器構成;圖像緩存使用Xilinx vivado的Block Design設計,如下圖:
關于FDMA更詳細的介紹,請參考我之前的博客,博文鏈接如下:
點擊直接前往
VDMA圖像緩存架構由VDMA、AXI互聯IP構成;圖像緩存使用Xilinx vivado的Block Design設計,如下圖:
視頻讀取控制
FDMA圖像緩存架構使用VGA時序模塊完成視頻讀取控制,VGA時序模塊負責產生VGA時序,他有兩個作用,一是控制FDMA控制器從DDR3中讀出緩存的視頻,二是將同步后的VGA視頻送入下一級模塊,在HDMI輸出方式下VGA時序模塊的像素時鐘由用戶提供;在SDI輸出方式下VGA時序模塊的像素時鐘由SMPTE SD/HD/3G SDI IP核的發送用戶時鐘提供,在不同的SDI模式下像素時鐘不同,比如在3G-SDI模式下像素時鐘為148.5M,在HD-SDI的720P@60Hz模式下像素時鐘為74.25M;HDMI輸出方式下的VGA時序模塊代碼架構如下:
SDI輸出方式下的VGA時序模塊代碼架構如下:
VDMA圖像緩存架構使用VTC+AXI4-Stream To Video Out架構完成視頻讀取控制,架構如下:
HDMI輸出
在HDMI輸出方式下,使用HDMI輸出模塊將RGB視頻編碼為HDMI差分信號,HDMI輸出模塊采用verilog代碼手寫,可以用于FPGA的HDMI發送應用,代碼如下:
關于這個模塊,請參考我之前的博客,博客地址:點擊直接前往
RGB轉BT1120
在SDI輸出方式下需要使用該模塊;RGB轉BT1200模塊的作用是將用戶側的RGB視頻轉換為BT1200視頻輸出給SMPTE SD/HD/3G SDI IP核;RGB轉BT1120模塊由RGB888轉YUV444模塊、YUV444轉YUV422模塊、SDI視頻編碼模塊、數據嵌入模塊組成,該方案參考了Xilinx官方的設計;BT1120轉RGB模塊代碼架構如下:
Gv8500 驅動器
Gv8500芯片實現差分轉單端和增強驅動的功能,這里選用Gv8500是因為借鑒了了Xilinx官方的方案,當然也可以用其他型號器件。Gv8500驅動器原理圖如下:
SDI轉HDMI盒子
在SDI輸出方式下需要使用到SDI轉HDMI盒子,因為我手里的顯示器沒有SDI接口,只有HDMI接口,為了顯示SDI視頻,只能這么做,當然,如果你的顯示器有SDI接口,則可直接連接顯示,我的SDI轉HDMI盒子在某寶購買,不到100塊;
工程源碼架構
本博客提供5套工程源碼,以工程源碼2為例,vivado Block Design設計如下,其他工程與之類似,Block Design設計為圖像緩存架構的部分:
以工程源碼2為例,使工程源碼架構如下,其他工程與之類似:
FDMA圖像緩存架構雖然不需要SDK配置,但FDMA的AXI4接口時鐘由Zynq提供,所以需要運行SDK程序才能啟動Zynq,從而為PL端邏輯提供時鐘;由于不需要SDK配置,所以SDK軟件代碼就變得極度簡單,只需運行一個“Hello World”即可,如下:
VDMA圖像緩存架構則需要SDK配置,代碼架構如下:
4、工程源碼1詳解–>3G-SDI轉HDMI,無緩存輸出方案
開發板FPGA型號:Xilinx-Zynq7100–xc7z100ffg900-2;
開發環境:Vivado2019.1;
輸入:3G-SDI相機或HDMI轉SDI盒子,分辨率1920x1080@60Hz;
輸出:HDMI ,分辨率1920x1080@60Hz;
緩存方案:無緩存;
緩存介質:無緩存;
工程作用:此工程目的是讓讀者掌握Zynq系列FPGA實現SDI轉HDMI的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第3章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
5、工程源碼2詳解–>3G-SDI轉HDMI,FDMA緩存輸出方案
開發板FPGA型號:Xilinx-Zynq7100–xc7z100ffg900-2;
開發環境:Vivado2019.1;
輸入:3G-SDI相機或HDMI轉SDI盒子,分辨率1920x1080@60Hz;
輸出:HDMI ,分辨率1920x1080@60Hz;
緩存方案:自研FDMA方案;
緩存介質:PS端DDR3;
工程作用:此工程目的是讓讀者掌握Zynq系列FPGA實現SDI轉HDMI的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第3章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
6、工程源碼3詳解–>3G-SDI轉3G-SDI,FDMA緩存輸出方案
開發板FPGA型號:Xilinx-Zynq7100–xc7z100ffg900-2;
開發環境:Vivado2019.1;
輸入:3G-SDI相機或HDMI轉SDI盒子,分辨率1920x1080@60Hz;
輸出:3G-SDI,分辨率1920x1080@60Hz;
緩存方案:自研FDMA方案;
緩存介質:PS端DDR3;
工程作用:此工程目的是讓讀者掌握Zynq系列FPGA實現SDI轉HDMI的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第3章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
7、工程源碼4詳解–>3G-SDI轉HDMI,VDMA緩存輸出方案
開發板FPGA型號:Xilinx-Zynq7100–xc7z100ffg900-2;
開發環境:Vivado2019.1;
輸入:3G-SDI相機或HDMI轉SDI盒子,分辨率1920x1080@60Hz;
輸出:HDMI ,分辨率1920x1080@60Hz;
緩存方案:自研VDMA方案;
緩存介質:PS端DDR3;
工程作用:此工程目的是讓讀者掌握Zynq系列FPGA實現SDI轉HDMI的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第3章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
8、工程源碼5詳解–>3G-SDI轉3G-SDI,VDMA緩存輸出方案
開發板FPGA型號:Xilinx-Zynq7100–xc7z100ffg900-2;
開發環境:Vivado2019.1;
輸入:3G-SDI相機或HDMI轉SDI盒子,分辨率1920x1080@60Hz;
輸出:3G-SDI,分辨率1920x1080@60Hz;
緩存方案:自研VDMA方案;
緩存介質:PS端DDR3;
工程作用:此工程目的是讓讀者掌握Zynq系列FPGA實現SDI轉HDMI的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第3章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
9、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點擊文件–>另存為;但此方法并不保險,最保險的方法是將你的vivado版本升級到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會發現IP都被鎖住了,如下:
此時需要升級IP,操作如下:
FPGA型號不一致處理
如果你的FPGA型號與我的不一致,則需要更改FPGA型號,操作如下:
更改FPGA型號后還需要升級IP,升級IP的方法前面已經講述了;
其他注意事項
1:由于每個板子的DDR不一定完全一樣,所以MIG IP需要根據你自己的原理圖進行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
10、上板調試驗證
準備工作
需要準備的器材如下:
FPGA開發板;
SDI攝像頭或HDMI轉SDI盒子;
SDI轉HDMI盒子;
HDMI顯示器;
我的開發板了連接如下:
輸出視頻演示
以工程2,3G-SDI輸入HDMI輸出為例,輸出如下:
3G-SDI輸入HDMI輸出
11、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發送,以某度網盤鏈接方式發送,
資料獲取方式:私,或者文章末尾的V名片。
網盤資料如下:
此外,有很多朋友給本博主提了很多意見和建議,希望能豐富服務內容和選項,因為不同朋友的需求不一樣,所以本博主還提供以下服務: