FPGA實(shí)現(xiàn) TCP/IP 協(xié)議棧 服務(wù)器 純VHDL代碼編寫 提供4套vivado工程源碼和技術(shù)支持
1、前言
沒玩過TCP網(wǎng)絡(luò)通信都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。目前網(wǎng)上fpga實(shí)現(xiàn)udp協(xié)議的源碼滿天飛,我這里也有不少,但用FPGA純?cè)创a實(shí)現(xiàn)TCP的項(xiàng)目卻很少,能上板調(diào)試跑通的項(xiàng)目更是少之又少,甚至可以說是鳳毛菱角,但很不巧,本人這兒就有一個(gè);一般而言,用FPGA實(shí)現(xiàn)TCP并不是一個(gè)經(jīng)濟(jì)的方案,但對(duì)于芯片原型驗(yàn)證、航天可靠通信、水下通信等一些數(shù)據(jù)傳輸可靠性極高的領(lǐng)域而言,F(xiàn)PGA實(shí)現(xiàn)TCP方案依然占有一席之地;
本設(shè)采用純VHDL實(shí)現(xiàn)了TCP/IP協(xié)議棧,該協(xié)議棧為TCP服務(wù)器,沒有用到任何一個(gè)IP核,為了適應(yīng)大批量數(shù)據(jù)傳輸和匹配不同型號(hào)FPGA的源語,RGMII轉(zhuǎn)GMII部分調(diào)用了Xilinx的Tri Mode Ethernet MAC三速網(wǎng)IP,TCP/IP協(xié)議棧的MAC接口與Tri Mode Ethernet MAC實(shí)現(xiàn)了MAC層數(shù)據(jù)交互,TCP/IP協(xié)議棧用戶接口分為UDP和TCP接口,這里只需要用到TCP接口,感興趣的朋友可以試試UDP玩兒,將TCP的收發(fā)端口直接用assign語句連接起來形成數(shù)據(jù)回環(huán),外部指定FPGA開發(fā)板的IP地址、MAC地址、端口號(hào)、目的IP地址、目的端口號(hào)等信息,即可完成TCP協(xié)議棧數(shù)據(jù)回環(huán)的工程搭建;TCP/IP協(xié)議棧目前速率固定為千兆速率,MAC層數(shù)據(jù)接口為GMII,所以與phy對(duì)接的數(shù)據(jù)接口為RGMII,鑒于不同phy的時(shí)序略有不同,所以我在RTL8211、B50610、88E1518三款phy上做了測(cè)試,對(duì)應(yīng)的也建了4套vivado工程,在電腦端進(jìn)行ping、使用網(wǎng)絡(luò)調(diào)試助手進(jìn)行TCP收發(fā)驗(yàn)證;本設(shè)計(jì)為TCP服務(wù)器端,即FPGA開發(fā)板作為服務(wù)器,遠(yuǎn)程節(jié)點(diǎn)(比如 PC 電腦)為客戶端;
提供4套vivado工程源碼,4套代碼的區(qū)別在于使用的FPGA型號(hào)和PHY型號(hào)不同,分別如下:
第1套vivado工程:FPGA型號(hào)為Xilinx 的Artix7--35T,PHY為RTL8211;
第2套vivado工程:FPGA型號(hào)為Xilinx 的Kintex7--35T,PHY為B50610;
第3套vivado工程:FPGA型號(hào)為Xilinx 的Kintex7--35T,PHY為88E1518;
第4套vivado工程:FPGA型號(hào)為Xilinx 的Zynq7020,PHY為B50610;
本設(shè)計(jì)經(jīng)過反復(fù)大量測(cè)試穩(wěn)定可靠,可在項(xiàng)目中直接移植使用,工程代碼可綜合編譯上板調(diào)試,可直接項(xiàng)目移植,適用于在校學(xué)生、研究生項(xiàng)目開發(fā),也適用于在職工程師做項(xiàng)目開發(fā),可應(yīng)用于醫(yī)療、軍工等行業(yè)的數(shù)字通信領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請(qǐng)耐心看到最后;
版本更新說明
此版本為第2版,根據(jù)讀者的建議,對(duì)第1版工程做了如下改進(jìn)和更新:
1:增加了工程移植的簡(jiǎn)單說明;
2:增加了Tri Mode Ethernet MAC IP核的使用、更新、修改等說明,以單獨(dú)文檔形式放在了資料包中;
3:新增一套Zynq7020,PHY為B50610的vivado工程;
4:增加了RTL8211、B50610、88E1518三款phy的原理圖,已放在資料包中,如下:
免責(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)慎使用。。。
2、相關(guān)方案推薦
我這里已有的以太網(wǎng)方案
目前我這里有大量UDP協(xié)議的工程源碼,包括UDP數(shù)據(jù)回環(huán),視頻傳輸,AD采集傳輸?shù)?,也有TCP協(xié)議的工程,對(duì)網(wǎng)絡(luò)通信有需求的兄弟可以去看看:直接點(diǎn)擊前往
1G 千兆網(wǎng) TCP–>客戶端 方案
TCP分為服務(wù)器和客戶端,兩者代碼是不一樣的,看具體需求,既然本博客介紹的是TCP服務(wù)器,那么肯定就有TCP客戶端,本來TCP客戶端之前一直都有,但一直沒有調(diào)通,經(jīng)過兩年半的練習(xí)調(diào)試,總算是調(diào)通了;TCP客戶端依然是4套工程源碼,我另外寫了一篇博客介紹TCP客戶端,感興趣的朋友可以去看看:直接點(diǎn)擊前往
10G 萬兆網(wǎng) TCP–>服務(wù)器+客戶端 方案
我這里也有10G 萬兆網(wǎng) TCP 方案,該方案有服務(wù)器和客戶端兩套代碼,在Xilinx KU和KUP等平臺(tái)測(cè)試通過并很穩(wěn)定,對(duì)10G 萬兆網(wǎng) TCP 方案感興趣的朋友可以去看看:直接點(diǎn)擊前往
3、該TCP/IP協(xié)議棧性能
此TCP/IP協(xié)議棧是TCP服務(wù)器,不是客戶端;即FPGA是TCP服務(wù)器,遠(yuǎn)程節(jié)點(diǎn)(比如 PC 電腦)是客戶端;
常規(guī)性能
1:純VHDL實(shí)現(xiàn),沒有用到任何一個(gè)IP核;
2:移植性天花板,該協(xié)議棧可在Xilinx、Altera、Lattice、國(guó)產(chǎn)FPGA等各大FPGA型號(hào)之間任意移植,因?yàn)槭菦]有任何IP和源語的純VHDL代碼實(shí)現(xiàn);但例如Tri Mode Ethernet MAC這樣的PHY側(cè)IP核目前用的Xilinx的;
3:功能齊全,包含了服務(wù)器和客戶端,客戶端目前還在開發(fā)中,暫不提供;TCP/IP協(xié)議棧本身包含了動(dòng)態(tài)ARP、NDP、PING、IGMP (for multicast UDP)、DHCP client(客戶端才有)等功能模塊;
4:代碼符合標(biāo)準(zhǔn)的IEEE 802.3協(xié)議,支持IPv4和IPv6;
5:對(duì)外接PHY的數(shù)據(jù)格式要求:RGMII;
6:時(shí)序收斂很到位,考慮到TCP協(xié)議的復(fù)雜性和時(shí)序的高要求,所以沒有采用時(shí)序收斂不強(qiáng)的verilog,而是VHDL,雖然閱讀性可能會(huì)低一些,但用戶只需要知道用戶接口即可,并不需要去看內(nèi)部的復(fù)雜代碼;
7:動(dòng)態(tài)ARP功能;
8:帶ping功能;
9:支持多播;
支持多節(jié)點(diǎn)
支持節(jié)點(diǎn)數(shù)是TCP里面最重要的性能指標(biāo)之一,這里需要重點(diǎn)講述:
TCP節(jié)點(diǎn)數(shù)最大支持255個(gè),通過parameter TCP_NUM參數(shù)設(shè)置,但前提是你的FPGA資源能滿足;TCP_NUM參數(shù)可以在代碼中自由修改,含義和用法,在代碼里有詳細(xì)的注釋,為了防止不同編譯器下中文注釋出現(xiàn)亂碼,注釋均由英文書寫,英語較差的兄弟可以直接某度翻譯,位置如下:
本例程只用到了1個(gè)節(jié)點(diǎn);
FPGA資源占用少
FPGA資源消耗是TCP里面最重要的性能指標(biāo)之一,這里需要重點(diǎn)講述:
FPGA資源消耗很低;以下舉例:
以Xilinx旗下資源很小的Spartan-6平臺(tái)為例,下只運(yùn)行UDP時(shí)的資源消耗如下:
只運(yùn)行1個(gè)TCP服務(wù)器時(shí)的資源消耗如下:
運(yùn)行2個(gè)TCP服務(wù)器時(shí)的資源消耗如下:
數(shù)據(jù)吞吐率高
數(shù)據(jù)吞吐率是TCP里面最重要的性能指標(biāo)之一,這里需要重點(diǎn)講述:
下面給出4項(xiàng)測(cè)試結(jié)果,你可以自己對(duì)比評(píng)估以下:
測(cè)試1:
通過千兆以太網(wǎng)在TCP服務(wù)器和TCP客戶端之間雙向連接,F(xiàn)PGA參考時(shí)鐘120 MHz條件下,測(cè)量的持續(xù)吞吐率為雙向并發(fā)452 Mbits/s;
測(cè)試2:
Xilinx Spartan-6 -2速度等級(jí),F(xiàn)PGA參考時(shí)鐘120 MHz,512字節(jié)的UDP數(shù)據(jù)包通過局域網(wǎng)點(diǎn)對(duì)點(diǎn)發(fā)送下測(cè)得:
0丟包,吞吐率為878.5 Mbits/s;當(dāng)用戶時(shí)鐘為125 MHz或以上時(shí),UDP最大幀吞吐率為915 Mbits/s;
測(cè)試3:
TCP服務(wù)器傳輸吞吐量在1百兆局域網(wǎng)下PC端測(cè)量平均吞吐量為93 Mbps,如下;
測(cè)試4:
TCP服務(wù)器將8Gbits發(fā)送到TCP Java客戶端,同時(shí)Wireshark收集速度信息。從基于FPGA的TCP服務(wù)器到PC的點(diǎn)對(duì)點(diǎn)LAN連接平均吞吐率為390.2 Mbits/s;如下:
低延時(shí)性能
延時(shí)性能是TCP里面最重要的性能指標(biāo)之一,這里需要重點(diǎn)講述:
延時(shí)與TCP數(shù)據(jù)包長(zhǎng)直接相關(guān),如果你對(duì)延時(shí)性能性能要求很高,則可以減少包長(zhǎng)來有效降低延時(shí),假設(shè)你的載包為X bytes,那么你的收發(fā)延時(shí)關(guān)系如下:
發(fā)送延時(shí)=0.5 + 2X÷125 μs;
接收延時(shí)=0.5 + X÷125 μs;
最大幀長(zhǎng)度為1460字節(jié),F(xiàn)PGA 時(shí)鐘125 MHz下的測(cè)試結(jié)果如下:
發(fā)送延時(shí)=23.9μs;
接收延時(shí)=12.2μs;
4、TCP/IP 協(xié)議棧代碼詳解
此TCP/IP協(xié)議棧是TCP服務(wù)器,不是客戶端;即FPGA是TCP服務(wù)器,遠(yuǎn)程節(jié)點(diǎn)(比如 PC 電腦)是客戶端;
代碼架構(gòu)
TCP/IP 協(xié)議棧代碼架構(gòu)如下:
所有模塊均由vhdl源碼實(shí)現(xiàn),沒有使用任何IP,可以移植到任何平臺(tái)的FPGA上;模塊的具體細(xì)節(jié)在后續(xù)章節(jié)講述;用戶接口頂層代碼如下:
純VHDL實(shí)現(xiàn),沒有用到任何一個(gè)IP核,用戶只需要知道用戶接口即可,并不需要去看內(nèi)部的復(fù)雜代碼;用戶接口及其注釋如下:
module network_top #(
parameter TCP_NUM = 1
)(
input sys_rst ,
input clk_125 ,
input clk_200 ,
output phy_rst_n ,
output gtx_resetn ,
output [3: 0] rgmii_txd , // RGMII Interface
output rgmii_tx_ctl , // RGMII Interface
output rgmii_txc , // RGMII Interface
input [3: 0] rgmii_rxd , // RGMII Interface
input rgmii_rx_ctl , // RGMII Interface
input rgmii_rxc , // RGMII Interface
output [7: 0] UDP_RX_DATA , // UDP 接收數(shù)據(jù)輸出
output UDP_RX_DATA_VALID , // UDP 接收數(shù)據(jù)輸出有效信號(hào) 高有效
output UDP_RX_SOF , // UDP 接收數(shù)據(jù)包的第一個(gè)數(shù)據(jù)標(biāo)志
output UDP_RX_EOF , // UDP 接收數(shù)據(jù)包的最后一個(gè)數(shù)據(jù)標(biāo)志
input [15:0] UDP_RX_DEST_PORT_NO_IN , // UDP 接收目的端口號(hào)
input CHECK_UDP_RX_DEST_PORT_NO, // 置 1 使能 UDP 接收目的端口號(hào)輸入比對(duì)
output [15:0] UDP_RX_DEST_PORT_NO_OUT , // CHECK_UDP_RX_DEST_PORT_NO=1-->UDP_RX_DEST_PORT_NO_OUT=UDP_RX_DEST_PORT_NO_IN
input [7:0] UDP_TX_DATA , // UDP 發(fā)送數(shù)據(jù)輸出
input UDP_TX_DATA_VALID , // UDP 發(fā)送數(shù)據(jù)輸出有效信號(hào) 高有效
input UDP_TX_SOF , // UDP 發(fā)送數(shù)據(jù)包的第一個(gè)數(shù)據(jù)標(biāo)志
input UDP_TX_EOF , // UDP 發(fā)送數(shù)據(jù)包的最后一個(gè)數(shù)據(jù)標(biāo)志
output UDP_TX_CTS , // UDP 數(shù)據(jù)此時(shí)可以發(fā)送標(biāo)志
output UDP_TX_ACK , // UDP 數(shù)據(jù)包發(fā)送完成應(yīng)答
output UDP_TX_NAK , // UDP 數(shù)據(jù)包發(fā)送未完成應(yīng)答
input [31:0] UDP_TX_DEST_IP_ADDR , // UDP 發(fā)送目的 IP 地址
input [15:0] UDP_TX_DEST_PORT_NO , // UDP 發(fā)送目的端口號(hào)
input [15:0] UDP_TX_SOURCE_PORT_NO , // UDP 發(fā)送源端口號(hào)
output [8*TCP_NUM-1:0] TCP_RX_DATA , // TCP 接收數(shù)據(jù)輸出
output [TCP_NUM-1: 0] TCP_RX_DATA_VALID , // TCP 接收數(shù)據(jù)輸出有效信號(hào) 高有效
output [TCP_NUM-1: 0] TCP_RX_RTS , // 通知用戶準(zhǔn)備接收 TCP 數(shù)據(jù)
input [TCP_NUM-1: 0] TCP_RX_CTS , // 清除接收的 TCP 數(shù)據(jù)
input [8*TCP_NUM-1:0] TCP_TX_DATA , // TCP 發(fā)送數(shù)據(jù)輸入
input [TCP_NUM-1: 0] TCP_TX_DATA_VALID , // TCP 發(fā)送數(shù)據(jù)輸入有效信號(hào) 高有效
output [TCP_NUM-1: 0] TCP_TX_CTS , // TCP 數(shù)據(jù)此時(shí)可以發(fā)送標(biāo)志
input [47: 0] MAC_ADDR , // 本地 MAC 地址
input [31: 0] IPv4_ADDR , // IPv4 地址
input [127: 0] IPv6_ADDR , // IPv6 地址
input [31: 0] GATEWAY_IP_ADDR , // 本地網(wǎng)關(guān)地址
input [31: 0] SUBNET_MASK , // 本地子網(wǎng)掩碼
input [31: 0] MULTICAST_IP_ADDR , // 多播 IP 地址
input [16*TCP_NUM-1:0] TCP_LOCAL_PORTS , // 本地 TCP 端口號(hào)
input [TCP_NUM-1: 0] CONNECTION_RESET // TCP 模塊高電平復(fù)位
);
詳細(xì)代碼請(qǐng)看源代碼;
用戶接口
用戶接口分為配置接口和用戶接口,用戶接口又分為跟應(yīng)用程序?qū)拥慕涌诤透鶰AC對(duì)接的用戶接口;框圖如下:
配置接口主要完成一些開關(guān)功能,例如使能UDP、IPv6、IGMP、本地MAC地址、IP地址等等,下面舉1個(gè)例子:
使能UDP接收的配置在代碼中的位置如下:
與MAC對(duì)接的用戶接口不需要講述,直接與MAC對(duì)接即可;
UDP協(xié)議的用戶接口個(gè)人感覺不太重要,因?yàn)檫@里有價(jià)值的是TCP協(xié)議,所以直接介紹TCP協(xié)議的用戶接口,TCP協(xié)議的用戶接口分為接收和發(fā)送,都是可與AXI4-Stream對(duì)接的類AXI4-Stream接口,代碼中有用法,你一看就懂,很簡(jiǎn)單;
代碼的端口中,有一些縮寫可能不好理解,下面給出解釋:
代碼模塊級(jí)細(xì)講
頂層模塊
頂層模塊將各個(gè)分模塊例化在一起,沒什么可講的,在代碼中的位置如下:
PACKET_PARSING模塊
PACKET_PARSING模塊功能是解析從MAC接收到的數(shù)據(jù)包,并有效地提取與多個(gè)協(xié)議相關(guān)的關(guān)鍵信息。解析是動(dòng)態(tài)進(jìn)行的,而不存儲(chǔ)數(shù)據(jù);在代碼中的位置如下:
ARP模塊
ARP模塊的作用是檢測(cè)ARP請(qǐng)求,并組包一個(gè)ARP響應(yīng)以太網(wǎng)數(shù)據(jù)包傳輸?shù)組AC;在代碼中的位置如下:
IGMP_REPORT和IGMP_QUERY模塊
IGMP_REPORT模塊的作用是以廣播形式發(fā)送GMP成員身份報(bào)告,IGMP_QUERY.vhd模塊響應(yīng)成員資格查詢。在代碼中的位置如下:
PING和WHOIS2模塊
PING模塊的作用是檢測(cè)ICMP回波(ping)請(qǐng)求,并組裝一個(gè)ping回波以太網(wǎng)數(shù)據(jù)包,以傳輸?shù)組AC,Ping同時(shí)適用于IPv4和IPv6。
WHOIS2模塊的作用是生成一個(gè)ARP請(qǐng)求廣播包(IPv4)或一個(gè)請(qǐng)求消息(IPv6),請(qǐng)求由其IP地址標(biāo)識(shí)的目標(biāo)用其MAC地址響應(yīng)。
兩個(gè)模塊共同構(gòu)成了我們經(jīng)常用到的ping功能;
在代碼中的位置如下:
ARP_CACHE2模塊
ARP_CACHE2模塊是一個(gè)共享的路由表,它存儲(chǔ)最多128個(gè)IP地址及其關(guān)聯(lián)的48位MAC地址和一個(gè)“實(shí)時(shí)的”時(shí)間戳。此模塊將確定目標(biāo)IP地址是否為本地地址。在后一種情況下,將返回網(wǎng)關(guān)的MAC地址,只存儲(chǔ)有關(guān)本地地址的記錄(例如,不是WAN地址,因?yàn)檫@些地址通常指向路由器MAC地址);仲裁電路用于仲裁來自多個(gè)傳輸實(shí)例的路由請(qǐng)求。在代碼中的位置如下:
UDP_TX模塊
UDP_TX模塊的作用是將一個(gè)數(shù)據(jù)包封裝到一個(gè)UDP幀中,即從任何端口到任何端口/IP目標(biāo)的地址。同時(shí)支持IPv4和IPv6。通常例化一次,而不管源或目標(biāo)UDP端口的數(shù)量如何,在代碼中的位置如下:
UDP_RX模塊
UDP_RX模塊的作用是驗(yàn)證接收到的UDP幀,并提取其中的數(shù)據(jù)包。由于驗(yàn)證是在接收到的數(shù)據(jù)通過時(shí)動(dòng)態(tài)執(zhí)行的(沒有存儲(chǔ)),因此在數(shù)據(jù)包結(jié)束時(shí)提供了有效性確認(rèn)信號(hào)。在代碼中的位置如下:
TCP_SERVER模塊
TCP_SERVER模塊是TCP協(xié)議的核心。它可參數(shù)化配置,以支持ntcp流并發(fā)TCP連接。它本質(zhì)上是處理TCP服務(wù)器的TCP狀態(tài)機(jī):首先監(jiān)聽來自遠(yuǎn)程TCP客戶端的連接請(qǐng)求,建立和刪除連接,并在建立連接時(shí)管理流控制和字節(jié)排序。由于這是一個(gè)服務(wù)器,它事先不預(yù)先知道協(xié)議是IPv4還是IPv6(它依賴于客戶端),所以每個(gè)服務(wù)器有兩個(gè)IP地址,每個(gè)IP版本一個(gè)。此模塊在TCP服務(wù)器的vivado工程中才有,在代碼中的位置如下:
TCP_TX模塊
TCP_TX模塊的作用是格式化TCP tx幀,包括所有層:TCP,IP,MAC/以太網(wǎng)。它對(duì)所有并發(fā)流都是通用的,因此只實(shí)例化一次。在代碼中的位置如下:
TCP_TXBUF模塊
TCP_TXBUF模塊的作用是將TCP tx有效負(fù)載數(shù)據(jù)存儲(chǔ)在單獨(dú)的彈性緩沖區(qū)中,每個(gè)傳輸流對(duì)應(yīng)一個(gè)。緩沖區(qū)大小是在合成之前通過ADDR_WIDTH通用參數(shù)配置的。在代碼中的位置如下:
TCP_RXBUFNDEMUX模塊
TCP_RXBUFNDEMUX模塊解復(fù)用了幾個(gè)TCP rx流。該模塊有兩個(gè)目標(biāo): (1)暫時(shí)保持一個(gè)接收到的TCP幀,直到在幀結(jié)束時(shí)確認(rèn)其有效性。如果無效則丟棄,如果無效則丟棄進(jìn)一步處理。(2)基于目標(biāo)端口號(hào)來分解多個(gè)TCP流。在代碼中的位置如下:
IP、MAC地址定義修改
工程代碼中需要定義開發(fā)板的MAC、IP地址以及端口號(hào)等信息,包括服務(wù)器和客戶端的;
服務(wù)器和客戶端的定義修改在代碼中的位置一樣的,如下:
開發(fā)板本地 IP、MAC地址定義修改位置如下:
代碼位于top.v
5、詳細(xì)設(shè)計(jì)方案
詳細(xì)設(shè)計(jì)方案如下:
PHY
本例程提供3套vivado工程源碼,分別對(duì)應(yīng)RTL8211、B50610、88E1518三款不同的PHY,為了方便大家設(shè)計(jì),我直接給出了三款PHY的原理圖,已放在資料包中,如下:
Tri Mode Ethernet MAC
由于TCP協(xié)議棧前面已經(jīng)詳細(xì)講過了,這里重點(diǎn)講講Tri Mode Ethernet MAC這個(gè)IP,IP調(diào)用如下:適應(yīng)大批量數(shù)據(jù)傳輸和匹配不同型號(hào)FPGA的源語,RGMII轉(zhuǎn)GMII部分調(diào)用了Xilinx的Tri Mode Ethernet MAC三速網(wǎng)IP,TCP/IP協(xié)議棧的MAC接口與Tri Mode Ethernet MAC實(shí)現(xiàn)了MAC層數(shù)據(jù)交互,MAC數(shù)據(jù)在Tri Mode Ethernet MAC和TCP/IP 協(xié)議棧之間用兩個(gè)AXI-FIFO實(shí)現(xiàn)數(shù)據(jù)緩沖和提高數(shù)據(jù)帶寬;Tri Mode Ethernet MAC固定速率為1000兆,IP配置如下:
Tri Mode Ethernet MAC在本設(shè)計(jì)中處于被鎖定狀態(tài),這是我們故意為之,目的是根據(jù)不同的PHY延時(shí)參數(shù)而修改其內(nèi)部代碼和內(nèi)部時(shí)序約束代碼,這里重點(diǎn)介紹使Tri Mode Ethernet MAC時(shí)的修改和移植事項(xiàng),當(dāng)你需要工程移植,或者你的vivado版本與我的不一致時(shí),Tri Mode Ethernet MAC都需要在vivado中進(jìn)行升級(jí),但由于該IP已被我們?nèi)藶殒i定,所以升級(jí)和修改需要一些高端操作,關(guān)于操作方法,我專門寫了一篇文檔,已附在資料包里,如下:
TCP數(shù)據(jù)回環(huán)
將TCP的收發(fā)端口直接用assign語句連接起來形成數(shù)據(jù)回環(huán),外部指定FPGA開發(fā)板的IP地址、MAC地址、端口號(hào)、目的IP地址、目的端口號(hào)等信息,即可完成TCP協(xié)議棧數(shù)據(jù)回環(huán)的工程搭建;代碼部分如下:
6、vivado工程1–>Kintex7 B50610 工程
開發(fā)板:Xilinx–>xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2020.2;
網(wǎng)絡(luò)PHY:B50610 延時(shí)模式;
輸入\輸出::TCP服務(wù)器端網(wǎng)絡(luò)通信;
測(cè)試項(xiàng):數(shù)據(jù)收發(fā)、連續(xù)ping;
工程代碼架構(gòu)如下:
FPGA資源消耗和功耗預(yù)估;
7、vivado工程2–>Artix7 RTL8211 工程
開發(fā)板:Xilinx–>xc7a35tfgg484-2;
開發(fā)環(huán)境:Vivado2020.2;
網(wǎng)絡(luò)PHY:RTL8211;
輸入\輸出::TCP服務(wù)器端網(wǎng)絡(luò)通信;
測(cè)試項(xiàng):數(shù)據(jù)收發(fā)、連續(xù)ping;
工程代碼架構(gòu)如下:
FPGA資源消耗和功耗預(yù)估;
8、vivado工程3–>Kintex7 88E1518 工程
開發(fā)板:Xilinx–>xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2020.2;
網(wǎng)絡(luò)PHY:88E1518;
輸入\輸出::TCP服務(wù)器端網(wǎng)絡(luò)通信;
測(cè)試項(xiàng):數(shù)據(jù)收發(fā)、連續(xù)ping;
工程代碼架構(gòu)如下:
FPGA資源消耗和功耗預(yù)估;
9、vivado工程4–>Zynq7020 B50610 工程
開發(fā)板:Xilinx–>Zynq7000系列–>xc7z020clg400-2;
開發(fā)環(huán)境:Vivado2020.2;
網(wǎng)絡(luò)PHY:B50610 延時(shí)模式;
輸入\輸出:TCP服務(wù)器端網(wǎng)絡(luò)通信;
測(cè)試項(xiàng):數(shù)據(jù)收發(fā)、連續(xù)ping;
工程代碼架構(gòu)如下:
FPGA資源消耗和功耗預(yù)估;
10、工程移植說明
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軟核;
11、上板調(diào)試驗(yàn)證并演示
準(zhǔn)備工作
以vivado工程1–>B50610 工程為例進(jìn)行上板調(diào)試;
連接如下:
首先設(shè)置電腦端IP如下:
下載bit,如下:
ping測(cè)試
打開cdm,輸入 ping 192.168.0.56,如下:
TCP數(shù)據(jù)回環(huán)測(cè)試
打開網(wǎng)絡(luò)調(diào)試助手并配置,如下:
單次發(fā)送數(shù)據(jù)測(cè)試結(jié)果如下:
循環(huán)發(fā)送數(shù)據(jù)測(cè)試結(jié)果如下,1秒時(shí)間間隔循環(huán):可以看到,收發(fā)計(jì)數(shù)都到了35280 Byte沒有丟包,足以證明其穩(wěn)定性;
傳輸速率測(cè)試
去除合理線損后的PC段測(cè)得991M速率,如下:文章來源:http://www.zghlxwxcb.cn/news/detail-567505.html
12、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤資料如下:
TCP源碼路徑如下:
對(duì) 1G 千兆網(wǎng) TCP 客戶端感興趣的朋友也可以看看客戶端的4套vivado工程源碼,網(wǎng)盤資料如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-567505.html
到了這里,關(guān)于FPGA實(shí)現(xiàn) TCP/IP 協(xié)議棧 純VHDL代碼編寫 提供數(shù)據(jù)回環(huán)工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!