??? 摘? 要: 針對(duì)傳統(tǒng)微處理器平臺(tái)中存在的接口速率瓶頸問(wèn)題,提出了基于現(xiàn)場(chǎng)可編程門陣列(FPGA) 的以太網(wǎng)解包電路的硬件實(shí)現(xiàn)方法。主要介紹了接收數(shù)據(jù)幀的實(shí)現(xiàn)方法,該設(shè)計(jì)具有通用性好、可擴(kuò)展性強(qiáng)以及方便易行等優(yōu)點(diǎn), 為高速數(shù)據(jù)采集系統(tǒng)的網(wǎng)絡(luò)化提供了很好的解決方案。?
??? 關(guān)鍵詞: 解包; FPGA; 以太網(wǎng)
?
??? 傳統(tǒng)以PC為中心的互聯(lián)網(wǎng)應(yīng)用現(xiàn)已開(kāi)始轉(zhuǎn)向以嵌入式設(shè)備為中心。據(jù)網(wǎng)絡(luò)專家預(yù)測(cè),將來(lái)在互聯(lián)網(wǎng)上傳輸?shù)男畔⒅?有70%來(lái)自小型嵌入式系統(tǒng)。因此,對(duì)嵌入式系統(tǒng)接入Internet 網(wǎng)絡(luò)的研究是有必要的。?
??? 一般情況下,以太網(wǎng)卡用普通的MCU可以完成數(shù)據(jù)的接收/發(fā)送任務(wù)[1]。但當(dāng)系統(tǒng)中要求接收/發(fā)送的數(shù)據(jù)特別多時(shí),僅僅依靠普通MCU的資源往往難以完成任務(wù)。此時(shí)一般只能采取多MCU聯(lián)機(jī)處理模式,或者依靠其它芯片擴(kuò)展來(lái)完成任務(wù)。這樣不僅增加了大量的外部電路和系統(tǒng)成本,而且大大增加了系統(tǒng)的復(fù)雜性。?
??? 利用FPGA的I/O端口多,而且可以自由編程定義其功能的特點(diǎn),配以Verilog HDL編寫(xiě)的內(nèi)部執(zhí)行程序就可以完成其功能。代碼執(zhí)行是按照并行處理的,而且FPGA硬件的速度是ns級(jí)的,所以在高速的數(shù)據(jù)采集和接收的過(guò)程中具有重大意義。?
??? 本文根據(jù)IEEE 802.3數(shù)據(jù)幀格式在MII接口提供數(shù)據(jù)的情況下,利用FPGA設(shè)計(jì)完成整個(gè)數(shù)據(jù)包的接收過(guò)程。?
1 相關(guān)理論?
??? 以太網(wǎng)是在 20 世紀(jì) 70 年代研制開(kāi)發(fā)的一種基帶局域網(wǎng)技術(shù),使用同軸電纜作為網(wǎng)絡(luò)媒體,采用載波多路訪問(wèn)和沖突檢測(cè)(CSMA/CD)[2]機(jī)制,數(shù)據(jù)傳輸速率達(dá)到10Mb/s。但是如今以太網(wǎng)更多地被用來(lái)指各種采用CSMA/CD技術(shù)的局域網(wǎng)。以太網(wǎng)的幀格式與IP是一致的,特別適合于傳輸 IP 數(shù)據(jù)。?
1.1 以太網(wǎng)MAC子層協(xié)議?
??? IEEE 802協(xié)議標(biāo)準(zhǔn)系列中,數(shù)據(jù)鏈路層包括邏輯鏈路控制(LLC)子層和媒體訪問(wèn)控制(MAC) 子層。其中MAC位于LLC和物理層之間,它使LLC 適應(yīng)于不同的媒體訪問(wèn)技術(shù)和物理媒體。MAC單獨(dú)作為一個(gè)子層,就不會(huì)因?yàn)槊襟w訪問(wèn)方法的改變而影響較高層次的協(xié)議。MAC由數(shù)據(jù)拆裝和媒體訪問(wèn)管理兩個(gè)模塊組成,完成數(shù)據(jù)幀的封裝、解封、發(fā)送和接收功能。以太網(wǎng)數(shù)據(jù)幀封裝格式如圖1所示,其中目的地址、源地址、長(zhǎng)度/類型和數(shù)據(jù)4個(gè)字段由上一層協(xié)議模塊生成。傳送數(shù)據(jù)幀時(shí),數(shù)據(jù)封裝模塊自動(dòng)在待傳輸數(shù)據(jù)前面添加7個(gè)字節(jié)的前導(dǎo)碼和1個(gè)字節(jié)的定界符,并在數(shù)據(jù)傳送結(jié)束時(shí)加發(fā)4個(gè)字節(jié)的循環(huán)冗余校驗(yàn)碼,如果數(shù)據(jù)長(zhǎng)度小于46字節(jié),則會(huì)自動(dòng)進(jìn)行數(shù)據(jù)填充以達(dá)到要求的最短長(zhǎng)度。接收數(shù)據(jù)幀時(shí),數(shù)據(jù)拆裝模塊將自動(dòng)丟棄前導(dǎo)碼和定界符2個(gè)字段。?
?
?
1.2 CSMA/CD協(xié)議?
??? 媒體訪問(wèn)管理模塊主要實(shí)現(xiàn)CSMA/CD(Carrier Sense Multiple Access with Collision Detection)協(xié)議[4]。CS2MA/CD是一種分布式介質(zhì)訪問(wèn)控制協(xié)議,使網(wǎng)中的多個(gè)站(節(jié)點(diǎn)) 可以共享傳輸介質(zhì)。發(fā)送數(shù)據(jù)幀時(shí),節(jié)點(diǎn)首先進(jìn)行載波監(jiān)聽(tīng),當(dāng)介質(zhì)空閑時(shí)開(kāi)始發(fā)送幀。如果在傳輸過(guò)程中與其他節(jié)點(diǎn)產(chǎn)生沖突,則正在傳輸?shù)拿總€(gè)節(jié)點(diǎn)必須發(fā)出32bit大小的阻塞信號(hào)來(lái)加強(qiáng)沖突,以便通知總線上各個(gè)站點(diǎn)已發(fā)生沖突,然后隨機(jī)延時(shí)一段時(shí)間重新?tīng)?zhēng)用介質(zhì),再重新傳送數(shù)據(jù)幀。?
??? 以太網(wǎng)用載波偵聽(tīng)多路訪問(wèn)/沖突檢測(cè)(CSMA/CD)作為它的媒體訪問(wèn)控制協(xié)議,CSMA/CD定義了以太網(wǎng)節(jié)點(diǎn)為傳輸數(shù)據(jù)如何獲得對(duì)網(wǎng)絡(luò)媒體的訪問(wèn)。?
1.3 介質(zhì)無(wú)關(guān)接口(MII)?
??? MII是一個(gè)用于互連控制器和收發(fā)器的全新介質(zhì)無(wú)關(guān)接口,它是100Mb/s快速以太網(wǎng)開(kāi)發(fā)工作的一個(gè)組成部分。此接口提供了新的物理連接機(jī)制以及控制器和收發(fā)器的功能劃分。該接口主要由發(fā)送信號(hào)、接收信號(hào)、以太網(wǎng)控制信號(hào)和管理信號(hào)組成。?
1.4 CRC校驗(yàn)?
??? 利用CRC進(jìn)行檢錯(cuò)的過(guò)程可簡(jiǎn)單描述為:在發(fā)送端根據(jù)要傳送的k位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個(gè)校驗(yàn)用的r位監(jiān)督碼(CRC碼),附在原始信息后邊,構(gòu)成一個(gè)新的二進(jìn)制碼序列數(shù)共k+r位,然后發(fā)送出去。在接收端,根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進(jìn)行檢驗(yàn),以確定傳送中是否出錯(cuò)。?
2 解包電路的設(shè)計(jì)?
??? 根據(jù)以太網(wǎng)的工作原理,其接收數(shù)據(jù)過(guò)程如下:?
??? (1)網(wǎng)上的站點(diǎn),若不發(fā)送幀,都處在接收狀態(tài),只要介質(zhì)上有幀在傳輸,這些站點(diǎn)都會(huì)接收幀;?
??? (2)接收幀后,首先判斷是否為幀碎片(碰撞),若是,則丟棄;?
??? (3)識(shí)別目的MAC地址,若不是,本站地址則丟棄;?
??? (4)判斷幀校驗(yàn)序列是否有效,若無(wú)效則傳輸出錯(cuò),丟棄;?
??? (5)判斷類型/長(zhǎng)度是否正確,若正確,接收成功。?
??? 其流程圖如圖2所示。 ?
?
?
??? 該解包電路主要完成數(shù)據(jù)幀的接收, 即從物理層PHY芯片接收4 bit半位元數(shù)據(jù),將其轉(zhuǎn)化成以字節(jié)為單位的數(shù)據(jù)并存貯在接收數(shù)據(jù)緩沖區(qū), 按照設(shè)計(jì)要求,采用層次結(jié)構(gòu)化的設(shè)計(jì)方法,可將該電路劃分為狀態(tài)機(jī)模塊、計(jì)數(shù)器模塊、地址判斷模塊和CRC校驗(yàn)?zāi)K。其模塊結(jié)構(gòu)圖如圖3所示。?
?
?
2.1 狀態(tài)機(jī)模塊?
??? 接收控制狀態(tài)機(jī)是整個(gè)接收模塊的核心,負(fù)責(zé)管理各個(gè)功能子模塊,檢測(cè)總線及實(shí)現(xiàn)接收數(shù)據(jù)幀的時(shí)序。其接口電路如圖4所示。?
?
?
??? 圖中,MRxClk、Reset、MRxDV、Transmitting是MII接口提供的時(shí)鐘、復(fù)位、數(shù)據(jù)有效和無(wú)發(fā)送沖突信號(hào)。MRxDEqA判斷接收到的數(shù)據(jù)是否為1010, MRxDEqB判斷能否進(jìn)入接收數(shù)據(jù)狀態(tài),它們用來(lái)對(duì)狀態(tài)機(jī)進(jìn)行相應(yīng)的控制。ByteCntSmall7是在StatePreamble狀態(tài)下檢測(cè)到傳輸數(shù)據(jù)為A能否跳到StateSFD狀態(tài)的條件(不為1即跳轉(zhuǎn))。ByteCntMaxFrame用來(lái)判斷接收的字節(jié)是否超出最大字節(jié)數(shù),如果為1即由當(dāng)前狀態(tài)跳轉(zhuǎn)到StateDrop。?
??? 根據(jù)狀態(tài)機(jī)模塊的功能,可將其狀態(tài)機(jī)劃分為以下?tīng)顟B(tài): ?
??? StateIdle:??? ?線路空閑狀態(tài)?
??? StatePreambl:? 前導(dǎo)字符檢測(cè)狀態(tài)?
??? StateSFD:????? 起始符檢測(cè)狀態(tài)?
??? StateData0: ?? 接收低4位狀態(tài)?
??? StateData1: ?? 接收高4位狀態(tài)?
??? StateDrop: ??? 數(shù)據(jù)丟棄狀態(tài);?
??? 接收模塊狀態(tài)轉(zhuǎn)移圖如圖5所示。通常接收模塊處于StateIdle 狀態(tài)并監(jiān)聽(tīng)總線的狀態(tài),當(dāng)檢測(cè)到以太網(wǎng)幀時(shí)自動(dòng)進(jìn)入StateSFD 狀態(tài),此時(shí)如果接收到以太網(wǎng)數(shù)據(jù)幀的幀定界符,并且與前一個(gè)數(shù)據(jù)幀之間的時(shí)間間隔大于最小幀間間隙,則接收模塊進(jìn)入數(shù)據(jù)接收狀態(tài)開(kāi)始接收數(shù)據(jù)。處于StateData0 狀態(tài)時(shí)接收字節(jié)的低4 位,而處于StateDatal 狀態(tài)時(shí)接收字節(jié)的高4 位,將接收到的完整字節(jié)數(shù)據(jù)存儲(chǔ)到接收數(shù)據(jù)緩沖區(qū)。如果接收的數(shù)據(jù)字節(jié)數(shù)超過(guò)允許的最大幀長(zhǎng)度,則接收模塊進(jìn)入StateDrop 狀態(tài),此時(shí)丟棄后面的數(shù)據(jù)。當(dāng)全部數(shù)據(jù)傳輸完畢即總線處于空閑時(shí),接收模塊重新處于StateIdle 狀態(tài),等待接收下一個(gè)數(shù)據(jù)幀。?
?
?
??? 其狀態(tài)轉(zhuǎn)換條件的Verilog[5]描述如下:?
??? assign StartIdle =~MRxDV & (StateDrop | StatePreamble | StateSFD | (|StateData));?
??? assign StartPreamble = MRxDV & ~MRxDEqA & (StateIdle & ~Transmitting);?
??? assign StartSFD = MRxDV & MRxDEqA & (StateIdle & ~Transmitting | StatePreamble) &~ByteCntSmall7;?
??? assign StartData0 = MRxDV &(StateSFD & MRxDEqB & IFGCounterEq24 | StateData1);?
??? assign StartData1 = MRxDV & StateData0 & (~ByteCntMaxFrame);?
??? assign StartDrop = MRxDV & ( Transmitting | StateSFD & ~I(xiàn)FGCounterEq24 &? MRxDEqB| StateData0 & ByteCntMaxFrame);?
2.2 計(jì)數(shù)器模塊?
??? 計(jì)數(shù)器模塊用以檢測(cè)接收到的數(shù)據(jù)幀與前一幀之間是否滿足最小幀間間隔的要求,如果不滿足則將它丟棄。 接收字節(jié)計(jì)數(shù)器用以存儲(chǔ)接收幀的字節(jié)長(zhǎng)度,判斷接收幀長(zhǎng)度是否滿足要求(在最小幀長(zhǎng)度與最大幀長(zhǎng)度之間)。其接口電路如圖6所示。?
?
?
??? 該模塊主要完成三個(gè)計(jì)數(shù)功能:(1)是否連續(xù)檢測(cè)到7個(gè)以上的1010;(2)接收到組字節(jié)數(shù)據(jù)計(jì)數(shù)器;(3)連續(xù)兩個(gè)數(shù)據(jù)幀之間的間隔時(shí)間與最短時(shí)間大小關(guān)系。?
??? MRxDEqA是判斷接收到的數(shù)據(jù)是否為1010,如果檢測(cè)正確即可進(jìn)行計(jì)數(shù)來(lái)判斷能否跳轉(zhuǎn)到下一狀態(tài)StateSFD; MRxDEqB用來(lái)判斷能否進(jìn)入接收數(shù)據(jù)狀態(tài)StateData0;MaxFL是給定能接收的數(shù)據(jù)的最大數(shù)。?
??? 輸出信號(hào)ByteCntEq2、ByteCntEq3、ByteCntEq4、ByteCntEq5、ByteCntEq6、ByteCntEq7對(duì)接收的前6個(gè)字節(jié)計(jì)數(shù)來(lái)進(jìn)行相應(yīng)的地址判斷操作。?
2.3 地址判斷模塊?
??? 地址判斷模塊用以檢查幀的目的地址字段是否與本站地址相匹配,如果不匹配,則說(shuō)明不是發(fā)送給本站的而將它丟棄掉。其接口電路如圖7所示。?
?
?
??? 地址字段包括目的地址字段DA和源地址字段SA。目的地址字段占6個(gè)字節(jié),用于標(biāo)識(shí)接收站點(diǎn)的地址,它可以是單個(gè)的地址,也可以是組地址或廣播地址。DA字段最高位為“0”表示單個(gè)的地址,該地址僅指定網(wǎng)絡(luò)上某個(gè)特定站點(diǎn);DA字段最高位為“1”、其余位不為全“1”表示組地址,該地址指定網(wǎng)絡(luò)上給定的多個(gè)站點(diǎn);DA字段為全“1”,則表示廣播地址,該地址指定網(wǎng)絡(luò)上所有的站點(diǎn)。源地址字段也占2個(gè)或6個(gè)字節(jié),但其長(zhǎng)度必須與目的地址字段的長(zhǎng)度相同,它用于標(biāo)識(shí)發(fā)送站點(diǎn)地址。在6字節(jié)地址字段中,可以利用其48位中的次高位來(lái)區(qū)分是局部地址還是全局地址。?
???? ByteCntEq2、ByteCntEq3、ByteCntEq4、ByteCntEq5、ByteCntEq6和ByteCntEq7依次對(duì)應(yīng)接收到的1~6個(gè)字節(jié)。即目的地址通過(guò)對(duì)這6個(gè)字節(jié)和本地地址的比較可以判斷是否接收這個(gè)數(shù)據(jù)。RxEndFrm是數(shù)據(jù)接收結(jié)束信號(hào),應(yīng)對(duì)地址比較結(jié)果進(jìn)行保持到數(shù)據(jù)接收結(jié)束為止。MRxAddressValid是地址比較的結(jié)果。?
2.4 CRC校驗(yàn)?zāi)K?
??? 該模塊主要完成4位并行數(shù)據(jù)的CRC-32校驗(yàn),所進(jìn)行的是無(wú)延遲的方法。IEEE802.3協(xié)議規(guī)定,以太網(wǎng)的FES(幀校驗(yàn)序列)域以CRC-32為基礎(chǔ)[6],并且在編碼時(shí)首先將信息碼的最初4個(gè)字節(jié)取反碼,對(duì)目的地址、源地址、長(zhǎng)度/類型域、數(shù)據(jù)域、PAD域求出基本CRC-32碼之后再將結(jié)果取反,最后的結(jié)果才是FCS。其接口電路如圖8所示。?
?
?
3 解包電路功能仿真與綜合結(jié)果?
??? 本文采用Altera 公司的Flex系列Flex6000 芯片,整個(gè)設(shè)計(jì)全部采用Verilog HDL 硬件描述語(yǔ)言來(lái)實(shí)現(xiàn),并在Active HDL 的設(shè)計(jì)平臺(tái)上完成整個(gè)模塊的設(shè)計(jì),在Quartus進(jìn)行綜合布局布線仿真。其仿真結(jié)果如圖9、10、11所示。?
?
?
?
?
??? 從圖9可以看出,接收數(shù)據(jù)時(shí)狀態(tài)機(jī)的變化情況,以及接收數(shù)據(jù)RxData和開(kāi)始的數(shù)據(jù)位置。??????????? ?
??? 從圖10可以看出地址比較的結(jié)果,當(dāng)?shù)刂窞閺V播時(shí),此時(shí)接收數(shù)據(jù)。單一地址情況如上圖,故不列出。?
??? 從圖11可以看出地址比較不一致以及進(jìn)行的CRC校驗(yàn)結(jié)果。?
??? 仿真結(jié)果表明,各信號(hào)的邏輯功能和時(shí)序配合完全達(dá)到了設(shè)計(jì)要求。?
??? 本文介紹了一種基于FPGA 的以太網(wǎng)MAC 子層接收數(shù)據(jù)的設(shè)計(jì)方法,仿真和綜合結(jié)果表明該解包電路各項(xiàng)功能均達(dá)到預(yù)期要求。通過(guò)本模塊可以簡(jiǎn)單方便地設(shè)計(jì)發(fā)送控制模塊以實(shí)現(xiàn)小型嵌入式系統(tǒng)的Internet 網(wǎng)絡(luò)接口,如果再結(jié)合基于FPGA實(shí)現(xiàn)的TCP/IP協(xié)議棧及其他輔助功能模塊,不僅可以使小型嵌入式系統(tǒng)接入網(wǎng)絡(luò)更加簡(jiǎn)單,而且系統(tǒng)的集成度、穩(wěn)定性將進(jìn)一步提高。?
參考文獻(xiàn)?
[1] 王蘭,王景存,楊君.單片機(jī)系統(tǒng)接入Internet方法的探討[J]. 電子技術(shù),2002,29(8):37-39.?
[2] IEEE Std 802. 3, 2000 Edition, Part 3: Carrier sense?multiple access with collision detection(CSMA/CD) accessmethod and physical layer apecifications S.?
[3] 曹政,李磊,陳明宇. 萬(wàn)兆以太網(wǎng)媒體訪問(wèn)控制層研究[J]. 計(jì)算機(jī)工程,2007(17):31-33?
[4] 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)(第4版)[M]. 北京:電子工業(yè)出版社,2003.?
[5] BHASKER J . Verilog HDL 硬件描述語(yǔ)言[M]. 北京:機(jī)械工業(yè)出版社,2005.?
[6] 郭熙業(yè),蘇紹璟,王躍科.并行CRC-32校驗(yàn)碼生成算法研究及其實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2007,33(5):121-123.