摘 要 本文使用WinPcap自定通信幀格式,實現(xiàn)一種PC機和FPGA之間雙向高速數(shù)據(jù)傳輸方法,繞過了TCP協(xié)議和IP協(xié)議,只涉及到鏈路層和物理層,降低了FPGA端的協(xié)議解析復(fù)雜度、減少拆包時間和時延,并且突發(fā)速率達到100Mbit/s。通信接口協(xié)議采用類似802.3協(xié)議的幀格式。
關(guān)鍵詞 802.3 RMII(簡化的獨立媒體接口) FPGA 高速傳輸
1 前言
近年來,F(xiàn)PGA(Field Programable GateArray,現(xiàn)場可編程門陣列)在通信領(lǐng)域的應(yīng)用越來越廣泛,F(xiàn)PGA運行速度快,容易實現(xiàn)大規(guī)模系統(tǒng),內(nèi)部程序并行運行,但進行高精度復(fù)雜運算處理是FPGA的劣勢,同時由于計算機具有強大的運算和處理能力,可以將高精度復(fù)雜運算由PC機完成后再交由FPGA完成其他工作。例如可在PC機上完成對移動情況下無線信道的建模,提取誤碼參數(shù),通過PC機網(wǎng)口發(fā)送到FPGA硬件平臺上,進行誤碼加載,從而實現(xiàn)實時無線信道模擬。
2 WinPcap簡介
WinPcap由一系列的驅(qū)動程序組成,在Windows環(huán)境下工作在鏈路層,使應(yīng)用程序能捕獲和發(fā)送數(shù)據(jù)包。它提供了以下的各項功能:
· 捕獲原始數(shù)據(jù)包,包括在共享網(wǎng)絡(luò)上各主機發(fā)送/接收的以及相互之間交換的數(shù)據(jù)包;
· 在數(shù)據(jù)包發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)包過濾掉;
· 在網(wǎng)絡(luò)上發(fā)送原始的數(shù)據(jù)包;
· 收集網(wǎng)絡(luò)通信過程中的統(tǒng)計信息。
由于WinPcap的主要功能在于獨立于主機協(xié)議(如TCP/IP)來發(fā)送和接收原始數(shù)據(jù)包。即,WinPcap不能阻塞、過濾或控制其他應(yīng)用程序數(shù)據(jù)包的發(fā)收,它僅僅只是監(jiān)聽共享網(wǎng)絡(luò)上傳送的數(shù)據(jù)包。
本設(shè)計中三個功能用到WinPcap所提供的3個函數(shù):
(1)打開網(wǎng)卡,并設(shè)置設(shè)置網(wǎng)卡為混雜(promiscuous)模式,采用函數(shù):
pcap_open_live(dev, // name of the device
65536, // portion of the packet to capture.
1, // promiscuous mode
1000, // read timeout
Errbuf // error buffer
。 == NULL)
(2)發(fā)送數(shù)據(jù)包,采用函數(shù):
pcap_sendpacket(g_dev, packet_send, sizeof(packet_send))
(3)從一個網(wǎng)絡(luò)接口讀取一個數(shù)據(jù)包。數(shù)據(jù)包被正確讀取返回1,采用函數(shù):
pcap_next_ex(pcap_t* p,struct pcap_pkthdr* pkt_header,const u_char* pkt_data )
利用WinPcap驅(qū)動程序編程發(fā)出的數(shù)據(jù)包將不會含有IP頭和TCP頭,只含有MAC地址和數(shù)據(jù),簡化了硬件上的數(shù)據(jù)幀格式解析。
本設(shè)計中PC機網(wǎng)口所發(fā)出數(shù)據(jù)包如圖1所示。
其中前6個字節(jié)0a0a0a0a0a0a為目的地址,060606060606為源地址,003c為長度,后面為數(shù)據(jù)。
3 通信數(shù)據(jù)幀的格式
若PC機端使用普通的網(wǎng)口編程方法,會帶有IP頭和TCP頭等,給FPGA端拆包、協(xié)議解析帶來復(fù)雜度。為此采用WinPcap驅(qū)動編程,實現(xiàn)FPGA與PC網(wǎng)口之間的自定義數(shù)據(jù)幀格式,使FPGA端接收到的數(shù)據(jù)幀格式為類似802.3協(xié)議的以太網(wǎng)數(shù)據(jù)包格式,不含有IP頭和TCP頭等協(xié)議開銷。
FPGA和PC機之間的數(shù)據(jù)傳輸格式采用類似802.3協(xié)議的以太網(wǎng)數(shù)據(jù)包格式,如圖2所示。
其中:前導(dǎo)碼7個字節(jié)均為(10101010)B,界定符為(10101011)B。幀校驗同標(biāo)準100Base-T幀的FCS域,內(nèi)容為32bit的CRC校驗值,校驗范圍包括目的地址、源地址、類型/長度、控制/信息數(shù)據(jù)4個字段。校驗多項式為:
G(x)
=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+1
對以太網(wǎng)進行CRC運算的數(shù)據(jù)是并行輸入的,要根據(jù)PC上(Windows 操作系統(tǒng)環(huán)境)數(shù)據(jù)的組織方式對余數(shù)進行調(diào)整,如果是Big Endian的組織方式則將余數(shù)按位取反得到CRC數(shù)據(jù),如果是Little Endian的數(shù)據(jù)組織方式則先要將余數(shù)進行位置互換,然后再按位取反。在本設(shè)計中是Big Endian的組織方式。
PC端收發(fā)網(wǎng)口數(shù)據(jù)時,前導(dǎo)碼、界定符、幀校驗3項由網(wǎng)卡自動處理,程序員不需自己考慮。若是FPGA端處理網(wǎng)口數(shù)據(jù),則要按以上完整幀格式處理。另外,根據(jù)802.3協(xié)議,為確保能夠檢測到?jīng)_突,從PC端網(wǎng)卡發(fā)出的數(shù)據(jù)包(不包含前導(dǎo)碼、界定符、幀校驗3項)長度需大于60個字節(jié),不足則需填充0。
4 方案實現(xiàn)及功能描述
本設(shè)計方案只涉及鏈路層和物理層兩層,其中PC端的鏈路層主要由WinPcap驅(qū)動程序完成,物理層由網(wǎng)卡完成,F(xiàn)PGA端的物理層則由外圍芯片RTL8208B完成,F(xiàn)PGA內(nèi)部完成鏈路層的功能。
總體框圖如圖3所示。
4.1 RMII 和RTL8208B簡介
RMII,即簡化的獨立媒體接口(Reduced Media Independent Interface);贛II的PHY中每個端口通過16個引腳連結(jié)到所帶來的花費很大,這在現(xiàn)代高密度芯片制造技術(shù)中顯得尤其突出。RMII對MII的引腳進行簡化,減少了芯片的尺寸。RMII 支持10Mbit/s和100Mbit/s的數(shù)據(jù)速率及全雙工操作,收發(fā)按同一時鐘工作,從而減少了時鐘引腳。RMII規(guī)定數(shù)據(jù)及控制通路工作于50MHz的頻率上,使得發(fā)送和接收數(shù)據(jù)通路從半比特元組減少到兩比特寬度。這樣形成的RMII接收信號如圖4所示。
(1)參考時鐘(REF_CLK)
接收、發(fā)送和控制的同步參考時鐘是由外部時鐘源提供的50MHz信號。
(2)載波偵聽/接收數(shù)據(jù)有效(CRS_DV )
CRS_DV是MII中的RXDV 和CRS(Carrier_Sense)兩個信號合并而成,當(dāng)介質(zhì)不空閑時CRS_DV以和REF_CLK相異步的方式給出。當(dāng)CRS比RX_DV早結(jié)束時(即載波消失而隊列中還有數(shù)據(jù)要傳輸時),就會出現(xiàn)CRS_ DV在半位元組的邊界以25MHz(在100MHz模式下)或2.5MHz(在10MHz模式下)的頻率在0、1之間來回切換。因此,MAC能夠從CRS_ DV中精確的恢復(fù)出RX_DV和CRS。
(3)接收數(shù)據(jù)(RDX<1:0>)
接收數(shù)據(jù)信號,以和REF_ CLK同步的方式恢復(fù)出來的兩位數(shù)據(jù)。
RTL8208B是高度集成的8端口的以太網(wǎng)收發(fā)器,提供8各獨立的信道,每個信道都可以設(shè)置為RMII/SMII/SS-SMII模式。設(shè)置為RMII模式的信號如圖5所示。
4.2 FPGA端設(shè)計及功能描述
本設(shè)計采用Xilinx公司的Spartan3系列XC3S1500芯片,基于VHDL硬件描述語言實現(xiàn)。XC3S1500是150萬門的FPGA芯片,內(nèi)部帶有208kbit的分布式RAM與576kbit的Block RAM。32個專用乘法器,4個DCM,其資源完全可以滿足需要。
其中FPGA中的接收模塊如圖6所示。
轉(zhuǎn)換字節(jié)模塊:是一個包含4個狀態(tài)的狀態(tài)機,4個狀態(tài)分別為:idle、precode、boundcode、recv。
功能如下:首先去掉7個字節(jié)的前導(dǎo)碼和一個字節(jié)的界定符;然后進入recv態(tài),將4次接收到的2比特數(shù)據(jù)組合成一個字節(jié)輸出,同時輸出一個高電平使能信號給拆包模塊。這里輸出的數(shù)據(jù)包含目的地址,源地址,數(shù)據(jù)長度,幀號,控制信息。
拆包模塊: 這是一個包含8個狀態(tài)的狀態(tài)機,8個狀態(tài)分別為idle,dst_addr,src_addr,len,frame_num,message,crc,frame_end。
圖7為FPGA接收時序圖。
功能如下:首先完成源地址和目的地址的解析,并開始CRC校驗,若地址正確則輸出數(shù)據(jù)寫使能信號,將后續(xù)的數(shù)據(jù)長度保存到長度寄存器,幀號保存到幀號寄存器,控制信息保存到雙口RAM。雙口RAM為8bit·2k,起到緩存數(shù)據(jù)的作用,實現(xiàn)上Xilinx提供了RAM的IP Core,使用的是FPGA內(nèi)的Block RAM資源。若CRC校驗正確則輸出加載使能信號給數(shù)據(jù)加載模塊。
發(fā)送過程是接收的逆過程,按以上自定義的數(shù)據(jù)幀格式封裝數(shù)據(jù),只是注意要將最后一字節(jié)的數(shù)據(jù)校驗完后把余數(shù)按位取反得到CRC數(shù)據(jù),這里不再贅述。
5 結(jié)束語
本設(shè)計用于一種信道模擬器系統(tǒng)中,實現(xiàn)了PC機和FPGA之間的雙向高速數(shù)據(jù)傳輸,突發(fā)速率達到100Mbit/s。網(wǎng)口作為PC機、嵌入式系統(tǒng)等的一個高速接口,與其他外設(shè)的數(shù)據(jù)傳輸設(shè)計尤為重要,特別是在僅要求高速數(shù)據(jù)傳輸而不進行組網(wǎng)等要求的時候,比如實時視頻數(shù)據(jù)采集處理、精密工業(yè)測量等,采用本設(shè)計方法可以減少分組包頭開銷、降低協(xié)議分析復(fù)雜度、減少時延。
由于本網(wǎng)頁不支持圖片與公式效果,如有需要請參閱雜志。
作者:盧明勇 黃聯(lián)芬 來源:中國新通信(原《中國數(shù)據(jù)通信》3月)