目錄
- 1、前言
- 工程概述
- 免責聲明
- 2、相關方案推薦
- 我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目
- 本博已有的 SDI 編解碼方案
- FPGA實現LVDS視頻收發方案
- 3、工程詳細設計方案
- 工程設計原理框圖
- SDI 輸入設備
- Gv8601a 均衡器
- GTX 解串
- SMPTE SD/HD/3G SDI IP核
- BT1120轉RGB
- 奇偶場分離
- LVDS通道排序
- LVDS并串轉換
- LVDS顯示屏
- 工程源碼架構
- 4、Vivado工程詳解1詳解:Kintex7-325T,SDI轉LVDS版本
- 5、Vivado工程詳解2詳解:Zynq7100,SDI轉LVDS版本
- 6、工程移植說明
- vivado版本不一致處理
- FPGA型號不一致處理
- 其他注意事項
- 7、上板調試驗證
- 準備工作
- FPGA實現SDI轉LVDS視頻發送效果演示
- 8、工程代碼獲取
FPGA實現SDI轉LVDS視頻發送,基于GTX+OSERDES2原語架構,提供2套工程源碼和技術支持
FPGA實現SDI轉LVDS
1、前言
FPGA實現SDI視頻編解碼現狀:
目前FPGA實現SDI視頻編解碼有兩種方案:一是使用專用編解碼芯片,比如典型的接收器GS2971,發送器GS2972,優點是簡單,比如GS2971接收器直接將SDI解碼為并行的YCrCb422,GS2972發送器直接將并行的YCrCb422編碼為SDI視頻,缺點是成本較高,可以百度一下GS2971和GS2972的價格;另一種方案是使用FPGA邏輯資源部實現SDI編解碼,比如Xilinx系列FPGA的GTP/GTX資源實現解串,利用Xilinx系列FPGA的SMPTE SDI資源實現SDI編解碼,或者紫光同創系列FPGA的HSSTHP高速接口資源實現解串;優點是合理利用了FPGA資源,高速接口資源不用白不用,缺點是操作難度大一些,對FPGA開發者的技術水平要求較高。有意思的是,這兩種方案在本博這里都有對應的解決方案,包括硬件的FPGA開發板、工程源碼等等。本設計采用Xilinx 7系列FPGA的GTX高速接口資源實現SDI視頻解串和解碼;
FPGA實現LVDS視頻發送現狀:
FPGA實現LVDS視頻發送目前有兩種方案:
一是使用專用編芯片解碼,比如TI的DS90C189,優點是簡單快捷,缺點是需要額外的芯片,導致PCB布線難度加大,系統成本上升;另一種方案是使用FPGA邏輯資源實現LVDS并串轉換,其中7系列FPGA使用OSERDESE2+OBUFDS原語實現并串轉換,UltraScale系列FPGA使用OSERDESE3+OBUFDS原語實現并串轉換,優點是充分利用了FPGA資源,系統設計簡單,成本更低,缺點是實現難度大,對FPGA工程師水平要求較高;本設計使用7系列FPGA的OSERDESE2+OBUFDS原語實現并串轉換;
工程概述
本文詳細描述了FPGA實現SDI轉LVDS視頻發送的設計方案;輸入源為一個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視頻,針對目前市面上的主流項目需求,本博設計了LVDS輸出方式;然后送入BT1120視頻純verilog代碼實現的BT1120轉RGB模塊進行視頻格式轉換并輸出RGB888視頻;然后雙通道模式下的RGB視頻進入純verilog代碼實現的奇偶場分離模塊,實現一幀視頻的奇偶場分離;然后奇偶場視頻進入純verilog代碼實現的LVDS通道排序模塊,根據LVDS顯示屏的時序要求,將RGB視頻像素分配到8條數據通道中去;多通道視頻在進入純verilog代碼實現的RGB轉LVDS模塊,使用Xilinx 7系列FPGA的OSERDESE2+OBUFDS原語實現并串轉換;最后LVDS視頻送入LVDS顯示屏顯示即可;針對市場主流需求,本博客提供2套工程源碼,具體如下:
現對上述紅框中的2套工程源碼做如下解釋,方便讀者理解:
工程源碼1
開發板FPGA型號為Xilinx–>Kintex7–325T–xc7k325tffg676-2;輸入源為一個3G-SDI相機或者HDMI轉3G-SDI盒子,也可以使用HD-SDI或者SD-SDI相機,因為本設計是三種SDI視頻自適應的,SDI輸入分辨率為1920x1080@60Hz;同軸的SDI視頻通過同軸線連接到FPGA開發板的BNC座子,然后同軸視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ的功能;然后差分SDI視頻信號進入FPGA內部的GTX高速資源,實現數據高速串行到并行的轉換,本博稱之為解串;解串后的并行視頻再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,進行SDI視頻解碼操作并輸出BT1120視頻,至此,SDI視頻解碼操作已經完成,可以進行常規的圖像處理操作了;本設計的目的是輸出解碼的SDI視頻,針對目前市面上的主流項目需求,本博設計了LVDS輸出方式;然后送入BT1120視頻純verilog代碼實現的BT1120轉RGB模塊進行視頻格式轉換并輸出RGB888視頻;然后雙通道模式下的RGB視頻進入純verilog代碼實現的奇偶場分離模塊,實現一幀視頻的奇偶場分離;然后奇偶場視頻進入純verilog代碼實現的LVDS通道排序模塊,根據LVDS顯示屏的時序要求,將RGB視頻像素分配到8條數據通道中去;多通道視頻在進入純verilog代碼實現的RGB轉LVDS模塊,使用Xilinx 7系列FPGA的OSERDESE2+OBUFDS原語實現并串轉換,LVDS視頻輸出分辨率為1920x1080@60Hz;最后LVDS視頻送入LVDS顯示屏顯示即可;工程適用于SDI轉LVDS應用;
工程源碼2
開發板FPGA型號為Xilinx–>Zynq7100–xc7z100ffg900-2;輸入源為一個3G-SDI相機或者HDMI轉3G-SDI盒子,也可以使用HD-SDI或者SD-SDI相機,因為本設計是三種SDI視頻自適應的,SDI輸入分辨率為1920x1080@60Hz;同軸的SDI視頻通過同軸線連接到FPGA開發板的BNC座子,然后同軸視頻經過板載的Gv8601a芯片實現單端轉差分和均衡EQ的功能;然后差分SDI視頻信號進入FPGA內部的GTX高速資源,實現數據高速串行到并行的轉換,本博稱之為解串;解串后的并行視頻再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,進行SDI視頻解碼操作并輸出BT1120視頻,至此,SDI視頻解碼操作已經完成,可以進行常規的圖像處理操作了;本設計的目的是輸出解碼的SDI視頻,針對目前市面上的主流項目需求,本博設計了LVDS輸出方式;然后送入BT1120視頻純verilog代碼實現的BT1120轉RGB模塊進行視頻格式轉換并輸出RGB888視頻;然后雙通道模式下的RGB視頻進入純verilog代碼實現的奇偶場分離模塊,實現一幀視頻的奇偶場分離;然后奇偶場視頻進入純verilog代碼實現的LVDS通道排序模塊,根據LVDS顯示屏的時序要求,將RGB視頻像素分配到8條數據通道中去;多通道視頻在進入純verilog代碼實現的RGB轉LVDS模塊,使用Xilinx 7系列FPGA的OSERDESE2+OBUFDS原語實現并串轉換,LVDS視頻輸出分辨率為1920x1080@60Hz;最后LVDS視頻送入LVDS顯示屏顯示即可;工程適用于SDI轉LVDS應用;
本文詳細描述了FPGA實現SDI轉LVDS視頻發送的設計方案,工程代碼可綜合編譯上板調試,可直接項目移植,適用于在校學生、研究生項目開發,也適用于在職工程師做項目開發,可應用于醫療、軍工等行業的高速接口領域;
提供完整的、跑通的工程源碼和技術支持;
工程源碼和技術支持的獲取方式放在了文章末尾,請耐心看到最后;
免責聲明
本工程及其源碼即有自己寫的一部分,也有網絡公開渠道獲取的一部分(包括CSDN、Xilinx官網、Altera官網等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個人學習和研究,禁止用于商業用途,若由于讀者或粉絲自身原因用于商業用途所導致的法律問題,與本博客及博主無關,請謹慎使用。。。
2、相關方案推薦
我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目
其實一直有朋友反饋,說我的博客文章太多了,亂花漸欲迷人,自己看得一頭霧水,不方便快速定位找到自己想要的項目,所以本博文置頂,列出我目前已有的所有項目,并給出總目錄,每個項目的文章鏈接,當然,本博文實時更新。。。以下是博客地址:
點擊直接前往
本博已有的 SDI 編解碼方案
我的博客主頁開設有SDI視頻專欄,里面全是FPGA編解碼SDI的工程源碼及博客介紹;既有基于GS2971/GS2972的SDI編解碼,也有基于GTP/GTX資源的SDI編解碼;既有HD-SDI、3G-SDI,也有6G-SDI、12G-SDI等;專欄地址鏈接如下:
點擊直接前往
FPGA實現LVDS視頻收發方案
我的FPGA-LVDS專欄有很多FPGA的LVDS視頻編解碼方案,專欄鏈接如下:歡迎前往查看:
點擊直接前往
3、工程詳細設計方案
工程設計原理框圖
工程設計原理框圖如下:
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模塊代碼架構如下:
奇偶場分離
奇偶場分離模塊在雙通道LVDS工程中才有,雙通道LVDS將RGB視頻分為奇偶場發送,奇偶場是模擬視頻中的概念,對于入門較晚的兄弟而言比較陌生,這塊可以在CSDN或知乎等平臺搜索學習一下;奇偶場分離模塊就是將1920*1080@60Hz的視頻分為奇場和偶場偶;奇偶場分離模塊碼架構如此下:
奇偶場分離頂層接口如下:
LVDS通道排序
然后奇偶場視頻進入純verilog代碼實現的LVDS通道排序模塊,根據LVDS顯示屏的時序要求,將RGB視頻像素分配到8條數據通道中去;不同的LVDS屏幕可能有不同的通道排序,以我手里的LVDS屏幕為例,根據屏幕手冊,LVDS通道排序要求如下:
此外,為了適應8bit和10bit模式,我們在LVDS通道排序模塊中做了適配,LVDS通道排序頂層接口如下:
本設計使用8bit模式,LVDS通道排序模塊碼架構如此下:
LVDS并串轉換
多通道視頻在進入純verilog代碼實現的RGB轉LVDS模塊,使用Xilinx 7系列FPGA的OSERDESE2+OBUFDS原語實現并串轉換,OSERDESE2原語實現RGB并行數據轉換串行數據,OBUFDS原語實現單端串行數據轉換差分串行數據;采用7bit,SDR模式;LVDS并串轉換模塊碼架構如此下:
LVDS并串轉換頂層接口如下:
!!!注意
!!!注意
單通道LVDS視頻輸出模式下,LVDS由4條數據通道+1條隨路時鐘通道組成;
雙通道LVDS視頻輸出模式下,LVDS由8條數據通道+2條隨路時鐘通道組成;
LVDS顯示屏
LVDS顯示屏由本博主提供,目前有兩款,一款為單通道LVDS模式,最高分辨率支持1204x600@60Hz;另一款為雙通道LVDS模式,最高分辨率支持1920x1080@60Hz,LVDS顯示屏為8bit SDR模式;
工程源碼架構
提供2套工程源碼,以工程源碼1為例,綜合后的工程源碼架構如下:
本博主發布的工程均已編譯完成,且時序收斂,無時序違約,如下:
4、Vivado工程詳解1詳解:Kintex7-325T,SDI轉LVDS版本
開發板FPGA型號:Xilinx–>Kintex7–325T–xc7k325tffg676-2;
FPGA開發環境:Vivado2019.1;
輸入:3G-SDI相機或HDMI轉SDI盒子,分辨率1920x1080@60Hz;
輸出:LVDS,RTL邏輯編碼,分辨率為1920x1080@60Hz;
SDI視頻解串方案:Xilinx–GTX高速接口解串;
SDI視頻解碼方案:Xilinx–SMPTE SD/HD/3G SDI解碼;
LVDS視頻編碼方案:Xilinx官方OSERDES2+OBUFDS原語方案;
LVDS差分對:8對差分數據+2對隨路差分時鐘;
實現功能:FPGA實現SDI轉LVDS視頻發送;
工程作用:此工程目的是讓讀者掌握FPGA實現SDI轉LVDS視頻發送的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第3章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
5、Vivado工程詳解2詳解:Zynq7100,SDI轉LVDS版本
開發板FPGA型號:Xilinx–>Zynq7100–xc7z100ffg900-2;
FPGA開發環境:Vivado2019.1;
輸入:3G-SDI相機或HDMI轉SDI盒子,分辨率1920x1080@60Hz;
輸出:LVDS,RTL邏輯編碼,分辨率為1920x1080@60Hz;
SDI視頻解串方案:Xilinx–GTX高速接口解串;
SDI視頻解碼方案:Xilinx–SMPTE SD/HD/3G SDI解碼;
LVDS視頻編碼方案:Xilinx官方OSERDES2+OBUFDS原語方案;
LVDS差分對:8對差分數據+2對隨路差分時鐘;
實現功能:FPGA實現SDI轉LVDS視頻發送;
工程作用:此工程目的是讓讀者掌握FPGA實現SDI轉LVDS視頻發送的設計能力,以便能夠移植和設計自己的項目;
工程Block Design和工程代碼架構請參考第3章節的《工程源碼架構》小節內容;
工程的資源消耗和功耗如下:
6、工程移植說明
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軟核;
7、上板調試驗證
準備工作
需要準備的器材如下:
SDI相機,可以找本博主提供;
BNC線纜, 可以找本博主提供;
FPGA開發板,可以找本博主提供;
LVDS顯示屏,可以找本博主提供;
我的板子連接如下:
FPGA實現SDI轉LVDS視頻發送效果演示
FPGA實現SDI轉LVDS視頻發送效果演示如下:
FPGA實現SDI轉LVDS
8、工程代碼獲取
工程代碼如下: