FPGA高端項(xiàng)目:圖像采集+GTX+UDP架構(gòu),高速接口以太網(wǎng)視頻傳輸,提供2套工程源碼加QT上位機(jī)源碼和技術(shù)支持
1、前言
沒玩過圖像處理、GT高速接口、UDP網(wǎng)絡(luò)通信,都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。GT資源是Xilinx系列FPGA的重要賣點(diǎn),也是做高速接口的基礎(chǔ),不管是PCIE、SATA、MAC等,都需要用到GT資源來做數(shù)據(jù)高速串化和解串處理,Xilinx不同的FPGA系列擁有不同的GT資源類型,低端的A7由GTP,K7有GTX,V7有GTH,更高端的U+系列還有GTY等,他們的速度越來越高,應(yīng)用場(chǎng)景也越來越高端。。。
本文使用Xilinx的Kintex7 FPGA的GTP資源和板載的B50610網(wǎng)絡(luò)PHY做GTX aurora 8b/10b編解碼 UDP網(wǎng)絡(luò)視頻傳輸實(shí)驗(yàn),視頻源有兩種,分別對(duì)應(yīng)開發(fā)者手里有沒有攝像頭的情況,一種是使用廉價(jià)的OV5640攝像頭模組;如果你得手里沒有攝像頭,或者你得開發(fā)板沒有攝像頭接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行,上電默認(rèn)使用ov5640作為視頻源;FPGA采集到視頻數(shù)據(jù)后,將視頻數(shù)據(jù)進(jìn)行數(shù)據(jù)組包,然后調(diào)用GTX IP核,配置為8b/10b編解碼模式,將組包的視頻數(shù)據(jù)送入GTX編碼發(fā)送出去,然后再GTX解碼接收,用verilog編寫視頻數(shù)據(jù)對(duì)齊和視頻數(shù)據(jù)解包模塊解析出有效的視頻數(shù)據(jù),并恢復(fù)行場(chǎng)等時(shí)序,然后將視頻送到DDR3進(jìn)行緩存,再讀出視頻送UDP協(xié)議棧進(jìn)行UDP協(xié)議編碼,再調(diào)用Xilinx官方的Tri Mode Ethernet MAC作為MAC層,最后通過板載的B50610將視頻通過網(wǎng)絡(luò)數(shù)據(jù)形式發(fā)送PC,PC端用QT上位機(jī)接收?qǐng)D像并顯示出來;
提供2套vivado2019.1版本的工程源碼;2套工程的區(qū)別在于使用1個(gè)SFP光口還是使用2個(gè)SFP光口,詳情請(qǐng)看第3章節(jié)的設(shè)計(jì)思路框架;工程代碼可綜合編譯上板調(diào)試,可直接項(xiàng)目移植,適用于在校學(xué)生、研究生項(xiàng)目開發(fā),也適用于在職工程師做學(xué)習(xí)提升,可應(yīng)用于醫(yī)療、軍工等行業(yè)的高速接口或圖像處理領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請(qǐng)耐心看到最后;
免責(zé)聲明
本工程及其源碼即有自己寫的一部分,也有網(wǎng)絡(luò)公開渠道獲取的一部分(包括CSDN、Xilinx官網(wǎng)、Altera官網(wǎng)等等),若大佬們覺得有所冒犯,請(qǐng)私信批評(píng)教育;基于此,本工程及其源碼僅限于讀者或粉絲個(gè)人學(xué)習(xí)和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導(dǎo)致的法律問題,與本博客及博主無關(guān),請(qǐng)謹(jǐn)慎使用。。。
本項(xiàng)目特點(diǎn)
本項(xiàng)目是一個(gè)綜合性的高端項(xiàng)目,從宏觀上可以分為硬件和軟件的結(jié)合,硬件指的是FPGA邏輯的實(shí)現(xiàn),軟件指的是PC端QT上位機(jī)的實(shí)現(xiàn);從FPGA應(yīng)用領(lǐng)域上可以分為圖像處理、高速接口、網(wǎng)絡(luò)傳輸三大領(lǐng)域,這三大領(lǐng)域是目前FPGA的主流應(yīng)用,圖像處理屬于基礎(chǔ)應(yīng)用,網(wǎng)絡(luò)傳輸屬于中等應(yīng)用,高速接口屬于高端應(yīng)用;這個(gè)工程直接將三者結(jié)合,在實(shí)際應(yīng)用中很有需求,但市面上會(huì)的人很少。。。
2、相關(guān)方案推薦
我這里已有的 GT 高速接口解決方案
我的主頁有FPGA GT 高速接口專欄,該專欄有 GTP 、 GTX 、 GTH 、 GTY 等GT 資源的視頻傳輸例程和PCIE傳輸例程,其中 GTP基于A7系列FPGA開發(fā)板搭建,GTX基于K7或者ZYNQ系列FPGA開發(fā)板搭建,GTH基于KU或者V7系列FPGA開發(fā)板搭建,GTY基于KU+系列FPGA開發(fā)板搭建;以下是專欄地址:
點(diǎn)擊直接前往
我這里已有的以太網(wǎng)方案
目前我這里有大量UDP協(xié)議的工程源碼,包括UDP數(shù)據(jù)回環(huán),視頻傳輸,AD采集傳輸?shù)龋灿蠺CP協(xié)議的工程,還有RDMA的NIC 10G 25G 100G網(wǎng)卡工程源碼,對(duì)網(wǎng)絡(luò)通信有需求的兄弟可以去看看:直接點(diǎn)擊前往
其中10G萬兆TCP協(xié)議的工程博客如下:
直接點(diǎn)擊前往
3、設(shè)計(jì)思路框架
本文使用Xilinx的Kintex7 FPGA的GTP資源和板載的B50610網(wǎng)絡(luò)PHY做GTX aurora 8b/10b編解碼 UDP網(wǎng)絡(luò)視頻傳輸實(shí)驗(yàn),視頻源有兩種,分別對(duì)應(yīng)開發(fā)者手里有沒有攝像頭的情況,一種是使用廉價(jià)的OV5640攝像頭模組;如果你得手里沒有攝像頭,或者你得開發(fā)板沒有攝像頭接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻;視頻源的選擇通過代碼頂層的define宏定義進(jìn)行,上電默認(rèn)使用ov5640作為視頻源;FPGA采集到視頻數(shù)據(jù)后,將視頻數(shù)據(jù)進(jìn)行數(shù)據(jù)組包,然后調(diào)用GTX IP核,配置為8b/10b編解碼模式,將組包的視頻數(shù)據(jù)送入GTX編碼發(fā)送出去,然后再GTX解碼接收,用verilog編寫視頻數(shù)據(jù)對(duì)齊和視頻數(shù)據(jù)解包模塊解析出有效的視頻數(shù)據(jù),并恢復(fù)行場(chǎng)等時(shí)序,然后將視頻送到DDR3進(jìn)行緩存,再讀出視頻送UDP協(xié)議棧進(jìn)行UDP協(xié)議編碼,再調(diào)用Xilinx官方的Tri Mode Ethernet MAC作為MAC層,最后通過板載的B50610將視頻通過網(wǎng)絡(luò)數(shù)據(jù)形式發(fā)送PC,PC端用QT上位機(jī)接收?qǐng)D像并顯示出來;提供2套vivado2019.1版本的工程源碼;2套工程的區(qū)別在于使用1個(gè)SFP光口還是使用2個(gè)SFP光口
設(shè)計(jì)框圖
使用2個(gè)SFP光口框圖如下:
注意:框圖中的數(shù)字表示數(shù)據(jù)流向的順序;
使用1個(gè)SFP光口框圖如下:
注意:框圖中的數(shù)字表示數(shù)據(jù)流向的順序;
視頻源選擇
視頻源有兩種,分別對(duì)應(yīng)開發(fā)者手里有沒有攝像頭的情況,如果你的手里有攝像頭,或者你的開發(fā)板有攝像頭接口,則使用攝像頭作為視頻輸入源,我這里用到的是廉價(jià)的OV5640攝像頭模組;如果你得手里沒有攝像頭,或者你得開發(fā)板沒有攝像頭接口,則可使用代碼內(nèi)部生成的動(dòng)態(tài)彩條模擬攝像頭視頻,動(dòng)態(tài)彩條是移動(dòng)的畫面,完全可以模擬視頻;默認(rèn)使用ov5640作為視頻源;視頻源的選擇通過代碼頂層的`define宏定義進(jìn)行;如下:
選擇邏輯代碼部分如下:
選擇邏輯如下:
當(dāng)(注釋) define USE_SENSOR時(shí),輸入源視頻是動(dòng)態(tài)彩條;
當(dāng)(不注釋) define USE_SENSOR時(shí),輸入源視頻是ov5640攝像頭;
OV5640攝像頭配置及采集
OV5640攝像頭需要i2c配置才能使用,需要將DVP接口的視頻數(shù)據(jù)采集為RGB565或者RGB888格式的視頻數(shù)據(jù),這兩部分均用verilog代碼模塊實(shí)現(xiàn),代碼位置如下:
其中攝像頭配置為分辨率1280x720,如下:
攝像頭采集模塊支持RGB565和RGB888格式的視頻輸出,可由參數(shù)配置,如下:
RGB_TYPE=0輸出本RGB565格式;
RGB_TYPE=1輸出本RGB888格式;
設(shè)計(jì)選擇RGB565格式;
動(dòng)態(tài)彩條
動(dòng)態(tài)彩條可配置為不同分辨率的視頻,視頻的邊框?qū)挾龋瑒?dòng)態(tài)移動(dòng)方塊的大小,移動(dòng)速度等都可以參數(shù)化配置,我這里配置為辨率1280x720,動(dòng)態(tài)彩條模塊代碼位置和頂層接口和例化如下:
視頻數(shù)據(jù)組包
由于視頻需要在GTP中通過aurora 8b/10b協(xié)議收發(fā),所以數(shù)據(jù)必須進(jìn)行組包,以適應(yīng)aurora 8b/10b協(xié)議標(biāo)準(zhǔn);視頻數(shù)據(jù)組包模塊代碼位置如下:
首先,我們將16bit的視頻存入FIFO中,存滿一行時(shí)就從FIFO讀出送入GTX發(fā)送;在此之前,需要對(duì)一幀視頻進(jìn)行編號(hào),也叫作指令,GTX組包時(shí)根據(jù)固定的指令進(jìn)行數(shù)據(jù)發(fā)送,GTX解包時(shí)根據(jù)固定的指令恢復(fù)視頻的場(chǎng)同步信號(hào)和視頻有效信號(hào);當(dāng)一幀視頻的場(chǎng)同步信號(hào)上升沿到來時(shí),發(fā)送一幀視頻開始指令 0,當(dāng)一幀視頻的場(chǎng)同步信號(hào)下降沿到來時(shí),發(fā)送一幀視頻開始指令 1,視頻消隱期間發(fā)送無效數(shù)據(jù) 0 和無效數(shù)據(jù) 1,當(dāng)視頻有效信號(hào)到來時(shí)將每一行視頻進(jìn)行編號(hào),先發(fā)送一行視頻開始指令,在發(fā)送當(dāng)前的視頻行號(hào),當(dāng)一行視頻發(fā)送完成后再發(fā)送一行視頻結(jié)束指令,一幀視頻發(fā)送完成后,先發(fā)送一幀視頻結(jié)束指令 0,再發(fā)送一幀視頻結(jié)束指令 1;至此,一幀視頻則發(fā)送完成,這個(gè)模塊不太好理解,所以我在代碼里進(jìn)行了詳細(xì)的中文注釋,需要注意的是,為了防止中文注釋的亂序顯示,請(qǐng)用notepad++編輯器打開代碼;指令定義如下:
指令可以任意更改,但最低字節(jié)必須為bc;
GTX 全網(wǎng)最細(xì)解讀
關(guān)于GTX介紹最詳細(xì)的肯定是Xilinx官方的《ug476_7Series_Transceivers》,我們以此來解讀:
《ug476_7Series_Transceivers》的PDF文檔我已放在了資料包里,文章末尾有獲取方式;
我用到的開發(fā)板FPGA型號(hào)為Xilinx Kintex7 xc7k325tffg676-2;帶有8路GTX資源,其中2路連接到了2個(gè)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)等等;
工程調(diào)用GTX做aurora 8b/10b協(xié)議的數(shù)據(jù)編解碼,前面已經(jīng)對(duì)GTP做了詳細(xì)概述,這里不講;代碼位置如下:
GTX 基本結(jié)構(gòu)
Xilinx 以 Quad 來對(duì)串行高速收發(fā)器進(jìn)行分組,四個(gè)串行高速收發(fā)器和一個(gè) COMMOM(QPLL)組成一個(gè) Quad,每一個(gè)串行高速收發(fā)器稱為一個(gè) Channel(通道),下圖為四路 GTX 收發(fā)器在Kintex7 FPGA 芯片中的示意圖:《ug476_7Series_Transceivers》第24頁;
GTX 的具體內(nèi)部邏輯框圖如下所示,它由四個(gè)收發(fā)器通道 GTXE2_CHANNEL原語 和一個(gè)GTXE2_COMMON 原語組成。每路GTXE2_CHANNEL包含發(fā)送電路 TX 和接收電路 RX,GTXE2_CHANNEL的時(shí)鐘可以來自于CPLL或者QPLL,可在IP配置界面里配置;《ug476_7Series_Transceivers》第25頁;
每個(gè) GTXE2_CHANNEL 的邏輯電路如下圖所示:《ug476_7Series_Transceivers》第26頁;
GTXE2_CHANNEL 的發(fā)送端和接收端功能是獨(dú)立的,均由 PMA(Physical Media Attachment,物理媒介適配層)和 PCS(Physical Coding Sublayer,物理編碼子層)兩個(gè)子層組成。其中 PMA 子層包含高速串并轉(zhuǎn)換(Serdes)、預(yù)/后加重、接收均衡、時(shí)鐘發(fā)生器及時(shí)鐘恢復(fù)等電路。PCS 子層包含8B/10B 編解碼、緩沖區(qū)、通道綁定和時(shí)鐘修正等電路。
這里說多了意義不大,因?yàn)闆]有做過幾個(gè)大的項(xiàng)目是不會(huì)理解這里面的東西的,對(duì)于初次使用或者想快速使用者而言,更多的精力應(yīng)該關(guān)注IP核的調(diào)用和使用,后面我也會(huì)重點(diǎn)將到IP核的調(diào)用和使用;
GTX 發(fā)送和接收處理流程
首先用戶邏輯數(shù)據(jù)經(jīng)過 8B/10B 編碼后,進(jìn)入一個(gè)發(fā)送緩存區(qū)(Phase Adjust FIFO),該緩沖區(qū)主要是 PMA 子層和 PCS 子層兩個(gè)時(shí)鐘域的時(shí)鐘隔離,解決兩者時(shí)鐘速率匹配和相位差異的問題,最后經(jīng)過高速 Serdes 進(jìn)行并串轉(zhuǎn)換(PISO),有必要的話,可以進(jìn)行預(yù)加重(TX Pre-emphasis)、后加重。值得一提的是,如果在 PCB 設(shè)計(jì)時(shí)不慎將 TXP 和 TXN 差分引腳交叉連接,則可以通過極性控制(Polarity)來彌補(bǔ)這個(gè)設(shè)計(jì)錯(cuò)誤。接收端和發(fā)送端過程相反,相似點(diǎn)較多,這里就不贅述了,需要注意的是 RX 接收端的彈性緩沖區(qū),其具有時(shí)鐘糾正和通道綁定功能。這里的每一個(gè)功能點(diǎn)都可以寫一篇論文甚至是一本書,所以這里只需要知道個(gè)概念即可,在具體的項(xiàng)目中回具體用到,還是那句話:對(duì)于初次使用或者想快速使用者而言,更多的精力應(yīng)該關(guān)注IP核的調(diào)用和使用。
GTX 的參考時(shí)鐘
GTX 模塊有兩個(gè)差分參考時(shí)鐘輸入管腳(MGTREFCLK0P/N 和 MGTREFCLK1P/N),作為 GTX 模塊的參考時(shí)鐘源,用戶可以自行選擇。一般的A7系列開發(fā)板上,都有一路 148.5Mhz 的 GTX 參考時(shí)鐘連接到 MGTREFCLK0上,作為 GTX 的參考時(shí)鐘。差分參考時(shí)鐘通過IBUFDS 模塊轉(zhuǎn)換成單端時(shí)鐘信號(hào)進(jìn)入到 GTXE2_COMMOM 的QPLL或CPLL中,產(chǎn)生 TX 和 RX 電路中所需的時(shí)鐘頻率。TX 和 RX 收發(fā)器速度相同的話,TX 電路和 RX 電路可以使用同一個(gè) PLL 產(chǎn)生的時(shí)鐘,如果 TX 和 RX收發(fā)器速度不相同的話,需要使用不同的 PLL 時(shí)鐘產(chǎn)生的時(shí)鐘。參考時(shí)鐘這里Xilinx給出的GT參考例程已經(jīng)做得很好了,我們調(diào)用時(shí)其實(shí)不用修改;GTX 的參考時(shí)鐘結(jié)構(gòu)圖如下:《ug476_7Series_Transceivers》第31頁;
GTX 發(fā)送接口
《ug476_7Series_Transceivers》的第107到165頁詳細(xì)介紹了發(fā)送處理流程,其中大部分內(nèi)容對(duì)于用戶而言可以不去深究,因?yàn)槭謨?cè)講的基本都是他自己的設(shè)計(jì)思想,留給用戶可操作的接口并不多,基于此思路,我們重點(diǎn)講講GTX例化時(shí)留給用戶的發(fā)送部分需要用到的接口;
用戶只需要關(guān)心發(fā)送接口的時(shí)鐘和數(shù)據(jù)即可,GTX例化模塊的這部分接口如下:
在代碼中我已為你們重新綁定并做到了模塊的頂層,代碼部分如下:
GTX 接收接口
《ug476_7Series_Transceivers》的第167到295頁詳細(xì)介紹了發(fā)送處理流程,其中大部分內(nèi)容對(duì)于用戶而言可以不去深究,因?yàn)槭謨?cè)講的基本都是他自己的設(shè)計(jì)思想,留給用戶可操作的接口并不多,基于此思路,我們重點(diǎn)講講GTX例化時(shí)留給用戶的發(fā)送部分需要用到的接口;
用戶只需要關(guān)心接收接口的時(shí)鐘和數(shù)據(jù)即可,GTX例化模塊的這部分接口如下:
在代碼中我已為你們重新綁定并做到了模塊的頂層,代碼部分如下:
GTX IP核調(diào)用和使用
這里對(duì)上圖的標(biāo)號(hào)做解釋:
1:線速率,根據(jù)自己的項(xiàng)目需求來,GTX 的范圍是0.5到10.3125G,由于我的項(xiàng)目是視頻傳輸,所以在GTX 的速率范圍內(nèi)均可,本例程選擇了5.94G;
2:參考時(shí)鐘,這個(gè)得根據(jù)你的原理圖來,可以是80M、125M、148.5M、156.25M等等,我的開發(fā)板是148.5M;
4:GTX 組的綁定,這個(gè)很重要,他的綁定參考依據(jù)有兩個(gè),已是你的開發(fā)板原理圖,而是官方的參考資料《ug476_7Series_Transceivers》,官方根據(jù)BANK不同將GTX資源分成了多組,由于GT資源是Xilinx系列FPGA的專用資源,占用專用的Bnak,所以引腳也是專用的,那么這些GTX組和引腳是怎么對(duì)應(yīng)的呢?《ug476_7Series_Transceivers》的說明如下:紅框內(nèi)為的我的開發(fā)板原理圖對(duì)應(yīng)的FPGA引腳;
我的板子原理圖如下:
選擇外部數(shù)據(jù)位寬32bit的8b/10b編解碼,如下:
下面這里講的是K碼檢測(cè):
這里選擇K28.5,也就是所謂的COM碼,十六進(jìn)制為bc,他的作用很多,可以表示空閑亂序符號(hào),也可以表示數(shù)據(jù)錯(cuò)位標(biāo)志,這里用來標(biāo)志數(shù)據(jù)錯(cuò)位,8b/10b協(xié)議對(duì)K碼的定義如下:
下面講的是時(shí)鐘矯正,也就是對(duì)應(yīng)GTP內(nèi)部接收部分的彈性buffer;
這里有一個(gè)時(shí)鐘頻偏的概念,特別是收發(fā)雙方時(shí)鐘不同源時(shí),這里設(shè)置的頻偏為100ppm,規(guī)定每隔5000個(gè)數(shù)據(jù)包發(fā)送方發(fā)送一個(gè)4字節(jié)的序列,接收方的彈性buffer會(huì)根據(jù)這4字節(jié)的序列,以及數(shù)據(jù)在buffer中的位置來決定刪除或者插入一個(gè)4字節(jié)的序列中的一個(gè)字節(jié),目的是確保數(shù)據(jù)從發(fā)送端到接收端的穩(wěn)定性,消除時(shí)鐘頻偏的影響;
數(shù)據(jù)對(duì)齊
由于GT資源的aurora 8b/10b數(shù)據(jù)收發(fā)天然有著數(shù)據(jù)錯(cuò)位的情況,所以需要對(duì)接受到的解碼數(shù)據(jù)進(jìn)行數(shù)據(jù)對(duì)齊處理,數(shù)據(jù)對(duì)齊模塊代碼位置如下:
我定義的 K 碼控制字符格式為:XX_XX_XX_BC,所以用一個(gè)rx_ctrl 指示數(shù)據(jù)是否為 K 碼 的 COM 符號(hào);
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í)就對(duì)數(shù)據(jù)進(jìn)行對(duì)齊處理,也就是將數(shù)據(jù)打一拍,和新進(jìn)來的數(shù)據(jù)進(jìn)行錯(cuò)位組合,這是FPGA的基礎(chǔ)操作,這里不再贅述;
視頻數(shù)據(jù)解包
數(shù)據(jù)解包是數(shù)據(jù)組包的逆過程,代碼位置如下:
GTX解包時(shí)根據(jù)固定的指令恢復(fù)視頻的場(chǎng)同步信號(hào)和視頻有效信號(hào);這些信號(hào)是作為后面圖像緩存的重要信號(hào);
至此,數(shù)據(jù)進(jìn)出GTX部分就已經(jīng)講完了,整個(gè)過程的框圖我在代碼中描述了,如下:
圖像緩存
經(jīng)??次也┛偷睦戏蹜?yīng)該都知道,我做圖像緩存的套路是FDMA,他的作用是將圖像送入DDR中做3幀緩存再讀出顯示,目的是匹配輸入輸出的時(shí)鐘差和提高輸出視頻質(zhì)量,關(guān)于FDMA,請(qǐng)參考我之前的博客,博客地址:點(diǎn)擊直接前往
需要注意的是,為了適應(yīng)UDP視頻傳輸,這里的FDMA已被我修改,和以往版本不同,具體參考代碼;
UDP數(shù)據(jù)組包
實(shí)現(xiàn)UDP數(shù)據(jù)的組包,UDP數(shù)據(jù)發(fā)送必須與QT上位機(jī)的接受程序一致,上位機(jī)定義的UDP幀格式包括幀頭個(gè)UDP數(shù)據(jù),幀頭定義如下:
FPGA端的UDP數(shù)據(jù)組包代碼必須與上圖的數(shù)據(jù)幀格式對(duì)應(yīng),否則QT無法解析,代碼中定義了數(shù)據(jù)組包狀態(tài)機(jī)以及數(shù)據(jù)幀,如下:
另外,由于UDP發(fā)送是64位數(shù)據(jù)位寬,而圖像像素?cái)?shù)據(jù)是24bit位寬,所以必須將UDP數(shù)據(jù)重新組合,以保證像素?cái)?shù)據(jù)的對(duì)齊,這部分是整個(gè)工程的難點(diǎn),也是所有FPGA做UDP數(shù)據(jù)傳輸?shù)碾y點(diǎn);
UDP協(xié)議棧
本UDP協(xié)議棧方案需配合Xilinx的Tri Mode Ethernet MAC三速網(wǎng)IP一起使用,使用UDP協(xié)議棧網(wǎng)表文件,雖看不見源碼但可正常實(shí)現(xiàn)UDP通信,該協(xié)議棧目前并不開源,只提供網(wǎng)表文件,但不影響使用,該協(xié)議棧帶有用戶接口,使得用戶無需關(guān)心復(fù)雜的UDP協(xié)議而只需關(guān)心簡(jiǎn)單的用戶接口時(shí)序即可操作UDP收發(fā),非常簡(jiǎn)單;
協(xié)議棧架構(gòu)如下:
協(xié)議棧性能表現(xiàn)如下:
1:支持 UDP 接收校驗(yàn)和檢驗(yàn)功能,暫不支持 UDP 發(fā)送校驗(yàn)和生成;
2:支持 IP 首部校驗(yàn)和的生成和校驗(yàn),同時(shí)支持 ICMP 協(xié)議中的 PING 功能,可接收并響應(yīng)同一個(gè)子網(wǎng)內(nèi)部設(shè)備的 PING 請(qǐng)求;
3:可自動(dòng)發(fā)起或響應(yīng)同一個(gè)子網(wǎng)內(nèi)設(shè)備的 ARP 請(qǐng)求,ARP 收發(fā)完全自適應(yīng)。ARP 表可保存同一個(gè)子網(wǎng)內(nèi)部256 個(gè) IP 和 MAC 地址對(duì);
4:支持 ARP 超時(shí)機(jī)制,可檢測(cè)所需發(fā)送數(shù)據(jù)包的目的 IP 地址是否可達(dá);
5:協(xié)議棧發(fā)送帶寬利用率可達(dá) 93%,高發(fā)送帶寬下,內(nèi)部仲裁機(jī)制保證 PING 和 ARP 功能不受任何影響;
6:發(fā)送過程不會(huì)造成丟包;
7:提供64bit位寬AXI4-Stream形式的MAC接口,可與Xilinx官方的千兆以太網(wǎng)IP核Tri Mode Ethernet MAC,以及萬兆以太網(wǎng) IP 核 10 Gigabit Ethernet Subsystem、10 Gigabit Ethernet MAC 配合使用;
有了此協(xié)議棧,我們無需關(guān)心復(fù)雜的UDP協(xié)議的實(shí)現(xiàn)了,直接調(diào)用接口即可使用。。。
本UDP協(xié)議棧用戶接口發(fā)送時(shí)序如下:
本UDP協(xié)議棧用戶接口接收時(shí)序如下:
UDP協(xié)議棧數(shù)據(jù)發(fā)送
UDP協(xié)議棧具有發(fā)送和接收功能,但這里僅用到了發(fā)送,此部分代碼架構(gòu)如下:
UDP協(xié)議棧代碼組我已經(jīng)做好,用戶可直接拿去使用;
這里對(duì)代碼中用到的數(shù)據(jù)緩沖FIFO組做如下解釋:
由于 UDP IP 協(xié)議棧的 AXI-Stream 數(shù)據(jù)接口位寬為 64bit,而 Tri Mode Ethernet MAC 的 AXI-Stream數(shù)據(jù)接口位寬為 8bit。因此,要將 UDP IP 協(xié)議棧與 Tri Mode Ethernet MAC 之間通過 AXI-Stream 接口互聯(lián),需要進(jìn)行時(shí)鐘域和數(shù)據(jù)位寬的轉(zhuǎn)換。實(shí)現(xiàn)方案如下圖所示:
收發(fā)路徑(本設(shè)計(jì)只用到了發(fā)送)都使用了2個(gè)AXI-Stream DATA FIFO,通過其中1個(gè)FIFO實(shí)現(xiàn)異步時(shí)鐘域的轉(zhuǎn)換,1個(gè)FIFO實(shí)
現(xiàn)數(shù)據(jù)緩沖和同步Packet mode功能;由于千兆速率下Tri Mode Ethernet MAC的AXI-Stream數(shù)據(jù)接口同步時(shí)鐘信號(hào)為125MHz,此時(shí),UDP協(xié)議棧64bit的AXI-Stream數(shù)據(jù)接口同步時(shí)鐘信號(hào)應(yīng)該為125MHz/(64/8)=15.625MHz,因此,異步
AXI-Stream DATA FIFO兩端的時(shí)鐘分別為125MHz(8bit),15.625MHz(64bit);UDP IP協(xié)議棧的AXI-Stream接口經(jīng)過FIFO時(shí)鐘域轉(zhuǎn)換后,還需要進(jìn)行數(shù)據(jù)數(shù)據(jù)位寬轉(zhuǎn)換,數(shù)據(jù)位寬的轉(zhuǎn)換通過AXI4-Stream Data Width Converter完成,在接收路徑中,進(jìn)行 8bit 到 64bit 的轉(zhuǎn)換;在發(fā)送路徑中,進(jìn)行 64bit 到 8bit 的轉(zhuǎn)換;
IP地址、端口號(hào)的修改
UDP協(xié)議棧留出了IP地址、端口號(hào)的修改端口供用戶自由修改,位置如下:
Tri Mode Ethernet MAC介紹以及移植注意事項(xiàng)
本設(shè)計(jì)調(diào)用了Xilinx官方IP:Tri Mode Ethernet MAC,其在代碼中的位置如下:
可以看到其中泰處于被鎖定狀態(tài),這是我們故意為之,目的是根據(jù)不同的PHY延時(shí)參數(shù)而修改其內(nèi)部代碼和內(nèi)部時(shí)序約束代碼,由于本設(shè)計(jì)使用的網(wǎng)絡(luò)PHY為B50610 ,所以這里重點(diǎn)介紹使用B50610 時(shí),Tri Mode Ethernet MAC的修改和移植事項(xiàng),當(dāng)你需要工程移植,或者你的vivado版本與我的不一致時(shí),Tri Mode Ethernet MAC都需要在vivado中進(jìn)行升級(jí),但由于該IP已被我們?nèi)藶殒i定,所以升級(jí)和修改需要一些高端操作,關(guān)于操作方法,我專門寫了一篇文檔,已附在資料包里,如下:
B50610 PHY
本設(shè)計(jì)開發(fā)板使用的網(wǎng)絡(luò)PHY為B50610,工作在延時(shí)模式下,原理圖引出了MDIO,但代碼中不需要MDIO配置,通過上下拉電阻即可使B50610工作于延時(shí)模式,該P(yáng)HY最高支持千兆,且能在10M/100M/1000M之間自動(dòng)協(xié)商,但本設(shè)計(jì)在Tri Mode Ethernet MAC端固定為1000M;在資料包中,我們提供B50610的原理圖;
QT上位機(jī)和源碼
我們提供和UDP通信協(xié)議相匹配的QT抓圖顯示上位機(jī)及其源代碼,目錄如下:
我們的QT目前僅支持1280x720分辨率的視頻抓圖顯示,但同時(shí)預(yù)留了1080P接口,對(duì)QT開發(fā)感興趣的朋友可以嘗試修改代碼以適應(yīng)1080P,因?yàn)镼T在這里只是驗(yàn)證工具,不是本工程的重點(diǎn),所以不再過多贅述,詳情請(qǐng)參考資料包的QT源碼,位置如下:
4、vivado工程1–>1路SFP傳輸
開發(fā)板FPGA型號(hào):Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:ov5640攝像頭或者動(dòng)態(tài)彩條,分辨率1280x720@60Hz;
輸出:SFP光口/RJ45網(wǎng)口;
網(wǎng)絡(luò)PHY:B50610,延時(shí)模式;
應(yīng)用:FPGA GTX+UDP架構(gòu),高速接口以太網(wǎng)視頻傳輸,1路SFP光口;
工程Block Design如下:
工程代碼架構(gòu)如下:
工程的資源消耗和功耗如下:
5、vivado工程2–>2路SFP傳輸
開發(fā)板FPGA型號(hào):Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:ov5640攝像頭或者動(dòng)態(tài)彩條,分辨率1280x720@60Hz;
輸出:SFP光口/RJ45網(wǎng)口;
網(wǎng)絡(luò)PHY:B50610,延時(shí)模式;
應(yīng)用:FPGA GTX+UDP架構(gòu),高速接口以太網(wǎng)視頻傳輸,2路SFP光口;
工程Block Design、工程代碼架構(gòu)、工程的資源消耗和第4章節(jié)的“vivado工程1–>1路SFP傳輸”一致;
6、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點(diǎn)擊文件–>另存為;但此方法并不保險(xiǎn),最保險(xiǎn)的方法是將你的vivado版本升級(jí)到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會(huì)發(fā)現(xiàn)IP都被鎖住了,如下:
此時(shí)需要升級(jí)IP,操作如下:
FPGA型號(hào)不一致處理
如果你的FPGA型號(hào)與我的不一致,則需要更改FPGA型號(hào),操作如下:
更改FPGA型號(hào)后還需要升級(jí)IP,升級(jí)IP的方法前面已經(jīng)講述了;
其他注意事項(xiàng)
1:由于每個(gè)板子的DDR不一定完全一樣,所以MIG IP需要根據(jù)你自己的原理圖進(jìn)行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據(jù)你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
7、上板調(diào)試驗(yàn)證并演示
準(zhǔn)備工作
需要準(zhǔn)備以下物品:
1:FPGA開發(fā)板;
2:OV5640攝像頭,沒有則選擇代碼里的動(dòng)態(tài)彩條;
3:光模塊和光纖;
4:網(wǎng)線;
5:上位機(jī)電腦,臺(tái)式或筆記本;
工程1:1路SFP傳輸?shù)墓饫w接法如下:
工程2:2路SFP傳輸?shù)墓饫w接法如下:
然后將你的電腦IP地址改為和代碼里規(guī)定的IP一致,當(dāng)然,代碼里的IP是可以任意設(shè)置的,但代碼里的IP修改后,電腦端的IP也要跟著改,我的設(shè)置如下:
ping一下
在開始測(cè)試前,我們先ping一下,測(cè)試UDP是否連通,如下:
靜態(tài)演示
ov5640攝像頭1280x720輸入U(xiǎn)DP網(wǎng)絡(luò)傳輸QT上位機(jī)顯示如下:
動(dòng)態(tài)彩條1280x720輸入U(xiǎn)DP網(wǎng)絡(luò)傳輸QT上位機(jī)顯示如下:
動(dòng)態(tài)演示
動(dòng)態(tài)視頻演示如下:
K7-GTX-UDP-OV5640文章來源:http://www.zghlxwxcb.cn/news/detail-755134.html
8、福利:工程源碼獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤資料如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-755134.html
到了這里,關(guān)于FPGA高端項(xiàng)目:圖像采集+GTX+UDP架構(gòu),高速接口以太網(wǎng)視頻傳輸,提供2套工程源碼加QT上位機(jī)源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!