丁世勇,譚文文,李桂英
(1.山東科技大學 信息與電氣工程學院,山東 青島 266510;2.山東科技大學 理學院,山東 青島 266510)
隨著網絡的飛速發展,因特網(Internet)在人們的生活中占據著越來越重要的地位。目前,以太網802.3協議和TCP/IP協議是嵌入式系統接入Internet的首選協議。而以太網(Ethernet)的核心思想是通過帶沖突檢測的載波偵聽多路訪問協議(CSMA/CD)[1]來控制對介質的訪問以實現多用戶共享傳輸信道。根據OSI網絡七層參考模型,以太網對應模型中的數據鏈路層和物理層,并把數據鏈路層分為邏輯鏈路層(LLC)和介質訪問控制層(MAC)。以太網技術主要集中在物理層(PHY)和介質訪問控制層(MAC)的實現上,MAC子層協議是數據幀收發的基礎,負責上層數據和物理層比特流的封裝和解封、流量控制以及差錯校驗等功能,是以太網控制器的核心。
以太網MAC控制器由5個主要部分組成,如圖1所示:主機接口模塊,發送模塊,接收模塊,控制模塊和MII(Media Independent Interface)管理模塊。主機接口包含AHB總線的master和slave接口,提供以太網控制器與上層協議之間的接口,用于數據的接收、發送以及對控制器內的寄存器的設置,發送和接收模塊主要提供MAC幀的發送和接收功能,直接提供了到物理層芯片(PHY)的并行數據接口。MAC控制模塊用于執行全雙工模式下的流量控制。MII管理模塊提供了介質獨立接口用于連接數據鏈路層和物理層。

圖1 以太網MAC控制器的主要組成部分Fig.1 Main component of Ethernet MAC controller
以太網數據幀格式[2]如圖2所示,前導碼的字段長度為7 b,內容為“101010..1010”;幀起始符字段長度為 1 b,內容為“10101011”;標志數據幀信號的開始;目的地址字段長度為7 b,可以為單播地址,多播地址或廣播地址;源地址字段長度為6 B,表示發送方的MAC地址;長度/類型字段長度為2 B,如果該值小于802.3協議規定的最大幀長度,則表示數據字段的字節個數,如果大于最大幀長度則表示上層使用的協議;數據/填充字段的長度為46~1 500 B,表示數據字段的字節數,若小于46 B,需要添加填充字段,確保數據字段的長度達到協議規定的最小長度46 B;校驗碼字段長度為4 B,采用CRC校驗,計算范圍從目的地址到數據填充字段。

圖2 數據幀格式Fig.2 Data frame format
數據發送模塊根據從主機接口發出的幀開始(TxStartFrm)和幀結束(TxEndFrm)信號,從存儲器中獲取相應的數據,對其進行數據幀格式的封裝后,根據CSMA/CD協議,在信道空閑的時候把數據以半字節的形式傳輸給PHY。最后由PHY發送到網絡上。
發送狀態機模塊是數據發送模塊的核心,控制著整個發送過程,發送狀態機一共有10個狀態:S_idle、S_pre、S_data0、S_data1、S_pad、S_fcs、S_ipg、S_jam、S_back、S_defer。 其狀態轉移圖如圖3所示。

圖3 發送狀態機狀態轉移圖Fig.3 State transfer diagram of transmitting state machine
系統復位后,狀態機進入S_defer狀態。當載波偵聽信號(CarrierSense)變成無效時,狀態機進入S_ipg狀態。在等待一個幀間間隙(≥96個比特時間)[3]之后,狀態機進入S_idle狀態。如果在幀間間隙的前2/3個周期檢測到信道忙則返回S_defer狀態。在空閑狀態下,當主機向發送模塊發出幀起始信號(TxStartFrm),且載波空閑時,狀態機進入S_pre狀態。輸出使能信號(MtxEn)有效并開始向PHY發送數據,7 B前導碼發送后,發送1 B的幀起始符。之后狀態機進入S_data0狀態,發送模塊將發送一個數據字節的低4位。之后狀態機進入S_data1狀態,發送模塊則發送字節的高4位。之后,狀態一直在S_data0和S_data1之間循環,直至數據發送完畢。還剩下最后一字節時,主機會發送幀結束信號(TxEndFrm)通知發送模塊。如果幀長度大于或等于最小幀長度(在PACKETLEN寄存器中定義),并且循環冗余碼校驗(CRC)開啟,狀態機進入S_fcs。發送完32比特的校驗碼后,狀態機進入S_defer狀態,然后循環又重新開始。如果CRC不開啟,狀態機直接從S_data1轉入S_defer狀態。
如果數據幀的長度小于最小幀長度,狀態就進入S_pad狀態,發送模塊根據系統設置來決定是否添加填充碼,然后進入S_fcs狀態。如果數據幀的長度大于最大幀長度,發送模塊根據設置決定是否發送超長幀,如果不支持,狀態機直接進入S_defer狀態。
在發送數據過程中,發送模塊會一直檢查沖突檢測信號。如果發現沖突且狀態機正處于S_pre狀態,狀態機在發送完前導碼和幀起始符后進入S_jam狀態,并發送擁塞碼,然后進入S_back狀態,以等待重試。之后狀態機經S_defer和S_ipg回到S_idle狀態。如果重試計數器沒有達到重試最大值,發送模塊將重新開始發送剛才的幀;如果發現沖突時狀態機處于S_data0、S_data1或S_fcs狀態時,且沒有超過沖突時間窗,狀態機馬上進入S_jam狀態并發送擁塞碼,依次經過 S_back、S_defer、S_ipg回到S_idle,并根據重試計數器的值決定是否重新發送剛才的數據幀;如果檢測到發生沖突的時間超過了沖突時間窗,狀態機將進入S_defer狀態,經S_ipg到S_idle狀態,并放棄重試。
在全雙工模式下,發送數據幀過程中不會產生沖突。此時,發送模塊將忽略PHY的載波偵聽和沖突檢測信號,但幀與幀之間仍然要遵守幀間間隙規則,因此,全雙工模式下的發送狀態機沒有S_jam、S_back和S_defer 3個狀態。
該模塊的主要功能是接受物理層輸出的半字節數據,并轉換成字節形式,判斷接受幀的各個字段,去除前導碼和幀起始符,對接受幀的目的地址進行檢查,對接受數據幀進行CRC校驗,根據校驗結果判斷是否接收數據[4]。
接收狀態機模塊是數據接收模塊的核心,控制著整個接收過程, 接收狀態機一共有 6個狀態:S_idle、S_pre、S_sfd、S_data0、S_data1、S_drop。其狀態轉移圖如圖4所示。

圖4 發送狀態機狀態轉移圖Fig.4 State transfer diagram of receiving state machine
系統復位后,接收狀態機進入S_drop狀態,如果接收使能信號(MRxDV)無效,狀態機進入S_idle狀態,并一直處于S_idle狀態等待輸入幀。一般情況下接收模塊在接收數據包之前會檢測前導碼,標準的前導碼7 B長,之后是1 B的幀起始符。由于以太網控制器也支持接收不帶前導碼只有幀起始符的數據幀。所以,當MRxDV有效時,判斷接收到得數據MRxD是否為0x5,如果不是,狀態機進入S_pre模塊,并且一直處于S_pre狀態直至MRxD為0x5時狀態機轉入S_sfd狀態。當MRxD為0xd且表示前后兩幀間隙是否滿足規定的信號IFGCounterEq24有效時,狀態機進入S_data0狀態以接收字節的低4位,之后進入S_data1狀態以接收字節的高4位。直至數據傳輸完畢,PHY芯片使MRxDV無效,狀態機進入S_idle。如果兩幀間隙不滿足規定,狀態機直接從S_sfd狀態進入S_drop狀態,直到MRxDV無效時進入S_idle狀態,循環重新開始。另外當狀態機處于 S_pre、S_sfd、S_data0或S_data1時只要MRxDV變成無效,狀態都進入S_idle狀態。
MII對物理層寄存器的操作是通過發送管理幀來實現的,管理幀格式[5]如圖5所示。前導碼字段長度為4 B,全為1,已使物理層與數據同步;幀起始符字段長度為2 b,值為“01”;操作碼字段長度為 2 b,“01”表示寫操作,“10”表示讀操作;物理層地址字段長度為5 b,表示物理層地址;寄存器地址字段長度為5 b,表示物理層內部的寄存器地址;轉換碼字段長度為2 b,表示數據輸入或輸出,讀操作時轉化碼為“Z0”,寫操作時,狀態為“10”;數據字段長度為 2 b,表示寫入或讀出的寄存器的值。

圖5 管理幀格式Fig.5 Management frame format
MII管理模塊提供了與外部PHY芯片交互的接口,可以對PHY里的配置寄存器進行設置或讀出寄存器的狀態。接口有兩個信號組成:時鐘信號 (MDC)和雙向數據信號(MDIO)。MDIO有輸入信號Mdi,輸出信號Mdo以及輸出使能信號MdoEn組成。MII管理模塊包含3個子模塊:時鐘產生模塊,移位寄存器模塊和輸出控制模塊。
時鐘產生模塊產生時鐘信號Mdc用于與PHY通信,設置Mdc的頻率時要參照外部PHY芯片的說明。可通過設置MIIMODER寄存器來設置Mdc的分頻系數。
移位寄存器作用是在輸出數據時把并行數據一位一位串行的輸給外部PHY,接收輸入數據時把串行數據轉化為并行存入MIIRX_DATA寄存器。
輸出控制模塊主要是產生輸出數據和輸出使能信號,雖然MDIO是雙向數據信號,但Mdi是輸入信號,不屬于MAC控制器的一部分,如果在MIIMODER寄存器中設置前導碼(Preamble)有效,輸出控制模塊會在有效數據前產生32比特的前導碼
MAC控制模塊實現全雙工模式下的流量控制功能。當接收站點的接收緩沖區快要溢出或者主機發出流量控制請求時,就會發出流量控制請求至MAC控制模塊,MAC流量控制模塊在接收到流量控制請求后會發送PAUSE控制幀。數據幀發送端接收到PAUSE幀后,根據幀中的參數設置定時器。PAUSE定時器到之前,發送端將暫停發送數據,從而防止接收緩存溢出。
主機接口模塊為MAC控制器與上層協議模塊的接口,可將上層協議模塊輸入的數據傳輸到數據發送模塊,將數據接收模塊接收的數據輸出到上層模塊,并控制MII管理模塊。
主機接口模塊內有一組寄存器,可用于存儲上層協議對MAC設置的參數以及MAC的狀態信息。上層協議對MAC設置的參數包括接受超短幀使能、添加填充碼使能、全雙工模式或半雙工模式、發送和接收使能、幀間間隙的長度、最大幀和最小幀的長度、重試次數限制以及本機的MAC地址等。
利用Modelsim對Ethernet控制器進行了仿真[6],圖6為發送狀態機的仿真波形。可以看到狀態機在S_defer狀態時載波偵聽信號無效,隨即狀態機進入S_ipg狀態,在等待一個幀間間隙之后,狀態機進入S_idle狀態,此時,幀起始信號(TxStartFrm)有效,狀態機進入S_pre狀態,發送完7 B前導碼和1 B幀起始符后,狀態機進入S_data0,然后在S_data0和S_data1之間循環,直至數據發送完畢。從圖6可知設計的時序與802.3規定的時序一致。

圖6 發送狀態機的仿真波形圖Fig.6 Simulation wave chart of transmitting state machine
文中設計的以太網MAC控制器IP可正確接收和發送數據,實現了802.3協議中MAC層的功能,可通過介質獨立接口(MII)與以太網物理層芯片相連接,實現半雙工和全雙工兩種工作模式的傳輸。
[1]Andrew S.Tanenbaum.計算機網絡[M].4版.潘愛民,譯.北京:清華大學出版社,2004.
[2]龔堅,彭暉,喬廬峰,等.標準802.3以太網MAC控制器的FPGA設計與實現[J].軍事通信技術,2005,26(4):21-24.GONG Jian,PENG Hui,QIAO Lu-feng,et al.FPGA design and implementation ofstandard 802.3 ethernetMAC Controller[J].Journal of Military Communications Technology,2005,26(4):21-24.
[3]IEEE Std 802.3,2000 Edition Part3:Carrier sense multiple access with collision detection (CSMA/CD)access method and physical layer specifications[S].USA,LAN/MAN standards Committee of the IEEE Computer Society,2000.
[4]許全泉,胡文江,蘇里.基于PFGA的以太網控制器設計[J].電子元器件應用,2007,9(6):21-25.XU Quan-quan,HU Wen-jiang,SU Li.The design of ethernet controller based on FPGA[J].Electronic Component&Device Application,2007,9(6):21-25.
[5]張博,張琨.基于FPGA的以太網MAC控制器的設計[J].科技情報開發與經濟,2009,19(27):97-99.ZHANG Bo,ZHANG Kun.The Design of Ethernet MAC Controller based on FPGA[J].Sci-tech Information Developmen&Economy,2009,19(27):97:99.
[6]楊宗凱.數字專用集成電路的設計與驗證[M].北京:電子工業出版社,2004:197-205.