FPGA高端項目:FPGA基于GS2971+GS2972架構(gòu)的SDI視頻收發(fā)+GTX 8b/10b編解碼SFP光口傳輸,提供2套工程源碼和技術(shù)支持
1、前言
目前FPGA實現(xiàn)SDI視頻編解碼有兩種方案:一是使用專用編解碼芯片,比如典型的接收器GS2971,發(fā)送器GS2972,優(yōu)點是簡單,比如GS2971接收器直接將SDI解碼為并行的YCrCb422,GS2972發(fā)送器直接將并行的YCrCb422編碼為SDI視頻,缺點是成本較高,可以百度一下GS2971和GS2972的價格;另一種方案是使用FPGA邏輯資源部實現(xiàn)SDI編解碼,利用Xilinx系列FPGA的GTP/GTX資源實現(xiàn)解串,利用Xilinx系列FPGA的SMPTE SDI資源實現(xiàn)SDI編解碼,優(yōu)點是合理利用了FPGA資源,GTP/GTX資源不用白不用,缺點是操作難度大一些,對FPGA開發(fā)者的技術(shù)水平要求較高。有意思的是,這兩種方案在本博這里都有對應(yīng)的解決方案,包括硬件的FPGA開發(fā)板、工程源碼等等。
本設(shè)計基于Xilinx的Zynq7100-xc7z100ffg900-2中端FPGA開發(fā)板使用GS2971實現(xiàn)SDI視頻接收轉(zhuǎn)HDMI輸出,視頻源有兩種,分別對應(yīng)開發(fā)者手里有沒有SDI相機的情況,一種是使用HD-SDI相機,也可以使用SD-SDI或者3G-SDI相機,因為本設(shè)計是三種SDI視頻自適應(yīng)的;如果你的手里沒有SDI相機或者沒有SDI相機輸入接口,則可使用FPGA內(nèi)部生成的動態(tài)彩條模擬SDI相機視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行選擇,默認(rèn)使用SDI相機作為視頻源;同軸的SDI視頻通過同軸線連接到GS2971轉(zhuǎn)接板,GS2971解碼芯片將同軸的串行的SDI視頻解碼為并行的BT1120格式視頻,至此,SDI視頻解碼操作已經(jīng)完成,可以進(jìn)行常規(guī)的圖像處理操作了;本設(shè)計的目的是做GTX 8b/10b編解碼SFP光口傳輸,針對目前市面上的主流項目需求,本博設(shè)計了HDMI輸出方式,需要進(jìn)行BT1120視頻轉(zhuǎn)RGB+數(shù)據(jù)組包+GTX 8b/10b編解碼+數(shù)據(jù)對齊+數(shù)據(jù)解包+圖像緩存操作;本設(shè)計使用BT1120轉(zhuǎn)RGB模塊實現(xiàn)視頻格式轉(zhuǎn)換;使用純verilog代碼實現(xiàn)視頻數(shù)據(jù)組包,即加上具有鏈路訓(xùn)練和自定義協(xié)議的數(shù)據(jù)包頭和包尾;調(diào)用Xilinx官方特有的GTX實現(xiàn)8b/10b編解碼,GTX線速率配置為5G;使用板載的SFP光口實現(xiàn)高速串行數(shù)據(jù)回環(huán);使用純verilog代碼實現(xiàn)GTX解密數(shù)據(jù)的數(shù)據(jù)對齊;使用純verilog代碼實現(xiàn)視頻數(shù)據(jù)解包,即解析并丟棄具有鏈路訓(xùn)練和自定義協(xié)議的數(shù)據(jù)包頭和包尾,然后恢復(fù)出發(fā)送視頻的場同步信號、數(shù)據(jù)有效信號和有效數(shù)據(jù);使用本博常用的FDMA架構(gòu)實現(xiàn)圖像三幀緩存,緩存介質(zhì)包括PL端DDR3和PS端DDR3;圖像從DDR3讀出后,進(jìn)入HDMI發(fā)送模塊輸出HDMI顯示器;本博客提供2套工程源碼,具體如下,請點擊圖片放大查看:
現(xiàn)對上述2套工程源碼做如下解釋,方便讀者理解:
工程源碼21:
輸入視頻為HD-SDI相機或者動態(tài)彩條,輸入分辨率為1920x1080@30Hz,經(jīng)過GS2971解碼+BT1120視頻轉(zhuǎn)RGB+數(shù)據(jù)組包+GTX 8b/10b編解碼(SFP光口回環(huán))+數(shù)據(jù)對齊+數(shù)據(jù)解包+FDMA圖像緩存+GS2972編碼后,以3G-SDI接口方式輸出,輸出分辨率為1920x1080@60Hz;此工程的FDMA圖像緩存架構(gòu)將視頻緩存到PL端DDR3,適應(yīng)于純FPGA項目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA;
工程源碼22:
輸入視頻為HD-SDI相機或者動態(tài)彩條,輸入分辨率為1920x1080@30Hz,經(jīng)過GS2971解碼+BT1120視頻轉(zhuǎn)RGB+數(shù)據(jù)組包+GTX 8b/10b編解碼(SFP光口回環(huán))+數(shù)據(jù)對齊+數(shù)據(jù)解包+FDMA圖像緩存+GS2972編碼后,以3G-SDI接口方式輸出,輸出分辨率為1920x1080@60Hz;此工程的VDMA圖像緩存架構(gòu)將視頻緩存到PS端DDR3,即可用于純FPGA項目,比如可用于Xilinx的Artix7、Kintex7、Virtex7等FPGA,配合MicroBlaze;也可用于Zynq系列FPGA項目,比如可用于Xilinx的Zynq7000系列、Zynq7000、Zynq UltraScale等FPGA;
本文詳細(xì)描述了Xilinx的Zynq7100-xc7z100ffg900-2中端FPGA基于GS2971+GS2972架構(gòu)的SDI視頻收發(fā)+GTX 8b/10b編解碼SFP光口傳輸,工程代碼編譯通過后上板調(diào)試驗證,可直接項目移植,適用于在校學(xué)生做畢業(yè)設(shè)計、研究生項目開發(fā),也適用于在職工程師做項目開發(fā),可應(yīng)用于醫(yī)療、軍工等行業(yè)的數(shù)字成像和圖像傳輸領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請耐心看到最后;
免責(zé)聲明
本工程及其源碼即有自己寫的一部分,也有網(wǎng)絡(luò)公開渠道獲取的一部分(包括CSDN、Xilinx官網(wǎng)、Altera官網(wǎng)等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個人學(xué)習(xí)和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導(dǎo)致的法律問題,與本博客及博主無關(guān),請謹(jǐn)慎使用。。。
2、相關(guān)方案推薦
本博主所有FPGA工程項目–>匯總目錄
其實一直有朋友反饋,說我的博客文章太多了,亂花漸欲迷人,自己看得一頭霧水,不方便快速定位找到自己想要的項目,所以寫了一篇匯總目錄的博文并置頂,列出我目前已有的所有項目,并給出總目錄,每個項目的文章鏈接,當(dāng)然,本博文實時更新。。。博客鏈接如下:
點擊直接前往
本博已有的 SDI 編解碼方案
我的博客主頁開設(shè)有SDI視頻專欄,里面全是FPGA編解碼SDI的工程源碼及博客介紹;既有基于GS2971/GS2972的SDI編解碼,也有基于GTP/GTX資源的SDI編解碼;既有HD-SDI、3G-SDI,也有6G-SDI、12G-SDI等;專欄地址鏈接:
點擊直接前往
本方案的SDI接收+發(fā)送
本方案采用GS2971接收SDI視頻,然后進(jìn)行圖像緩存操作(圖像緩存方案包括FDMA方案和VDMA方案,緩存介質(zhì)包括PL端DDR3、PS端DDR3),最后用GS2971發(fā)送SDI視頻,最終以3G-SDI輸出;提供3套工程源碼,3套工程源碼詳情請參考“1、前言”中的截圖,上述所有工程源碼均已上板調(diào)試通過,詳細(xì)設(shè)計方案請參考我專門的博客,博客鏈接如下:
點擊直接前往
本方案的SDI接收+圖像縮放應(yīng)用
本方案采用GS2971接收SDI視頻,然后進(jìn)行圖像縮放操作(圖像縮放方案包括純verilog圖像縮放方案和HLS圖像縮放方案),再進(jìn)行圖像緩存操作(圖像緩存方案包括FDMA方案和VDMA方案,緩存介質(zhì)包括PL端DDR3、PS端DDR3),最后用GS2971發(fā)送SDI視頻,最終以3G-SDI輸出;提供3套工程源碼,3套工程源碼詳情請參考“1、前言”中的截圖,上述所有工程源碼均已上板調(diào)試通過,詳細(xì)設(shè)計方案請參考我專門的博客,博客鏈接如下:
點擊直接前往
本方案的SDI接收+純verilog圖像縮放+純verilog多路視頻拼接應(yīng)用
本方案采用GS2971接收SDI視頻,然后進(jìn)行圖像縮放操作(圖像縮放方案為純verilog圖像縮放),再進(jìn)行多路視頻拼接(包括2路、4路、8路、16路視頻拼接,拼接方案為純verilogFDMA方案,視頻拼接和圖像緩存為一個整體,緩存介質(zhì)包括PL端DDR3、PS端DDR3),最后用GS2972編碼器發(fā)送SDI視頻,最終以3G-SDI輸出;提供8套工程源碼,8套工程源碼詳情請參考“1、前言”中的截圖,上述所有工程源碼均已上板調(diào)試通過,詳細(xì)設(shè)計方案請參考我專門的博客,博客鏈接如下:
點擊直接前往
本方案的SDI接收+HLS圖像縮放+HLS多路視頻拼接應(yīng)用
本方案采用GS2971接收SDI視頻,然后進(jìn)行圖像縮放操作(圖像縮放方案為HLS圖像縮放),再進(jìn)行多路視頻拼接(拼接方案為Xilinx官方的Video Mixer方案,包括2路、4路、8路、16路視頻拼接),再進(jìn)行圖像緩存操作(圖像緩存方案為VDMA方案,緩存介質(zhì)包括PS端DDR3),最后用GS2972編碼器發(fā)送SDI視頻,最終以3G-SDI輸出;提供4套工程源碼,4套工程源碼詳情請參考“1、前言”中的截圖,上述所有工程源碼均已上板調(diào)試通過,詳細(xì)設(shè)計方案請參考我專門的博客,博客鏈接如下:
點擊直接前往
本方案的SDI接收+OSD動態(tài)字符疊加輸出應(yīng)用
本方案采用GS2971接收SDI視頻,然后進(jìn)行動態(tài)字符疊加(方案為HLS動態(tài)字符疊加),再進(jìn)行圖像緩存操作(圖像緩存方案為VDMA方案,緩存介質(zhì)包括PS端DDR3),最后用GS2972編碼器發(fā)送SDI視頻,最終以3G-SDI輸出;提供1套工程源碼,工程源碼詳情請參考“1、前言”中的截圖,上述所有工程源碼均已上板調(diào)試通過,詳細(xì)設(shè)計方案請參考我專門的博客,博客鏈接如下:
點擊直接前往
本方案的SDI接收+HLS多路視頻融合疊加應(yīng)用
本方案采用GS2971接收SDI視頻,然后進(jìn)行多路視頻融合疊加(方案為HLS多路視頻融合疊加),再進(jìn)行圖像緩存操作(圖像緩存方案為VDMA方案,緩存介質(zhì)包括PS端DDR3),最后用GS2972編碼器發(fā)送SDI視頻,最終以3G-SDI輸出;提供1套工程源碼,工程源碼詳情請參考“1、前言”中的截圖,上述所有工程源碼均已上板調(diào)試通過,詳細(xì)設(shè)計方案請參考我專門的博客,博客鏈接如下:
點擊直接前往
FPGA的SDI視頻編解碼項目培訓(xùn)
基于目前市面上FPGA的SDI視頻編解碼項目培訓(xùn)較少的特點,本博專門開設(shè)了FPGA的SDI視頻編解碼高級項目培訓(xùn)班,專門培訓(xùn)SDI視頻的編解碼,具體培訓(xùn)計劃細(xì)節(jié)如下:
1、我發(fā)你上述全套工程源碼和對應(yīng)的工程設(shè)計文檔網(wǎng)盤鏈接,你保存下載,作為培訓(xùn)的核心資料;
2、你根據(jù)自己的實際情況安裝好對應(yīng)的開發(fā)環(huán)境,然后對著設(shè)計文檔進(jìn)行淺層次的學(xué)習(xí);
3、遇到不懂的隨時問我,包括代碼、職業(yè)規(guī)劃、就業(yè)咨詢、人生規(guī)劃、戰(zhàn)略規(guī)劃等等;
4、每周末進(jìn)行一次騰訊會議,我會檢查你的學(xué)習(xí)情況和面對面溝通交流;
5、你可以移植代碼到你自己的FPGA開發(fā)板上跑,如果你沒有板子,你根據(jù)你自己的需求修改代碼后,編譯工程,把bit發(fā)我,我?guī)湍阆螺d到我的板子上驗證;或者你可以買我的開發(fā)板;
3、詳細(xì)設(shè)計方案
設(shè)計原理框圖
兩套工程源碼的設(shè)計原理框圖如下:
視頻源選擇
視頻源有兩種,分別對應(yīng)開發(fā)者手里有沒有SDI相機的情況,一種是使用HD-SDI相機,也可以使用SD-SDI或者3G-SDI相機,因為本設(shè)計是三種SDI視頻自適應(yīng)的;如果你的手里沒有SDI相機或者沒有SDI相機輸入接口,則可使用FPGA內(nèi)部生成的動態(tài)彩條模擬SDI相機視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行選擇,默認(rèn)使用SDI相機作為視頻源;如下:
選擇邏輯代碼部分如下:
選擇邏輯如下:
當(dāng)(注釋) define COLOR_TEST時,輸入源視頻是SDI相機;
當(dāng)(不注釋) define COLOR_TEST時,輸入源視頻是動態(tài)彩條;
動態(tài)彩條
如果你的手里沒有SDI相機或者沒有SDI相機輸入接口,則可使用FPGA內(nèi)部生成的動態(tài)彩條模擬SDI相機視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行,動態(tài)彩條可配置為不同分辨率的視頻,視頻的邊框?qū)挾?,動態(tài)移動方塊的大小,移動速度等都可以參數(shù)化配置,我這里配置為辨率1920x1080,動態(tài)彩條模塊代碼位置和頂層接口和例化如下:
動態(tài)彩條模塊的例化請參考工程源碼的頂層代碼;
SDI 相機
我用到的是SDI相機為HD-SDI相機,輸出分辨率為1920x1080@30Hz,本工程對SDI相機的選擇要求范圍很寬,可以是SD-SDI、HD-SDI、3G-SDI,因為很設(shè)計對這三種SDI視頻是自動識別并自適應(yīng)的;如果你的手里沒有SDI相機,也可以去某寶買HDMI轉(zhuǎn)SDI盒子,一百多塊錢就可以搞定,使用筆記本電腦模擬視頻源,用HDMI線連接HDMI轉(zhuǎn)SDI盒子,輸出SDI視頻做事視頻源,可以模擬SDI相機;
GS2971+GS2972架構(gòu)
本設(shè)計采用GS2971解碼芯片接收SDI+GS2972芯片編碼發(fā)送SDI,GS2971和GS2972不需要軟件配置,硬件電阻上下拉即可完成配置,本設(shè)計配置為輸出/輸入BT1120格式視頻,當(dāng)然,你在設(shè)計電路時也可以配置為輸出CEA861格式視頻;GS2971+GS2972硬件架構(gòu)如下,提供PDF格式原理圖:
BT1120轉(zhuǎn)RGB
BT1120轉(zhuǎn)RGB模塊的作用是將SMPTE SD/HD/3G SDI IP核解碼輸出的BT1120視頻轉(zhuǎn)換為RGB888視頻,它由BT1120轉(zhuǎn)CEA861模塊、YUV422轉(zhuǎn)YUV444模塊、YUV444轉(zhuǎn)RGB888三個模塊組成,該方案參考了Xilinx官方的設(shè)計;BT1120轉(zhuǎn)RGB模塊代碼架構(gòu)如下:
視頻數(shù)據(jù)組包
由于視頻需要在GTX中通過aurora 8b/10b協(xié)議收發(fā),所以數(shù)據(jù)必須進(jìn)行組包,以適應(yīng)aurora 8b/10b協(xié)議標(biāo)準(zhǔn);視頻數(shù)據(jù)組包模塊代碼位置如下:
首先,我們將16bit的視頻存入FIFO中,存滿一行時就從FIFO讀出送入GTX發(fā)送;在此之前,需要對一幀視頻進(jìn)行編號,也叫作指令,GTX組包時根據(jù)固定的指令進(jìn)行數(shù)據(jù)發(fā)送,GTX解包時根據(jù)固定的指令恢復(fù)視頻的場同步信號和視頻有效信號;當(dāng)一幀視頻的場同步信號上升沿到來時,發(fā)送一幀視頻開始指令 0,當(dāng)一幀視頻的場同步信號下降沿到來時,發(fā)送一幀視頻開始指令 1,視頻消隱期間發(fā)送無效數(shù)據(jù) 0 和無效數(shù)據(jù) 1,當(dāng)視頻有效信號到來時將每一行視頻進(jìn)行編號,先發(fā)送一行視頻開始指令,在發(fā)送當(dāng)前的視頻行號,當(dāng)一行視頻發(fā)送完成后再發(fā)送一行視頻結(jié)束指令,一幀視頻發(fā)送完成后,先發(fā)送一幀視頻結(jié)束指令 0,再發(fā)送一幀視頻結(jié)束指令 1;至此,一幀視頻則發(fā)送完成,這個模塊不太好理解,所以我在代碼里進(jìn)行了詳細(xì)的中文注釋,需要注意的是,為了防止中文注釋的亂序顯示,請用notepad++編輯器打開代碼;指令定義如下:
注意?。?!指令可以任意更改,但最低字節(jié)必須為bc;
GTX aurora 8b/10b 詳解
這個就是調(diào)用GTX做aurora 8b/10b協(xié)議的數(shù)據(jù)編解碼,代碼位置如下:
GTX IP 簡介
關(guān)于GTX介紹最詳細(xì)的肯定是Xilinx官方的《ug476_7Series_Transceivers》,我們以此來解讀:《ug476_7Series_Transceivers》的PDF文檔我已放在了資料包里,文章末尾有獲取方式;我用到的開發(fā)板FPGA型號為Xilinx Zynq7100;帶有8路GTX資源,其中2路連接到了2個SFP光口,每通道的收發(fā)速度為 500 Mb/s 到 10.3125 Gb/s 之間。GTX收發(fā)器支持不同的串行傳輸接口或協(xié)議,比如 PCIE 1.1/2.0 接口、萬兆網(wǎng) XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、數(shù)字分量串行接口(SDI)等等;
GTX 基本結(jié)構(gòu)
Xilinx 以 Quad 來對串行高速收發(fā)器進(jìn)行分組,四個串行高速收發(fā)器和一個 COMMOM(QPLL)組成一個 Quad,每一個串行高速收發(fā)器稱為一個 Channel(通道),下圖為四路 GTX 收發(fā)器在Kintex7 FPGA 芯片中的示意圖:《ug476_7Series_Transceivers》第24頁;
GTX 的具體內(nèi)部邏輯框圖如下所示,它由四個收發(fā)器通道 GTXE2_CHANNEL原語 和一個GTXE2_COMMON 原語組成。每路GTXE2_CHANNEL包含發(fā)送電路 TX 和接收電路 RX,GTXE2_CHANNEL的時鐘可以來自于CPLL或者QPLL,可在IP配置界面里配置;《ug476_7Series_Transceivers》第25頁;
每個 GTXE2_CHANNEL 的邏輯電路如下圖所示:《ug476_7Series_Transceivers》第26頁;
GTXE2_CHANNEL 的發(fā)送端和接收端功能是獨立的,均由 PMA(Physical Media Attachment,物理媒介適配層)和 PCS(Physical Coding Sublayer,物理編碼子層)兩個子層組成。其中 PMA 子層包含高速串并轉(zhuǎn)換(Serdes)、預(yù)/后加重、接收均衡、時鐘發(fā)生器及時鐘恢復(fù)等電路。PCS 子層包含8B/10B 編解碼、緩沖區(qū)、通道綁定和時鐘修正等電路。
這里說多了意義不大,因為沒有做過幾個大的項目是不會理解這里面的東西的,對于初次使用或者想快速使用者而言,更多的精力應(yīng)該關(guān)注IP核的調(diào)用和使用,后面我也會重點將到IP核的調(diào)用和使用;
GTX 發(fā)送和接收處理流程
首先用戶邏輯數(shù)據(jù)經(jīng)過 8B/10B 編碼后,進(jìn)入一個發(fā)送緩存區(qū)(Phase Adjust FIFO),該緩沖區(qū)主要是 PMA 子層和 PCS 子層兩個時鐘域的時鐘隔離,解決兩者時鐘速率匹配和相位差異的問題,最后經(jīng)過高速 Serdes 進(jìn)行并串轉(zhuǎn)換(PISO),有必要的話,可以進(jìn)行預(yù)加重(TX Pre-emphasis)、后加重。值得一提的是,如果在 PCB 設(shè)計時不慎將 TXP 和 TXN 差分引腳交叉連接,則可以通過極性控制(Polarity)來彌補這個設(shè)計錯誤。接收端和發(fā)送端過程相反,相似點較多,這里就不贅述了,需要注意的是 RX 接收端的彈性緩沖區(qū),其具有時鐘糾正和通道綁定功能。這里的每一個功能點都可以寫一篇論文甚至是一本書,所以這里只需要知道個概念即可,在具體的項目中回具體用到,還是那句話:對于初次使用或者想快速使用者而言,更多的精力應(yīng)該關(guān)注IP核的調(diào)用和使用。
GTX 的參考時鐘
GTX 模塊有兩個差分參考時鐘輸入管腳(MGTREFCLK0P/N 和 MGTREFCLK1P/N),作為 GTX 模塊的參考時鐘源,用戶可以自行選擇。一般的A7系列開發(fā)板上,都有一路 148.5Mhz 的 GTX 參考時鐘連接到 MGTREFCLK0上,作為 GTX 的參考時鐘。差分參考時鐘通過IBUFDS 模塊轉(zhuǎn)換成單端時鐘信號進(jìn)入到 GTXE2_COMMOM 的QPLL或CPLL中,產(chǎn)生 TX 和 RX 電路中所需的時鐘頻率。TX 和 RX 收發(fā)器速度相同的話,TX 電路和 RX 電路可以使用同一個 PLL 產(chǎn)生的時鐘,如果 TX 和 RX收發(fā)器速度不相同的話,需要使用不同的 PLL 時鐘產(chǎn)生的時鐘。參考時鐘這里Xilinx給出的GT參考例程已經(jīng)做得很好了,我們調(diào)用時其實不用修改;GTX 的參考時鐘結(jié)構(gòu)圖如下:《ug476_7Series_Transceivers》第31頁;
GTX 發(fā)送接口
《ug476_7Series_Transceivers》的第107到165頁詳細(xì)介紹了發(fā)送處理流程,其中大部分內(nèi)容對于用戶而言可以不去深究,因為手冊講的基本都是他自己的設(shè)計思想,留給用戶可操作的接口并不多,基于此思路,我們重點講講GTX例化時留給用戶的發(fā)送部分需要用到的接口;
用戶只需要關(guān)心發(fā)送接口的時鐘和數(shù)據(jù)即可,GTX例化模塊的這部分接口如下:
在代碼中我已為你們重新綁定并做到了模塊的頂層,代碼部分如下:
GTX 接收接口
《ug476_7Series_Transceivers》的第167到295頁詳細(xì)介紹了接收處理流程,其中大部分內(nèi)容對于用戶而言可以不去深究,因為手冊講的基本都是他自己的設(shè)計思想,留給用戶可操作的接口并不多,基于此思路,我們重點講講GTX例化時留給用戶的發(fā)送部分需要用到的接口;
用戶只需要關(guān)心接收接口的時鐘和數(shù)據(jù)即可,GTX例化模塊的這部分接口如下:
在代碼中我已為你們重新綁定并做到了模塊的頂層,代碼部分如下:
GTX IP核調(diào)用和使用
GTX IP核調(diào)用和使用很簡單,通過vivado的UI界面即可完成,如下:
有別于網(wǎng)上其他博主的教程,我個人喜歡用如下圖的共享邏輯:
這樣選擇的好處有兩個,一是方便DRP變速,二是便于IP核的修改,修改完IP核后直接編譯即可,不再需要打開example工程,再復(fù)制下面的一堆文件放到自己的工程什么的,玩兒個GTX需要那么復(fù)雜么?
這里對上圖的標(biāo)號做解釋:
1:線速率,根據(jù)自己的項目需求來,GTX 的范圍是0.5到10.3125G,由于我的項目是視頻傳輸,所以在GTX 的速率范圍內(nèi)均可,本例程選擇了5G;
2:參考時鐘,這個得根據(jù)你的原理圖來,可以是80M、125M、148.5M、156.25M等等,我的開發(fā)板是125M;
4:GTX 組的綁定,這個很重要,他的綁定參考依據(jù)有兩個,已是你的開發(fā)板原理圖,而是官方的參考資料《ug476_7Series_Transceivers》,官方根據(jù)BANK不同將GTX資源分成了多組,由于GT資源是Xilinx系列FPGA的專用資源,占用專用的Bnak,所以引腳也是專用的,那么這些GTX組和引腳是怎么對應(yīng)的呢?《ug476_7Series_Transceivers》有說明;
我的板子原理圖如下:
選擇外部數(shù)據(jù)位寬32bit的8b/10b編解碼,如下:
下面這里講的是K碼檢測:
這里選擇K28.5,也就是所謂的COM碼,十六進(jìn)制為bc,他的作用很多,可以表示空閑亂序符號,也可以表示數(shù)據(jù)錯位標(biāo)志,這里用來標(biāo)志數(shù)據(jù)錯位,8b/10b協(xié)議對K碼的定義如下:
下面講的是時鐘矯正,也就是對應(yīng)GTX內(nèi)部接收部分的彈性buffer;
這里有一個時鐘頻偏的概念,特別是收發(fā)雙方時鐘不同源時,這里設(shè)置的頻偏為100ppm,規(guī)定每隔5000個數(shù)據(jù)包發(fā)送方發(fā)送一個4字節(jié)的序列,接收方的彈性buffer會根據(jù)這4字節(jié)的序列,以及數(shù)據(jù)在buffer中的位置來決定刪除或者插入一個4字節(jié)的序列中的一個字節(jié),目的是確保數(shù)據(jù)從發(fā)送端到接收端的穩(wěn)定性,消除時鐘頻偏的影響;
數(shù)據(jù)對齊
由于GT資源的aurora 8b/10b數(shù)據(jù)收發(fā)天然有著數(shù)據(jù)錯位的情況,所以需要對接受到的解碼數(shù)據(jù)進(jìn)行數(shù)據(jù)對齊處理,數(shù)據(jù)對齊模塊代碼位置如下:
我定義的 K 碼控制字符格式為:XX_XX_XX_BC,所以用一個rx_ctrl 指示數(shù)據(jù)是否為 K 碼 的 COM 符號;
rx_ctrl = 4’b0000 表示 4 字節(jié)的數(shù)據(jù)沒有 COM 碼;
rx_ctrl = 4’b0001 表示 4 字節(jié)的數(shù)據(jù)中[ 7: 0] 為 COM 碼;
rx_ctrl = 4’b0010 表示 4 字節(jié)的數(shù)據(jù)中[15: 8] 為 COM 碼;
rx_ctrl = 4’b0100 表示 4 字節(jié)的數(shù)據(jù)中[23:16] 為 COM 碼;
rx_ctrl = 4’b1000 表示 4 字節(jié)的數(shù)據(jù)中[31:24] 為 COM 碼;
基于此,當(dāng)接收到有K碼時就對數(shù)據(jù)進(jìn)行對齊處理,也就是將數(shù)據(jù)打一拍,和新進(jìn)來的數(shù)據(jù)進(jìn)行錯位組合,這是FPGA的基礎(chǔ)操作,這里不再贅述;
視頻數(shù)據(jù)解包
數(shù)據(jù)解包是數(shù)據(jù)組包的逆過程,代碼位置如下:
GTX解包時根據(jù)固定的指令恢復(fù)視頻的場同步信號和視頻有效信號;這些信號是作為后面圖像緩存的重要信號;
至此,數(shù)據(jù)進(jìn)出GTX部分就已經(jīng)講完了,整個過程的框圖我在代碼中描述了,如下:
圖像緩存
使用本博常用的FDMA圖像緩存架構(gòu)實現(xiàn)圖像3幀緩存,緩存介質(zhì)為板載的DDR3;FDMA圖像緩存架構(gòu)由FDMA、FDMA控制器、緩存幀選擇器構(gòu)成、Xilinx MIG IP核(PL端)、Zynq軟核(PS端)構(gòu)成;圖像緩存使用Xilinx vivado的Block Design設(shè)計,以工程源碼21為例如下圖:
關(guān)于FDMA更詳細(xì)的介紹,請參考我之前的博客,博文鏈接如下:
點擊直接前往
RGB轉(zhuǎn)BT1120
在SDI輸出方式下需要使用該模塊;RGB轉(zhuǎn)BT1200模塊的作用是將用戶側(cè)的RGB視頻轉(zhuǎn)換為BT1200視頻輸出給SMPTE SD/HD/3G SDI IP核;RGB轉(zhuǎn)BT1120模塊由RGB888轉(zhuǎn)YUV444模塊、YUV444轉(zhuǎn)YUV422模塊、SDI視頻編碼模塊、數(shù)據(jù)嵌入模塊組成,該方案參考了Xilinx官方的設(shè)計;BT1120轉(zhuǎn)RGB模塊代碼架構(gòu)如下:
SDI轉(zhuǎn)HDMI盒子
在SDI輸出方式下需要使用到SDI轉(zhuǎn)HDMI盒子,因為我手里的顯示器沒有SDI接口,只有HDMI接口,為了顯示SDI視頻,只能這么做,當(dāng)然,如果你的顯示器有SDI接口,則可直接連接顯示,我的SDI轉(zhuǎn)HDMI盒子在某寶購買,不到100塊;我用的截圖如下:
工程源碼架構(gòu)
以工程源碼21為例,工程Block Design和源碼架構(gòu)如下,Block Design設(shè)計為圖像緩存架構(gòu)的部分,緩存PL端DDR3,工程源碼22與之類似,但緩存PS端DDR3:
以工程源碼21為例,總體源碼架構(gòu)如下,工程源碼22與之類似,但Block Design中有Zynq軟核:
工程源碼22使用了自定義的FDMA方案,雖然不需要SDK配置,但FDMA的AXI4接口時鐘由Zynq提供,所以需要運行SDK程序才能啟動Zynq,從而為PL端邏輯提供時鐘;由于不需要SDK配置,所以SDK軟件代碼就變得極度簡單,只需運行一個“Hello World”即可,如下:
4、工程源碼21詳解–>SDI接收+GTX 8b/10b編解碼 圖像緩存至PL端DDR3
開發(fā)板FPGA型號:Xilinx–Zynq7100–xc7z100ffg900-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:HD-SDI相機,分辨率1920x1080@30Hz;
輸出:3G-SDI ,分辨率1920x1080@60Hz;
SDI接收方案:GS2971解碼芯片;
SDI發(fā)送方案:GS2972編碼芯片;
圖像處理:GTX 8b/10b編解碼,SFP光口回環(huán);
圖像緩存方案:FDMA方案;
圖像緩存路徑:PL端DDR3;
工程作用:此工程目的是讓讀者掌握FPGA實現(xiàn)SDI+GTX 8b/10b編解碼傳輸?shù)脑O(shè)計能力,以便能夠移植和設(shè)計自己的項目;
工程Block Design和工程代碼架構(gòu)請參考第3章節(jié)“工程源碼架構(gòu)“小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
5、工程源碼22詳解–>SDI接收+GTX 8b/10b編解碼 圖像緩存至PS端DDR3
開發(fā)板FPGA型號:Xilinx–Zynq7100–xc7z100ffg900-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:HD-SDI相機,分辨率1920x1080@30Hz;
輸出:3G-SDI ,分辨率1920x1080@60Hz;
SDI接收方案:GS2971解碼芯片;
SDI發(fā)送方案:GS2972編碼芯片;
圖像處理:GTX 8b/10b編解碼,SFP光口回環(huán);
圖像緩存方案:FDMA方案;
圖像緩存路徑:PS端DDR3;
工程作用:此工程目的是讓讀者掌握FPGA實現(xiàn)SDI+GTX 8b/10b編解碼傳輸?shù)脑O(shè)計能力,以便能夠移植和設(shè)計自己的項目;
工程Block Design和工程代碼架構(gòu)請參考第3章節(jié)“工程源碼架構(gòu)“小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
6、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點擊文件–>另存為;但此方法并不保險,最保險的方法是將你的vivado版本升級到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會發(fā)現(xiàn)IP都被鎖住了,如下:
此時需要升級IP,操作如下:
FPGA型號不一致處理
如果你的FPGA型號與我的不一致,則需要更改FPGA型號,操作如下:
更改FPGA型號后還需要升級IP,升級IP的方法前面已經(jīng)講述了;
其他注意事項
1:由于每個板子的DDR不一定完全一樣,所以MIG IP需要根據(jù)你自己的原理圖進(jìn)行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據(jù)你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
7、上板調(diào)試驗證
準(zhǔn)備工作
需要準(zhǔn)備的器材如下:
FPGA開發(fā)板;
SDI攝像頭,沒有攝像頭則選擇動態(tài)彩條;
SDI轉(zhuǎn)HDMI盒子;
HDMI顯示器;
我的開發(fā)板了連接如下:
圖中居左者為GS2971接收芯片,對應(yīng)的金色同軸線連接SDI相機;居右者為GS2972發(fā)送芯片,對應(yīng)的黑色同軸線連接SDI轉(zhuǎn)HDMI盒子;SDI轉(zhuǎn)HDMI盒子再連接顯示器;
GTX 8b/10b編解碼SFP光口傳輸–>輸出視頻演示
FPGA基于GS2971+GS2972的SDI視頻收發(fā)+GTX 8b/10b編解碼SFP光口傳輸輸出效果如下:
GS2971接收+GTX高速接口+GS2972發(fā)送文章來源:http://www.zghlxwxcb.cn/news/detail-842650.html
8、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤資料如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-842650.html
到了這里,關(guān)于FPGA高端項目:FPGA基于GS2971+GS2972架構(gòu)的SDI視頻收發(fā)+GTX 8b/10b編解碼SFP光口傳輸,提供2套工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!