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