在各種不同的場(chǎng)合中,人們需要將大批數(shù)據(jù)從一個(gè)設(shè)備無(wú)差錯(cuò)地傳輸?shù)搅硪粋€(gè)設(shè)備上。對(duì)于設(shè)備間距離較近的場(chǎng)合,可以選擇PCIE(典型距離是15~30 cm)或者USB(最長(zhǎng)傳輸距離5 m)等接口。而對(duì)于距離較遠(yuǎn)的場(chǎng)合,可以選擇RS232、RS485、以太網(wǎng)等傳輸介質(zhì),并在此基礎(chǔ)上,通過(guò)上層協(xié)議來(lái)保證數(shù)據(jù)的可靠性。上層協(xié)議通常用檢錯(cuò)重傳機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)的可靠傳輸,如TFTP、TCP/IP、SCTP以及可靠UDP等。這些協(xié)議都必須依靠較為復(fù)雜的CPU運(yùn)算和內(nèi)存拷貝來(lái)實(shí)現(xiàn)數(shù)據(jù)可靠傳輸?shù)墓δ?。比如?a href="http://ttokpm.com/v/tag/538/" target="_blank">Linux下,TCP/IP協(xié)議每發(fā)送一個(gè)數(shù)據(jù)包,CPU需要執(zhí)行約14 000條指令[1]。因此CPU的工作頻率、內(nèi)存的讀寫速度、硬件I/O帶寬都會(huì)影響TCP/IP的速度。一些嵌入式系統(tǒng)上TCP性能測(cè)試如表1所示。
CPU處理能力越強(qiáng),TCP傳輸速度越高。與此同時(shí),在最大傳輸單元為9 000 B時(shí)(即相對(duì)MTU1 500包長(zhǎng)度增加6倍,包處理頻度下降6倍),則傳輸速度大幅提高。這也從側(cè)面說(shuō)明了CPU處理能力對(duì)TCP傳輸速度的影響。
在點(diǎn)對(duì)點(diǎn)傳輸和局域網(wǎng)傳輸中,往往不需要完善的路由機(jī)制和流量控制,但同樣需要一種可靠的數(shù)據(jù)傳輸手段。傳統(tǒng)的TCP協(xié)議依賴CPU運(yùn)算的特性,使得傳輸速度受到限制,并且受CPU負(fù)荷變化影響而速率不穩(wěn)定[2]。從提高傳輸效率和減輕對(duì)CPU的依賴兩方面考慮,提出一種基于硬件實(shí)現(xiàn)的高速可靠數(shù)據(jù)傳輸方法,將CPU從頻繁的協(xié)議運(yùn)算中解放出來(lái)。該方法可以在千兆以太網(wǎng)PHY所提供的物理層通信鏈路的基礎(chǔ)上,通過(guò)編寫FPGA邏輯,在硬件上實(shí)現(xiàn)可靠數(shù)據(jù)傳輸?shù)膮f(xié)議,然后使用如PCIE這樣的接口將數(shù)據(jù)提供給計(jì)算機(jī)系統(tǒng)。系統(tǒng)結(jié)構(gòu)如圖1所示。
1 選擇重發(fā)機(jī)制提供可靠數(shù)據(jù)傳輸保證
數(shù)據(jù)傳輸過(guò)程中的可靠性有多種方式,如糾錯(cuò)碼、信息反饋和檢錯(cuò)重發(fā)機(jī)制。選擇重發(fā)是檢錯(cuò)重發(fā)的實(shí)現(xiàn)方法之一,相對(duì)于等待重發(fā)和退回重發(fā),它具有高效率的特點(diǎn),因而被廣泛采用。比如在TCP/IP網(wǎng)絡(luò)中,就是用檢錯(cuò)重發(fā)機(jī)制的原理。但TCP協(xié)議中包括較為復(fù)雜的流量控制機(jī)制和擁塞控制機(jī)制,它們被設(shè)計(jì)來(lái)應(yīng)對(duì)異構(gòu)的、大范圍的復(fù)雜網(wǎng)絡(luò)環(huán)境。而在點(diǎn)對(duì)點(diǎn)傳輸?shù)膽?yīng)用中,或者在任務(wù)明確、拓?fù)浜?jiǎn)單的局域網(wǎng)中,不需要復(fù)雜的路由機(jī)制和流量控制,因而可以簡(jiǎn)化被廣泛使用的檢錯(cuò)重傳機(jī)制,使得可靠性協(xié)議可以通過(guò)硬件實(shí)現(xiàn)?!∪鐖D2所示,將數(shù)據(jù)可靠傳輸?shù)倪^(guò)程概括如下:
(1)待發(fā)送的數(shù)據(jù)在發(fā)送端打包,加上必要的識(shí)別信息和校驗(yàn)信息,存入發(fā)送端的緩存;
(2)待以太網(wǎng)信道可用之后將數(shù)據(jù)包通過(guò)千兆以太網(wǎng)發(fā)送給接收方;
(3)接收方收到數(shù)據(jù)包之后對(duì)內(nèi)容進(jìn)行校驗(yàn),確認(rèn)數(shù)據(jù)無(wú)誤之后將識(shí)別信息通過(guò)ACK數(shù)據(jù)包反饋給發(fā)送方;
(4)發(fā)送方的緩存接收識(shí)別信息后確認(rèn)數(shù)據(jù)已安全抵達(dá)接收方,清空緩存等待發(fā)送下一個(gè)數(shù)據(jù)包;
(5)發(fā)送方在設(shè)定的時(shí)間內(nèi)沒(méi)有接收到帶有相應(yīng)識(shí)別信息的ACK反饋,則進(jìn)行重新發(fā)送,重發(fā)超過(guò)一定次數(shù)則報(bào)錯(cuò)。
校驗(yàn)信息選擇使用和以太網(wǎng)兼容的CRC32,編碼冗余度較低(為0.26%)??梢灶A(yù)見(jiàn),在一般的誤碼率情況下(1×10-10),該方法可以實(shí)現(xiàn)高速的可靠傳輸[4]。
2 可靠數(shù)據(jù)傳輸?shù)挠布?shí)現(xiàn)
用硬件的方式實(shí)現(xiàn)所述的可靠傳輸,將會(huì)極大地降低對(duì)發(fā)送方和接收方在協(xié)議運(yùn)算上對(duì)CPU資源的依賴,這點(diǎn)與TCP協(xié)議大為不同。 如圖3所示,相較于TCP協(xié)議,硬件協(xié)議在接收數(shù)據(jù)時(shí)數(shù)據(jù)流大大簡(jiǎn)化。
TCP協(xié)議的數(shù)據(jù)流:
(1)網(wǎng)卡接收以太網(wǎng)數(shù)據(jù)通過(guò)PCIE以DMA的方式寫入上位機(jī)內(nèi)存,并觸發(fā)中斷;
(2)網(wǎng)絡(luò)包內(nèi)存拷貝進(jìn)入OS協(xié)議層;
(3)對(duì)網(wǎng)絡(luò)包的協(xié)議運(yùn)算,檢查包頭信息和CRC校驗(yàn)等;
(4)確定無(wú)誤后發(fā)送ACK包;
(5)將有效數(shù)據(jù)提供給上層用戶。
硬件協(xié)議的數(shù)據(jù)流:
(1)設(shè)備卡FPGA檢驗(yàn)數(shù)據(jù)正確性自發(fā)產(chǎn)生ACK回應(yīng)包,將有效數(shù)據(jù)通過(guò)PCIE以DMA的方式寫入上位機(jī)內(nèi)存,可選擇觸發(fā)中斷或輪詢;
(2)驅(qū)動(dòng)層直接將數(shù)據(jù)提供給用戶。
發(fā)送過(guò)程與接收過(guò)程相反,情況類似,不再贅述??梢?jiàn),利用FPGA實(shí)現(xiàn)的硬件協(xié)議省去了上位機(jī)軟件協(xié)議運(yùn)算和內(nèi)存拷貝,直接將有效數(shù)據(jù)提供給上層用戶,提高了數(shù)據(jù)傳輸?shù)男屎退俣?,極大地減輕了CPU運(yùn)算負(fù)荷,省去了對(duì)CPU的頻繁中斷,從而獲得不依賴于CPU性能的穩(wěn)定高速的可靠數(shù)據(jù)傳輸。這點(diǎn)是軟件協(xié)議優(yōu)化難以實(shí)現(xiàn)的。
2.1 硬件平臺(tái)設(shè)計(jì)
PCIE接口設(shè)備卡,搭載Xilinx Spartan 6 FPGA和Broadcom千兆以太網(wǎng)PHY芯片。FPGA是設(shè)備的核心。在FPGA上部署PCIE接口模塊和Ethernet接口模塊,并設(shè)計(jì)內(nèi)部邏輯實(shí)現(xiàn)數(shù)據(jù)的可靠傳輸。
2.2 FPGA邏輯模塊的設(shè)計(jì)
FPGA的邏輯設(shè)計(jì)需要保證數(shù)據(jù)流的順暢,各個(gè)模塊的互聯(lián)。采用硬件算法,實(shí)現(xiàn)對(duì)數(shù)據(jù)的分組打包和節(jié)點(diǎn)間的應(yīng)答握手機(jī)制,保證每個(gè)數(shù)據(jù)包正確無(wú)誤地抵達(dá)目標(biāo)設(shè)備。FPGA內(nèi)部的邏輯結(jié)構(gòu)如圖4所示,其中對(duì)于數(shù)據(jù)的可靠傳輸是在Tx和Rx模塊中的狀態(tài)機(jī)控制下實(shí)現(xiàn)的,Ethernet模塊為Xilinx的TriMode Ethernet MAC Core,提供了對(duì)各種速率(10/100/1 000 M)的以太網(wǎng)PHY的支持。位于邏輯核心區(qū)域的InterConnect模塊為多個(gè)端口之間提供了可動(dòng)態(tài)配置的互聯(lián),因而為可能的網(wǎng)絡(luò)拓?fù)涮峁┲С?。PCIE模塊為上位機(jī)提供了訪問(wèn)FPGA 的數(shù)據(jù)和命令通道。
FPGA各個(gè)模塊的說(shuō)明:
(1)PCIE,使用Xilinx的s6_pcie:2.4 Logic Core[5]。開(kāi)辟兩個(gè)用戶地址空間,一個(gè)用于訪問(wèn)內(nèi)部狀態(tài)控制寄存器,另一個(gè)用于訪問(wèn)FPGA數(shù)據(jù)。
(2)InterConnect,在內(nèi)部寄存器的控制下,將各個(gè)Ethernet端口和上位機(jī)數(shù)據(jù)端口按照一定的規(guī)則互聯(lián)起來(lái),可以做到指定端口之間的轉(zhuǎn)發(fā)和特定端口的收發(fā)操作。并且在verilog編碼中采用參數(shù)化的風(fēng)格,方便多端口的擴(kuò)展。這樣,在上位機(jī)控制軟件的配合下,可以實(shí)現(xiàn)多個(gè)端口之間的靈活轉(zhuǎn)發(fā),因而可以方便地組建數(shù)據(jù)傳輸網(wǎng)絡(luò)。InterConnect數(shù)據(jù)位寬可靈活配置,對(duì)于千兆網(wǎng)應(yīng)用可配置為16位寬。該模塊包括FPGA內(nèi)部其他模塊,時(shí)鐘頻率為75 MHz。
(3)Tx模塊,其他端口的轉(zhuǎn)發(fā)數(shù)據(jù)或者上位機(jī)的發(fā)送數(shù)據(jù)經(jīng)由InterConnect傳送到Tx模塊中,在Tx模塊的邏輯調(diào)度下以數(shù)據(jù)包為單位暫存在某一個(gè)Buffer中。每個(gè)Buffer都有獨(dú)立的狀態(tài)機(jī)控制。數(shù)據(jù)包在Buffer中準(zhǔn)備好之后會(huì)在Tx模塊的邏輯調(diào)度下發(fā)送至Ethernet模塊,相應(yīng)的Buffer狀態(tài)機(jī)處于等待ACK的狀態(tài)。在計(jì)數(shù)器超時(shí)后觸發(fā)重傳,重傳一定次數(shù)依然沒(méi)有正確ACK回應(yīng)則報(bào)錯(cuò)。每個(gè)Tx模塊中可以參數(shù)化地配置多個(gè)Buffer,通過(guò)多個(gè)Buffer的協(xié)作可以極大地提高信道利用效率。
(4)Rx模塊,內(nèi)部邏輯維護(hù)一個(gè)類似FIFO的存儲(chǔ)結(jié)構(gòu)。每當(dāng)接收一個(gè)數(shù)據(jù)幀時(shí),通過(guò)累加寫指針將數(shù)據(jù)暫存入RAM中,并在狀態(tài)機(jī)控制下記錄當(dāng)前幀的目的/源地址、幀類型,序號(hào)等信息。如果是ACK幀則把相應(yīng)的幀識(shí)別信息傳遞給Tx模塊;如果是需要接收的幀則在幀接收完后指示存儲(chǔ)器數(shù)據(jù)有效,數(shù)據(jù)有效信號(hào)將促使待轉(zhuǎn)發(fā)模塊或者CPU接收FIFO讀取該幀。Rx和Tx的以太網(wǎng)端口數(shù)據(jù)位寬為8位,接口時(shí)鐘頻率為125 MHz。
(5)Ethernet模塊,使用Xilinx的tri_mode_eth_mac:4.6 Logic Core[6]。該模塊提供CRC32編碼和校驗(yàn)功能,提供對(duì)不同速率以太網(wǎng)的支持,并且對(duì)內(nèi)部邏輯提供統(tǒng)一的數(shù)據(jù)接口。3 系統(tǒng)性能測(cè)試為了盡可能完善地測(cè)試系統(tǒng)性能,從邏輯仿真和實(shí)測(cè)兩方面進(jìn)行測(cè)試。
3.1 邏輯仿真測(cè)試
邏輯仿真是利用Xilinx ISim仿真器對(duì)FPGA邏輯的行為進(jìn)行仿真預(yù)測(cè)。
仿真測(cè)試的優(yōu)點(diǎn)是測(cè)試準(zhǔn)備簡(jiǎn)單,測(cè)試方法靈活;缺點(diǎn)是只能仿真FPGA邏輯部分,無(wú)法仿真其他硬件。
考慮到本數(shù)據(jù)傳輸系統(tǒng)的核心在FGPA上,并通過(guò)與實(shí)測(cè)數(shù)據(jù)比對(duì),邏輯仿真可以在很大程度上真實(shí)反映系統(tǒng)性能。測(cè)試的是兩個(gè)節(jié)點(diǎn)之間的點(diǎn)對(duì)點(diǎn)傳輸。
(1)固定幀長(zhǎng)1 024 B測(cè)試結(jié)果:帶寬利用效率為96.4%,數(shù)據(jù)傳輸速度為120.5 MB/s。
(2)隨機(jī)幀長(zhǎng)測(cè)試結(jié)果:數(shù)據(jù)傳輸速度為99.4 MB/s,帶寬利用效率為79.5%。
仿真波形如圖5所示,rgmii_txen_A信號(hào)表明在這種情況下信道利用出現(xiàn)間隙。這是由于幀長(zhǎng)度突然變長(zhǎng),需要等待內(nèi)部數(shù)據(jù)寫入Buffer。這種特殊情況可以通過(guò)增加Tx_buffer的數(shù)量來(lái)解決。
(3)人為添加誤碼測(cè)試結(jié)果:數(shù)據(jù)傳輸速度為106.7 MB/s,帶寬利用效率為85.3%。
測(cè)試幀長(zhǎng)度為1 024 B,設(shè)定FPGA在發(fā)送端口隨機(jī)添加誤碼,測(cè)試添加誤碼率為0.000 76%。一般情況下誤碼率很低(平均一個(gè)誤碼造成一個(gè)數(shù)據(jù)包重傳)。單次誤碼造成的等待和重傳開(kāi)銷是一定的,因而傳輸速度的變化值與誤碼率的關(guān)系可以近似看成正比關(guān)系(?駐x:傳輸速率比變化;?駐e:誤碼率):?駐x=k?駐e。
測(cè)試時(shí),人為添加誤碼率?駐e=0.000 76%,?駐x=-13.8 MB/s,求得k=-1.82×106 MB/s。由此估計(jì),在一般情況下(即誤碼率為1×10-10),傳輸速度變化?駐x=-1.82 106 MB/s×10-10,為-18.2 KB/s,傳輸帶寬仍接近120.5 MB/s。
3.2實(shí)際傳輸測(cè)試
測(cè)試兩個(gè)節(jié)點(diǎn)間點(diǎn)對(duì)點(diǎn)傳輸,需要兩個(gè)數(shù)據(jù)節(jié)點(diǎn)。節(jié)點(diǎn)A產(chǎn)生測(cè)試數(shù)據(jù),節(jié)點(diǎn)B接收、校驗(yàn)測(cè)試數(shù)據(jù),并通過(guò)PCIE以DMA方式發(fā)送到PC端。通過(guò)PC端軟件檢查并統(tǒng)計(jì)100 s傳輸數(shù)據(jù),接收11 742 592幀,共計(jì)12.024 GB數(shù)據(jù)。測(cè)試結(jié)果:數(shù)據(jù)傳輸速度為120.2 MB/s;帶寬利用效率為96.2%,與仿真結(jié)果(96.4%)基本持平。
3.3 結(jié)論
根據(jù)測(cè)試結(jié)果,該硬件協(xié)議可以有效地進(jìn)行可靠數(shù)據(jù)傳輸。在實(shí)際測(cè)試情況和可以預(yù)計(jì)的誤碼率情況下,順序傳輸大塊數(shù)據(jù)的傳輸速度可達(dá)到千兆以太網(wǎng)極限帶寬125 MB/s的96%,即120 MB/s。這個(gè)數(shù)據(jù)與TCP協(xié)議在MTU 9 000超長(zhǎng)幀設(shè)定下的PowerPC405系統(tǒng)上的表現(xiàn)基本持平(平均考慮收和發(fā)),而遠(yuǎn)高于MTU 1 500設(shè)定下的表現(xiàn)。TCP協(xié)議在低處理頻度下可換來(lái)更高的速度,這說(shuō)明軟件協(xié)議的傳輸速度受CPU運(yùn)算影響大,易產(chǎn)生波動(dòng)。穩(wěn)定的高數(shù)據(jù)率則是硬件協(xié)議的優(yōu)點(diǎn)所在。
? ? ? ? 數(shù)據(jù)的可靠傳輸是一個(gè)具有普遍意義的話題。本文所闡述的在現(xiàn)有成熟以太網(wǎng)技術(shù)基礎(chǔ)上,利用FPGA硬件實(shí)現(xiàn)數(shù)據(jù)的高速、可靠的傳輸。相較于復(fù)雜的TCP軟件協(xié)議,使用硬件協(xié)議能夠有效降低CPU負(fù)荷,并因此得到穩(wěn)定的高速數(shù)據(jù)傳輸速率。本文所述的硬件平臺(tái)支持多個(gè)以太網(wǎng)端口的擴(kuò)展。節(jié)點(diǎn)內(nèi)端口之間的可配置轉(zhuǎn)發(fā)功能在板載MCU的控制下可實(shí)現(xiàn)靈活路由。這樣多個(gè)節(jié)點(diǎn)可以組成數(shù)據(jù)傳輸網(wǎng)絡(luò),因而為諸如高速數(shù)據(jù)采集網(wǎng)絡(luò)、局域網(wǎng)傳輸?shù)染W(wǎng)絡(luò)應(yīng)用提供了可行方案。
評(píng)論
查看更多