侯鴻杰,王竹剛
(1.中國科學院 國家空間科學中心,北京 100190;2.中國科學院大學 北京100190)
基于MicroBlaze的可靠網(wǎng)絡接口設計
侯鴻杰1,2,王竹剛1
(1.中國科學院 國家空間科學中心,北京 100190;2.中國科學院大學 北京100190)
Microblaze是Xilinx公司設計一種軟核SOPC,它是FPGA芯片內(nèi)部邏輯組成的一種32位軟核嵌入式處理器。為了實現(xiàn)數(shù)據(jù)從FPGA到計算機的高速傳遞,本文介紹了一種基于uIP及LwIP的網(wǎng)絡協(xié)議棧,提出了一種可靠UDP(reliable UDP,RLUDP)協(xié)議,并完成了嵌入式TCP/IP協(xié)議棧設計與實現(xiàn),實現(xiàn)了PC與MicroBlaze的高速數(shù)據(jù)傳輸,并對其性能進行了簡單的測試,最終達到了設計要求。
MicroBlaze;SOPC;可靠UDP;嵌入式TCP/IP
現(xiàn)場可編程門陣列(FPGA)廣泛應用于數(shù)傳,遙測,調(diào)制解調(diào)等領域。隨著我國測控通信技術的極速發(fā)展,對通信基帶數(shù)據(jù)發(fā)射和接收的速度及實時性要求日漸提高。針對FPGA與計算機等信源信宿的高速數(shù)傳需求,需要有一種基于現(xiàn)有通信協(xié)議的解決方案。網(wǎng)絡方式可以滿足長距離(100 m及以上級別)的高速數(shù)傳需求。近年來SOPC技術得到了迅速的發(fā)展,基于FPGA的SOPC系統(tǒng)結合FPGA及微處理器的優(yōu)點在點對點數(shù)傳方面的得到了廣泛應用。文獻[1]描述了一種基于MicroBlaze的嵌入式協(xié)議棧移植,并搭建了簡單LED外設進行驗證。文獻[2]提出了基于FPGA的Micro Blaze+DM9000網(wǎng)卡以太網(wǎng)接口方案,并實現(xiàn)了TCP,UDP通信。基于以上需求及成功的應用案例本文采用了Xilinx的FPGA,并使用其嵌入式軟核處理器MicroBlaze,采用嵌入式TCP/IP協(xié)議棧的方法實現(xiàn)了高速數(shù)傳。
系統(tǒng)總體硬件框圖如圖1所示,系統(tǒng)分為兩部分,分別PC上位機和FPGA,F(xiàn)PGA端包括MicroBlaze處理器系統(tǒng)[3-5],調(diào)制解調(diào)軟核,PC端主要為上位機。數(shù)據(jù)調(diào)制解調(diào)模塊主要完成通信物理層相關的數(shù)字信號處理工作,MicroBlaze是本系統(tǒng)的核心,在其上運行嵌入式TCP/IP協(xié)議棧,其他模塊包括基于DMA[6]的千兆網(wǎng)卡MAC IP核[7],LED外設[8]等。PC上位機是協(xié)議棧的客戶端點,完成數(shù)據(jù)收發(fā)請求,寄存器配置,連接建立保持等功能。FPGA采用了Xilinx的7系列芯片,由于調(diào)制解調(diào)數(shù)據(jù)有高速傳輸需求,因此采用的是千兆網(wǎng)卡的MAC IP核。
圖1 系統(tǒng)總體結構圖
本系統(tǒng)的數(shù)傳端點分別為FPGA和PC,對于FPGA協(xié)議棧選擇了在MicroBlaze中實現(xiàn),總體的協(xié)議棧參考模型如圖2所示,F(xiàn)PGA網(wǎng)絡接口層使用的是Xilinx的千兆以太網(wǎng)IP核,其余各層則在MicroBlaze中實現(xiàn)。PC端采用Windows操作系統(tǒng),使用MFC界面[9],用戶代碼主要完成傳輸層以上的處理。
圖2 系統(tǒng)協(xié)議棧模型
UDP協(xié)議是一種面向無連接的協(xié)議[10],它不提供可靠性,如果數(shù)據(jù)包發(fā)生丟失UDP也不提供丟失信息。然而由于沒有確認信息,差錯信息的額外開銷,UDP相比于TCP具有了高速的特點。由于點對點的近距離網(wǎng)絡通信環(huán)境誤碼率較低,并且由于網(wǎng)卡內(nèi)部緩沖區(qū)有限,可能存在丟包的現(xiàn)象,因此設計一種通過重傳來保證可靠性的UDP成為了最佳選擇。SOPC作為嵌入式系統(tǒng)內(nèi)存資源有限,在高速通信時可能存在緩存區(qū)溢出的情況,因此需要對UDP數(shù)據(jù)包的發(fā)送速率進行控制,本文設計的可靠UDP協(xié)議主要包括了兩部分:超時重傳,流量控制。在標準的TCP/IP的協(xié)議棧基礎上加入超時重傳,流量控制功能,RLUDP的首部設計如圖3所示。
圖3 可靠UDP首部
其各字段為:
GROUP ID(組標示號):一次傳輸單元(組)的唯一標示,即同一組的數(shù)據(jù)包GROUP ID字段相同,GROUP ID的長度為16位。
SEQ(包序列號):一個傳輸組中的單個數(shù)據(jù)包的序列號,長度為8位,功能為標示其在一個數(shù)據(jù)組的前后順序,一組中第一個數(shù)據(jù)包的SEQ為0。
FLAG(標志):8位,各個位有不同的功能,DEF位表示一個組的最后一個包,ACK位代表確認包,F(xiàn)CF位代表流量控制標志,其余5位保留。
GROUP LENGTH/ACKERR H16:GROUP LENGTH表示一個組攜帶的數(shù)據(jù)總長度(不包括首部),以字節(jié)為單位,該字段長度為16位。ACKERR H16表示該字段對應位置在數(shù)據(jù)確認包首部中表示數(shù)據(jù)丟失掩碼的高16位。
PACKET LENGTH/ACKERR L16:PACKET LENGTH表示本數(shù)據(jù)包所攜帶的數(shù)據(jù)長度,以字節(jié)為單位,長度為16位,該字段大小不超過網(wǎng)絡的MTU與協(xié)議首部的長度差。ACKERR L16表示該字段對應位置在數(shù)據(jù)確認包中標示數(shù)據(jù)丟失掩碼的低16位。
CHANNEL(通道號):RLUDP通道號,長度為8位,通道號與應用層傳輸需求對應。
OPTION(選項):8位,保留。
ACKERR中各個二進制位對應一組中數(shù)據(jù)包的SEQ序列號,序列號為n的數(shù)據(jù)包對應ACKERR的第n位二進制位。本協(xié)議一組最大包個數(shù)為32個。
RLUDP使用通道(channel)的方式來滿足應用層的不同傳輸要求,即調(diào)制數(shù)據(jù)的發(fā)送功能占用一個通道,調(diào)制數(shù)據(jù)的接收功能占用一個通道,寄存器讀寫占用一個通道,通過該方式可實現(xiàn)RLUDP層的復用,各通道之間相互獨立,其功能與傳輸層的端口功能類似,在所有的通道中0號通道為特殊通道,用于維護PC與FPGA端的連接信息。針對點對點簡單通信環(huán)境,RLUDP并未使用類似于TCP的3次握手過程。當PC端啟動時,PC向FPGA發(fā)送連接詢問包,其首部中SEQ字段為0xFF,CHANNEL字段為0,其余字段也均為0。該通道用于探測FPGA端的協(xié)議棧是否處于活動狀態(tài),連接詢問包始終由PC發(fā)送,在空閑時段,每隔一定時間就發(fā)送該詢問包,F(xiàn)PGA返回的響應包僅僅將對應詢問包中的ACK置位。若PC收到響應包,則表示連接存在,若約定時間內(nèi)未收到響應包,則表示FPGA端未處于活動狀態(tài),PC端上位機釋放所有通道的緩存數(shù)據(jù),禁止所有數(shù)據(jù)的傳輸功能。此時,由用戶決定是否重連FPGA。
數(shù)據(jù)收發(fā)過程:發(fā)送端一次發(fā)送一組數(shù)據(jù)包 (n個包,ACK為0),等待ACK包(flag字段中ACK置1的包)。接收端在接收到一個包后檢查GROUP ID是否和之前的相同,若相同丟棄該包,若不相同則啟動定時器,如圖4(a)所示,若在規(guī)定時間段內(nèi)收到完整一組包,則向發(fā)送端發(fā)送ACK包,ACK ERR字段為全零,圖 4(b)中規(guī)定時間內(nèi)未收到完整一組包返回ACK包并在ACKERR中指明丟失包的序號。由于SEQ指明了數(shù)據(jù)包在一組的序號,所以即使發(fā)生亂序也能將順序糾正,n值的選取直接影響了發(fā)送的速率,n值越大,應答的效率越高,等價傳輸?shù)乃俾示驮娇?,然而對于FPGA而言卻需要更大的緩沖區(qū)。
如圖 4(c)所示,若在接收完一組包后緩沖區(qū)大小小于設定值,則將返回的ACK包flag標志中FCF置位,PC端對應通道停止發(fā)送數(shù)據(jù)包,處于等待狀態(tài)。直到FPGA緩沖區(qū)大小大于設定值后發(fā)送該組ACK包,F(xiàn)CF復位。
在PC端,通道號與應用層數(shù)據(jù)傳輸功能進行了綁定,每個數(shù)據(jù)傳輸功能均由一個線程來完成。應用層數(shù)據(jù)傳輸需求包括3個線程,數(shù)據(jù)下行線程,數(shù)據(jù)上行線程,寄存器配置線程。RLUDP協(xié)議實現(xiàn)包括兩個線程:RS(Receive and Store)線程,RLU(Reliable UDP)線程。RS線程位于RLUDP的最底層,該線程主要負責數(shù)據(jù)包的接收工作,區(qū)分ACK包 (Flag中ACK置位)和DATA包(Flag中ACK復位)以及連接響應包(CHANNEL為0),ACK包和DATA包存放于相應的包隊列中,同時向RLU線程發(fā)送數(shù)據(jù)包到來的消息。RLU線程是RLUDP的核心線程,該線程工作于消息驅(qū)動模式,功能包括RLUDP協(xié)議主要部分:通道復用,通道分用,流量控制,數(shù)據(jù)發(fā)送,數(shù)據(jù)接收。
單個通道通過狀態(tài)機的模式來嚴格控制數(shù)據(jù)傳輸,其狀態(tài)機如圖5所示。其中有 4個狀態(tài) net idle,recv wait,ack wait,flow wait。
圖4 可靠UDP發(fā)送過程
圖5 可靠UDP程序狀態(tài)機
其中各個轉(zhuǎn)換條件為:c1表示一組中所有包接收完畢,c2表示收到一組中一個包,c3表示包發(fā)送完畢,c4表示接收到ACK包(FCF=0),c5表示接收到ACK包(FCF=1)。每個通道(0號除外)的初始狀態(tài)為net idle,當應用層的某個線程要發(fā)送一組數(shù)據(jù)時,就將數(shù)據(jù)存入該線程對應通道的RLUDP類對象的數(shù)據(jù)緩沖區(qū)中,并通知RLU線程,發(fā)送該組數(shù)據(jù)。此時若該通道的RLU狀態(tài)為net idle那么就將該組數(shù)據(jù)的各個數(shù)據(jù)包加上RLU的協(xié)議首部,發(fā)送一組數(shù)據(jù),接著就將RLU狀態(tài)置為ack wait狀態(tài),等待ACK包的到來。若收到了ACK包,就檢查是否無數(shù)據(jù)包丟失,若無丟失就向應用層相應的線程發(fā)送消息,通知應用層該組數(shù)據(jù)已經(jīng)發(fā)送成功,同時將RLU狀態(tài)置為net idle狀態(tài)。若有數(shù)據(jù)包丟失就發(fā)送丟失的數(shù)據(jù)包,直到收到ACK包指示無數(shù)據(jù)丟失為止,應用層要接收數(shù)據(jù)時,向FPGA應用層發(fā)送通知包,該通道處于net idle狀態(tài),接收到數(shù)據(jù)包后轉(zhuǎn)換為recv wait狀態(tài)接收完一組包后就轉(zhuǎn)換為net idle狀態(tài)。
當FPGA內(nèi)存剩余空間大小小于指定閾值時,將RLUDP的ACK確認包首部的FCF字段置一,PC端接收到該ACK包就將相應的通道RLU狀態(tài)置為flow wait狀態(tài),此時應用層線程阻塞在消息等待處,就不會繼續(xù)發(fā)送下一組數(shù)據(jù)。當FPGA的內(nèi)存空間大于閾值時就再次發(fā)送ACK數(shù)據(jù)包并清除相應的FCF標志,此時PC收到該ACK包后就將向應用層線程發(fā)送該組數(shù)據(jù)發(fā)送完成的消息,應用層可繼續(xù)發(fā)送下一組數(shù)據(jù),同時RLU狀態(tài)置為net idle。
本協(xié)議棧的傳輸層及以下各協(xié)議根據(jù)uIP和LwIP協(xié)議改寫。uIP和LwIP是瑞典計算機科學院的AdamDunkels等開發(fā)嵌入式TCP/IP協(xié)議棧,uIP協(xié)議棧針對嵌入式系統(tǒng)資源有限的特點保留了網(wǎng)絡通訊必須的協(xié)議[11]。LwIP的主要目的是在保持 TCP/IP協(xié)議主要功能的情況下減少對 RAM的使用[12-13]。在MicroBlaze處理器的主頻限制下,LwIP其他功能會占用大量的時間,從而導致數(shù)傳的時間片有限,無法保證較高的傳輸速率。
針對高速數(shù)傳需求,本協(xié)議在uIP的基礎上,保留了ARP,IP,ICMP,UDP,在UDP之上架設一層可靠UDP協(xié)議。采用LwIP的協(xié)議棧內(nèi)存管理模型,在內(nèi)存中申請一片緩沖池,使用隊列方式來對內(nèi)存進行管理,提供內(nèi)存的申請釋放API。MicroBlzae系統(tǒng)采用Xilinx XPS環(huán)境開發(fā)[14],軟件開發(fā)環(huán)境為EDK[15],協(xié)議棧各層的設計如下:
1)網(wǎng)絡接口層:使用了FPGA的DMA模式下MAC IP核,在協(xié)議棧初始化階段將自定義的內(nèi)存區(qū)指針交給DMA,在MAC IP核中由DMA對該內(nèi)存區(qū)進行操作,數(shù)據(jù)發(fā)送操作也是向DMA傳遞指針。2)ARP協(xié)議:接收操作對底層接收的數(shù)據(jù)包進行解析,只對廣播包機地址為本機的包進行處理,發(fā)送操作在初始化階段發(fā)送ARP請求,并執(zhí)行退避算法,在已存在目標IP映射的情況下,填充MAC地址,以太網(wǎng)協(xié)議類型字段0x8000。3)IP協(xié)議:接收操作對底層接收的數(shù)據(jù)包長度,校驗和,及協(xié)議等字段進行解析,只處理合法的UDP和ICMP包;發(fā)送操作完成IP首部各字段填充。4)ICMP協(xié)議:對收到的ECHO請求包進行應答。5)UDP協(xié)議:接收操作對端口號進行解析,處理端口匹配的數(shù)據(jù)包,發(fā)送操作對UDP首部進行填充。
系統(tǒng)性能測試主要為數(shù)據(jù)速率的測試,運行MicroBlaze,主頻配置為最大值100 MHz。性能測試分為兩個方向:PC到FPGA,發(fā)送116 MB的文件,F(xiàn)PGA只進行接收操作,測試不同的n值(一組包中包的個數(shù))對速率的影響,以及其他一些簡單的功能測試。進行測試時,首先在PC端進行ping的測試如圖6所示,PC端可成功ping通FPGA,用WireShark抓包軟件可看到ping相關的ARP包,ICMP包,接著進行功能復用測試,在發(fā)送調(diào)制數(shù)據(jù)的同時對寄存器進行讀寫操作,可成功配置寄存器,觀察LED可看到配置的寄存器值。
圖6 WireShark抓取的ICMP包
速率測試,改變n值測試文件傳輸時間,得出傳輸速率,n值對應速率測試結果如表1所示。從表中可以看出n值越大速率越高。
表1 速率測試結果
經(jīng)過改寫后的TCP/IP協(xié)議棧加上RLUDP協(xié)議可完成丟包環(huán)境下的數(shù)據(jù)傳輸,該通信處理器應用于SOPC環(huán)境下的測控通信數(shù)據(jù)傳輸,通過接收確認方式完成了高速通信數(shù)據(jù)的傳輸功能。上位機采用多線程方式,通過多通道的方法完成了FPGA[16-17]下位機多功能復用。文中的流量控制方法很好的解決了CPU在內(nèi)存資源有限的條件下,對數(shù)據(jù)傳輸速率的動態(tài)控制問題,目前該接口已應用于相關的測控通信系統(tǒng),運行狀態(tài)穩(wěn)定可靠,速率高,達到了系統(tǒng)設計需求。
[1]高一沅,黃春暉.基于MicroBlaze的以太網(wǎng)通信系統(tǒng)平臺設計的研究[J].現(xiàn)代電子技術,2007(17):29-31.
[2]薛昊,佘勇,姚振東,等.基于MicroBlaze和DM9000A的以太網(wǎng)接口設計[J].通信技術,2013(2):32-34.
[3]何賓.基于AXI4的可編程SOC系統(tǒng)設計[M].北京:清華大學出版社,2011.
[4]Xilinx Inc.MicroBlaze Processor Reference Guide[EB/OL].http: //www.xilinx.com/support/documentation/sw_manuals/xilinx14_ 3/mb_ref_guide.pdf
[5]Xilinx Inc.LogiCORE IP AXI Timer v1.03a[EB/OL](2012). http://www.xilinx.com.
[6]Xilinx Inc.LogiCORE IP AXI Ethernet v3.01a[EB/OL](2012).http://www.xilinx.com/support/documentation/ip_documentation/axi_ethernet/v3_01_a/ds759_axi_ethernet.pdf.
[7]Xilinx Inc.LogiCORE IP AXI DMA v6.02a[EB/OL](2012). http://www.xilinx.com.
[8]Xilinx Inc.LogiCORE IP AXI GPIO v1.01.b[EB/OL](2012). http://www.xilinx.com.
[9]孫鑫.VC++深入詳解[M].北京:電子工業(yè)出版社,2013.
[10]W.Richard Stevens TCP/IP詳解卷1:協(xié)議[M].范建華,胥光輝,等譯.北京:機械工業(yè)出版社,2014.
[11]Dunkels A.uIP-A Free Small TCP/IP Stack[EB/OL].(2002-01-15).http://www.sics.se/adam/uip.
[12]Dunkels A.Design an implementation of the LwIP TCP/IP Stack[EB/OL].http://www.sics.se/adam/lwip.
[13]張燕芳,沈麗.基于Xilinx Spartan-3E和LwIP協(xié)議的以太網(wǎng)通訊[J].核電子學與探測技術,2013(5):540-543.
[14]Xilinx Inc.EDK Profiling User Guide[EB/OL](2012).http:// www.xilinx.com.
[15]Xilinx Inc.OS and Libraries Document Collection[EB/OL](2013).http://www.xilinx.com.
[16]李威,翟社平.模擬路標識別及其FPGA實現(xiàn)[J].電子科技,2016(2):45-47.
[17]黨俊博,李哲,李雅俊.基于FPGA的串口通信電路設計與實現(xiàn)[J].電子科技,2016(7):106-109.
Design of reliable network interface based on MicroBlaze
HOU Hong-jie1,2,WANG Zhu-gang1
(1.National Space Science Center,Chinese Academy of Sciences,Beijing 100190,China;2.University of Chinese Academy of Sciences,Beijing 100190,China)
Microblaze is a kind of soft-core SOPC designed by Xilinx.It is a 32-bit soft-core embedded processor that consist of FPGA logic units.In order to achieve high-rate data transmission from FPGA to computer,a reliable UDP(RLUDP)protocol is proposed in this paper based on uIP and LwIP network protocol stacks.This paper introduces the design and implement of embedded TCP/IP protocol stacks,and illustrates the high-rate data transmission between PC and MicroBlaze according to the proposed protocol.Simple test on system performance is described,which shows that the designed system meets the design requirement.
MicroBlaze;SOPC;reliable UDP;Embeded TCP/IP
TN925
A
1674-6236(2016)21-0105-04
2015-11-12稿件編號:201511117
侯鴻杰(1991—),男,四川宜賓人,碩士研究生。研究方向:時間馴服與時間同步,嵌入式技術。