丁世勇,譚文文,李桂英
(1.山東科技大學 信息與電氣工程學院,山東 青島 266510;2.山東科技大學 理學院,山東 青島 266510)
隨著網(wǎng)絡的飛速發(fā)展,因特網(wǎng)(Internet)在人們的生活中占據(jù)著越來越重要的地位。目前,以太網(wǎng)802.3協(xié)議和TCP/IP協(xié)議是嵌入式系統(tǒng)接入Internet的首選協(xié)議。而以太網(wǎng)(Ethernet)的核心思想是通過帶沖突檢測的載波偵聽多路訪問協(xié)議(CSMA/CD)[1]來控制對介質(zhì)的訪問以實現(xiàn)多用戶共享傳輸信道。根據(jù)OSI網(wǎng)絡七層參考模型,以太網(wǎng)對應模型中的數(shù)據(jù)鏈路層和物理層,并把數(shù)據(jù)鏈路層分為邏輯鏈路層(LLC)和介質(zhì)訪問控制層(MAC)。以太網(wǎng)技術(shù)主要集中在物理層(PHY)和介質(zhì)訪問控制層(MAC)的實現(xiàn)上,MAC子層協(xié)議是數(shù)據(jù)幀收發(fā)的基礎,負責上層數(shù)據(jù)和物理層比特流的封裝和解封、流量控制以及差錯校驗等功能,是以太網(wǎng)控制器的核心。
以太網(wǎng)MAC控制器由5個主要部分組成,如圖1所示:主機接口模塊,發(fā)送模塊,接收模塊,控制模塊和MII(Media Independent Interface)管理模塊。主機接口包含AHB總線的master和slave接口,提供以太網(wǎng)控制器與上層協(xié)議之間的接口,用于數(shù)據(jù)的接收、發(fā)送以及對控制器內(nèi)的寄存器的設置,發(fā)送和接收模塊主要提供MAC幀的發(fā)送和接收功能,直接提供了到物理層芯片(PHY)的并行數(shù)據(jù)接口。MAC控制模塊用于執(zhí)行全雙工模式下的流量控制。MII管理模塊提供了介質(zhì)獨立接口用于連接數(shù)據(jù)鏈路層和物理層。
圖1 以太網(wǎng)MAC控制器的主要組成部分Fig.1 Main component of Ethernet MAC controller
以太網(wǎng)數(shù)據(jù)幀格式[2]如圖2所示,前導碼的字段長度為7 b,內(nèi)容為“101010..1010”;幀起始符字段長度為 1 b,內(nèi)容為“10101011”;標志數(shù)據(jù)幀信號的開始;目的地址字段長度為7 b,可以為單播地址,多播地址或廣播地址;源地址字段長度為6 B,表示發(fā)送方的MAC地址;長度/類型字段長度為2 B,如果該值小于802.3協(xié)議規(guī)定的最大幀長度,則表示數(shù)據(jù)字段的字節(jié)個數(shù),如果大于最大幀長度則表示上層使用的協(xié)議;數(shù)據(jù)/填充字段的長度為46~1 500 B,表示數(shù)據(jù)字段的字節(jié)數(shù),若小于46 B,需要添加填充字段,確保數(shù)據(jù)字段的長度達到協(xié)議規(guī)定的最小長度46 B;校驗碼字段長度為4 B,采用CRC校驗,計算范圍從目的地址到數(shù)據(jù)填充字段。
圖2 數(shù)據(jù)幀格式Fig.2 Data frame format
數(shù)據(jù)發(fā)送模塊根據(jù)從主機接口發(fā)出的幀開始(TxStartFrm)和幀結(jié)束(TxEndFrm)信號,從存儲器中獲取相應的數(shù)據(jù),對其進行數(shù)據(jù)幀格式的封裝后,根據(jù)CSMA/CD協(xié)議,在信道空閑的時候把數(shù)據(jù)以半字節(jié)的形式傳輸給PHY。最后由PHY發(fā)送到網(wǎng)絡上。
發(fā)送狀態(tài)機模塊是數(shù)據(jù)發(fā)送模塊的核心,控制著整個發(fā)送過程,發(fā)送狀態(tài)機一共有10個狀態(tài):S_idle、S_pre、S_data0、S_data1、S_pad、S_fcs、S_ipg、S_jam、S_back、S_defer。 其狀態(tài)轉(zhuǎn)移圖如圖3所示。
圖3 發(fā)送狀態(tài)機狀態(tài)轉(zhuǎn)移圖Fig.3 State transfer diagram of transmitting state machine
系統(tǒng)復位后,狀態(tài)機進入S_defer狀態(tài)。當載波偵聽信號(CarrierSense)變成無效時,狀態(tài)機進入S_ipg狀態(tài)。在等待一個幀間間隙(≥96個比特時間)[3]之后,狀態(tài)機進入S_idle狀態(tài)。如果在幀間間隙的前2/3個周期檢測到信道忙則返回S_defer狀態(tài)。在空閑狀態(tài)下,當主機向發(fā)送模塊發(fā)出幀起始信號(TxStartFrm),且載波空閑時,狀態(tài)機進入S_pre狀態(tài)。輸出使能信號(MtxEn)有效并開始向PHY發(fā)送數(shù)據(jù),7 B前導碼發(fā)送后,發(fā)送1 B的幀起始符。之后狀態(tài)機進入S_data0狀態(tài),發(fā)送模塊將發(fā)送一個數(shù)據(jù)字節(jié)的低4位。之后狀態(tài)機進入S_data1狀態(tài),發(fā)送模塊則發(fā)送字節(jié)的高4位。之后,狀態(tài)一直在S_data0和S_data1之間循環(huán),直至數(shù)據(jù)發(fā)送完畢。還剩下最后一字節(jié)時,主機會發(fā)送幀結(jié)束信號(TxEndFrm)通知發(fā)送模塊。如果幀長度大于或等于最小幀長度(在PACKETLEN寄存器中定義),并且循環(huán)冗余碼校驗(CRC)開啟,狀態(tài)機進入S_fcs。發(fā)送完32比特的校驗碼后,狀態(tài)機進入S_defer狀態(tài),然后循環(huán)又重新開始。如果CRC不開啟,狀態(tài)機直接從S_data1轉(zhuǎn)入S_defer狀態(tài)。
如果數(shù)據(jù)幀的長度小于最小幀長度,狀態(tài)就進入S_pad狀態(tài),發(fā)送模塊根據(jù)系統(tǒng)設置來決定是否添加填充碼,然后進入S_fcs狀態(tài)。如果數(shù)據(jù)幀的長度大于最大幀長度,發(fā)送模塊根據(jù)設置決定是否發(fā)送超長幀,如果不支持,狀態(tài)機直接進入S_defer狀態(tài)。
在發(fā)送數(shù)據(jù)過程中,發(fā)送模塊會一直檢查沖突檢測信號。如果發(fā)現(xiàn)沖突且狀態(tài)機正處于S_pre狀態(tài),狀態(tài)機在發(fā)送完前導碼和幀起始符后進入S_jam狀態(tài),并發(fā)送擁塞碼,然后進入S_back狀態(tài),以等待重試。之后狀態(tài)機經(jīng)S_defer和S_ipg回到S_idle狀態(tài)。如果重試計數(shù)器沒有達到重試最大值,發(fā)送模塊將重新開始發(fā)送剛才的幀;如果發(fā)現(xiàn)沖突時狀態(tài)機處于S_data0、S_data1或S_fcs狀態(tài)時,且沒有超過沖突時間窗,狀態(tài)機馬上進入S_jam狀態(tài)并發(fā)送擁塞碼,依次經(jīng)過 S_back、S_defer、S_ipg回到S_idle,并根據(jù)重試計數(shù)器的值決定是否重新發(fā)送剛才的數(shù)據(jù)幀;如果檢測到發(fā)生沖突的時間超過了沖突時間窗,狀態(tài)機將進入S_defer狀態(tài),經(jīng)S_ipg到S_idle狀態(tài),并放棄重試。
在全雙工模式下,發(fā)送數(shù)據(jù)幀過程中不會產(chǎn)生沖突。此時,發(fā)送模塊將忽略PHY的載波偵聽和沖突檢測信號,但幀與幀之間仍然要遵守幀間間隙規(guī)則,因此,全雙工模式下的發(fā)送狀態(tài)機沒有S_jam、S_back和S_defer 3個狀態(tài)。
該模塊的主要功能是接受物理層輸出的半字節(jié)數(shù)據(jù),并轉(zhuǎn)換成字節(jié)形式,判斷接受幀的各個字段,去除前導碼和幀起始符,對接受幀的目的地址進行檢查,對接受數(shù)據(jù)幀進行CRC校驗,根據(jù)校驗結(jié)果判斷是否接收數(shù)據(jù)[4]。
接收狀態(tài)機模塊是數(shù)據(jù)接收模塊的核心,控制著整個接收過程, 接收狀態(tài)機一共有 6個狀態(tài):S_idle、S_pre、S_sfd、S_data0、S_data1、S_drop。其狀態(tài)轉(zhuǎn)移圖如圖4所示。
圖4 發(fā)送狀態(tài)機狀態(tài)轉(zhuǎn)移圖Fig.4 State transfer diagram of receiving state machine
系統(tǒng)復位后,接收狀態(tài)機進入S_drop狀態(tài),如果接收使能信號(MRxDV)無效,狀態(tài)機進入S_idle狀態(tài),并一直處于S_idle狀態(tài)等待輸入幀。一般情況下接收模塊在接收數(shù)據(jù)包之前會檢測前導碼,標準的前導碼7 B長,之后是1 B的幀起始符。由于以太網(wǎng)控制器也支持接收不帶前導碼只有幀起始符的數(shù)據(jù)幀。所以,當MRxDV有效時,判斷接收到得數(shù)據(jù)MRxD是否為0x5,如果不是,狀態(tài)機進入S_pre模塊,并且一直處于S_pre狀態(tài)直至MRxD為0x5時狀態(tài)機轉(zhuǎn)入S_sfd狀態(tài)。當MRxD為0xd且表示前后兩幀間隙是否滿足規(guī)定的信號IFGCounterEq24有效時,狀態(tài)機進入S_data0狀態(tài)以接收字節(jié)的低4位,之后進入S_data1狀態(tài)以接收字節(jié)的高4位。直至數(shù)據(jù)傳輸完畢,PHY芯片使MRxDV無效,狀態(tài)機進入S_idle。如果兩幀間隙不滿足規(guī)定,狀態(tài)機直接從S_sfd狀態(tài)進入S_drop狀態(tài),直到MRxDV無效時進入S_idle狀態(tài),循環(huán)重新開始。另外當狀態(tài)機處于 S_pre、S_sfd、S_data0或S_data1時只要MRxDV變成無效,狀態(tài)都進入S_idle狀態(tài)。
MII對物理層寄存器的操作是通過發(fā)送管理幀來實現(xiàn)的,管理幀格式[5]如圖5所示。前導碼字段長度為4 B,全為1,已使物理層與數(shù)據(jù)同步;幀起始符字段長度為2 b,值為“01”;操作碼字段長度為 2 b,“01”表示寫操作,“10”表示讀操作;物理層地址字段長度為5 b,表示物理層地址;寄存器地址字段長度為5 b,表示物理層內(nèi)部的寄存器地址;轉(zhuǎn)換碼字段長度為2 b,表示數(shù)據(jù)輸入或輸出,讀操作時轉(zhuǎn)化碼為“Z0”,寫操作時,狀態(tài)為“10”;數(shù)據(jù)字段長度為 2 b,表示寫入或讀出的寄存器的值。
圖5 管理幀格式Fig.5 Management frame format
MII管理模塊提供了與外部PHY芯片交互的接口,可以對PHY里的配置寄存器進行設置或讀出寄存器的狀態(tài)。接口有兩個信號組成:時鐘信號 (MDC)和雙向數(shù)據(jù)信號(MDIO)。MDIO有輸入信號Mdi,輸出信號Mdo以及輸出使能信號MdoEn組成。MII管理模塊包含3個子模塊:時鐘產(chǎn)生模塊,移位寄存器模塊和輸出控制模塊。
時鐘產(chǎn)生模塊產(chǎn)生時鐘信號Mdc用于與PHY通信,設置Mdc的頻率時要參照外部PHY芯片的說明??赏ㄟ^設置MIIMODER寄存器來設置Mdc的分頻系數(shù)。
移位寄存器作用是在輸出數(shù)據(jù)時把并行數(shù)據(jù)一位一位串行的輸給外部PHY,接收輸入數(shù)據(jù)時把串行數(shù)據(jù)轉(zhuǎn)化為并行存入MIIRX_DATA寄存器。
輸出控制模塊主要是產(chǎn)生輸出數(shù)據(jù)和輸出使能信號,雖然MDIO是雙向數(shù)據(jù)信號,但Mdi是輸入信號,不屬于MAC控制器的一部分,如果在MIIMODER寄存器中設置前導碼(Preamble)有效,輸出控制模塊會在有效數(shù)據(jù)前產(chǎn)生32比特的前導碼
MAC控制模塊實現(xiàn)全雙工模式下的流量控制功能。當接收站點的接收緩沖區(qū)快要溢出或者主機發(fā)出流量控制請求時,就會發(fā)出流量控制請求至MAC控制模塊,MAC流量控制模塊在接收到流量控制請求后會發(fā)送PAUSE控制幀。數(shù)據(jù)幀發(fā)送端接收到PAUSE幀后,根據(jù)幀中的參數(shù)設置定時器。PAUSE定時器到之前,發(fā)送端將暫停發(fā)送數(shù)據(jù),從而防止接收緩存溢出。
主機接口模塊為MAC控制器與上層協(xié)議模塊的接口,可將上層協(xié)議模塊輸入的數(shù)據(jù)傳輸?shù)綌?shù)據(jù)發(fā)送模塊,將數(shù)據(jù)接收模塊接收的數(shù)據(jù)輸出到上層模塊,并控制MII管理模塊。
主機接口模塊內(nèi)有一組寄存器,可用于存儲上層協(xié)議對MAC設置的參數(shù)以及MAC的狀態(tài)信息。上層協(xié)議對MAC設置的參數(shù)包括接受超短幀使能、添加填充碼使能、全雙工模式或半雙工模式、發(fā)送和接收使能、幀間間隙的長度、最大幀和最小幀的長度、重試次數(shù)限制以及本機的MAC地址等。
利用Modelsim對Ethernet控制器進行了仿真[6],圖6為發(fā)送狀態(tài)機的仿真波形??梢钥吹綘顟B(tài)機在S_defer狀態(tài)時載波偵聽信號無效,隨即狀態(tài)機進入S_ipg狀態(tài),在等待一個幀間間隙之后,狀態(tài)機進入S_idle狀態(tài),此時,幀起始信號(TxStartFrm)有效,狀態(tài)機進入S_pre狀態(tài),發(fā)送完7 B前導碼和1 B幀起始符后,狀態(tài)機進入S_data0,然后在S_data0和S_data1之間循環(huán),直至數(shù)據(jù)發(fā)送完畢。從圖6可知設計的時序與802.3規(guī)定的時序一致。
圖6 發(fā)送狀態(tài)機的仿真波形圖Fig.6 Simulation wave chart of transmitting state machine
文中設計的以太網(wǎng)MAC控制器IP可正確接收和發(fā)送數(shù)據(jù),實現(xiàn)了802.3協(xié)議中MAC層的功能,可通過介質(zhì)獨立接口(MII)與以太網(wǎng)物理層芯片相連接,實現(xiàn)半雙工和全雙工兩種工作模式的傳輸。
[1]Andrew S.Tanenbaum.計算機網(wǎng)絡[M].4版.潘愛民,譯.北京:清華大學出版社,2004.
[2]龔堅,彭暉,喬廬峰,等.標準802.3以太網(wǎng)MAC控制器的FPGA設計與實現(xiàn)[J].軍事通信技術(shù),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的以太網(wǎng)控制器設計[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的以太網(wǎng)MAC控制器的設計[J].科技情報開發(fā)與經(jīng)濟,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]楊宗凱.數(shù)字專用集成電路的設計與驗證[M].北京:電子工業(yè)出版社,2004:197-205.