引言
傳統以PC為中心的互聯網應用現已開始轉向以嵌入式設備為中心。據網絡專家預測,將來在互聯網上傳輸的信息中,有70%來自小型嵌入式系統,因此,對嵌入式系統接入因特網的研究是有必要的。目前有兩種方法可以實現單片機系統接入因特網:一種方法是利用NIC (網絡控制/網卡)實現網絡接口,由單片機來提供所需的網絡協議;另外一種方法是利用具有網絡協議棧結構的芯片和PHY(物理層的接收器)來實現網絡接口,主控制器只負責往協議棧結構芯片的某個寄存器里放上適當的數據。與此同時,用FPGA實現單片機系統接入因特網的方法也日益受到人們的重視。本文提出采用FPGA實現網絡協議棧,介紹100M以太網MII接口協議的硬件實現方法,其中的奇偶模塊分頻器和異步FIFO等通用器件在日常中也很有應用價值。
以太網MII接口協議
IEEE802協議標準系列中,數據鏈路層包括LLC (邏輯鏈路控制)子層和MAC (媒體訪問控制)子層。其中MAC單獨作為一個子層,完成數據幀的封裝、解封、發送和接收功能。物理層PHY的結構隨著傳輸速率的不同而有一定差異,在100M和1000M以太網中,依次為PCS子層、PMA子層和PMD子層。MII接口是連接數據鏈路層和物理層的接口,因為本設計中以太網速率采用100Mb/s,所以MII接口實際連接的是MAC子層和PCS子層。根據協議,要求MII接口具有的功能有:數據和幀分隔符的讀寫時鐘同步,提供獨立的讀寫數據通道,為MAC層和PCS層提供相應的管理信號,以及支持全雙工模式。
擴展MII接口功能及其FPGA實現
由于100M以太網的物理層采用4b/5b編碼,為了擴展MII接口的功能,要求其能夠實現直接物理層5位數據和MAC層8位數據的發送接收傳輸轉換。即把從MAC子層用于發送的數據和從PHY用于接收的數據存入數據緩沖FIFO,同時要求MII接口將從PHY傳來的信號COL、CRS轉為信號Carrier和Collision,并提供給MAC子層用于載波監聽和沖突檢測,以及發送和接收時的時鐘、使能、錯誤位信號的傳送。擴展功能后的MII接口硬件結構框圖如圖1所示,由4b/5b編解碼器、控制信號與4位/8位轉換、分頻器及雙口FIFO 4個模塊組成,而且能夠同時支持半雙工和全雙工模式。
在設計過程中,為了考慮測試和支持多種速率傳輸的需要,要求設計帶有分頻參數的可實現奇偶分頻的分頻器和支持能夠同時進行讀寫操作和異步讀寫時鐘的FIFO。這是MII接口設計中的難點,本身也具有很高的實用價值。
奇偶分頻器的實現
分頻器是數字系統設計中的基本電路,同一個設計中有時要求多種形式的分頻。通常由計數器或計數器的級聯構成各種形式的偶數分頻及非等占空比的奇數分頻,實現較為簡單;對等占空比的奇數分頻實現則較為困難。本文對2n+1等占空比奇數分頻的基本思路是:先通過模2n+1的計數器實現占空比為n+1/n的奇數分頻(比如三分頻,正負波形的占空比為2:1),然后有兩種方法可以實現等占空比的奇數分頻,一種是當計數器至n+1時,讓此波形與輸入時鐘波形相“與”,不過可能會存在毛刺輸出;另一種是當計數器至n+1時,在輸入時鐘的下降沿觸發產生低電平脈沖,然后再和原波形相“或”,這種方法沒有毛刺產生。因此本文采用第二種方法。
4b/5b編解碼器的設計
為了減少系統的開銷,本文把4b/5b的編碼和解碼同時集中到一個模塊上實現。數據0~F可以直接編、解碼。PCS層有6個特殊的5b碼:11111為幀間填充碼;11000、10001和01101、00111是兩對成對出現的碼組,分別為數據流開始和結束時的分隔符;00100則是數據錯誤位,用以表示錯誤。數據接收時,可以直接對這幾個5b碼組解碼,00100則產生信號rx_er。發送時,需要對從MII接口傳來的信號位進行判斷:若tx_en上升沿,則在頭兩個前導碼時編碼輸出SSD;若tx_en下降沿(幀間隔),則在FCS后輸出ESD,然后一直用11111為數據流間隔填充碼;若有tx_er觸發,則編碼00100輸出。
異步雙口FIFO的設計
為了滿足PCS層數據的物理層時鐘以及MAC層總線時鐘不同步的需求,需要FIFO有異步的讀、寫時鐘。當沖突檢測COL為高時,要求發送幀執行退回操作回至FIFO中等待下一個Transmitting信號。
FIFO的設計思路如下:設置異步Reset,高電平觸發;設置8位寄存器fifodata保存FIFO的數據;設置fifo_rp和fifo_wp為讀、寫指針;cr_rp和cr_wr為進位標志,fifo_rp和fifo_wp為FIFO_DEPTH-1的時候取反;設置nempty、nfull、near_empty、near_full為數據空、滿指示。
讀寫時,FIFO_RD為1,則fifo_out<=fifodata[fifo_rp],fifo_rp<=fiforp+1;FIFO_WR為1,則fifodata[fifo_wr]<=fifo_in,fifo_wr<=fifo_wr+1。nempty、nfull位信號值的變化通過借助r_rp和cr_wr的進位輸出來判斷實現。當讀寫兩個指針的值相等,即fifo_rp==fifo_wp時,判斷cr_rp^cr_wr(異或)的值:若是1,則FIFO滿,nfull<=0;若是0,則FIFO空,nempty<=0。如果fifo_rp!=fifo_wp,則nfull=nempty=0,FIFO不為空也不為滿。
測試時,暫定容量FIFO_DEPTH為32(實際要求是至少一個幀的大小即1530字節大小),讀、寫時鐘分別為50MHz和25MHz,在寫550ns之后同時讀寫。
主控制模塊的實現
主控制模塊要求實現的功能是:4/8位數據的轉換;給MAC層和PCS層的控制信號輸出;雙向數據MDIO,表征MII接口與物理層相連接的情況,可以異步輸入輸出控制。
實現4/8位數據轉換的要求是:發送時,將8位數據分成兩個nibble依次輸出;接收時,將4b/5b編解碼器接收到的4位數據依次填入高、低nibble組成8位數據輸出。
采用狀態寄存器對控制信號的輸出是MII模塊的核心。設立3位status1[2:0],從高位到低位依次是{duplex, col, crs}輸入;4位status2[3:0],從高位到低位依次是{ transmitting ,transmiterror ,rx_en ,rx_er }輸入。輸出控制信號的基本算法流程如下:
*status1[2]為1時,工作在全雙工模式。CollisionDetect和CarrierSense輸出始終置為0。
*status1[2]為0時,工作在半雙工模式。如果status1[1]為1,則CollisionDetect輸出置為1,開始執行退回(backoff)程序;如果status1[0]為1,則CarrierSense輸出置為1,繼續等待。
*status2 [1]為1時,工作在接收狀態,Receiving輸出置為1 (此時status2[3]必須為0)。此時如果status2[0]為0,則接收數據有效,ReceiveDataValid輸出為1;反之則置為0,停止數據傳輸。
*status2 [1]為0時,工作在接收停止狀態,Receiving輸出置為0。此時如果status2[0]為1,eceiveDataValid輸出為0,若接收端數據為1110,則表示載波錯誤,若接收端數據為0000,則表示正常的幀間隔階段;如果status2[0]為0,則表示正常的幀間隔階段,ReceiveDataValid輸出為1。
*status2 [3]為1時,工作在發送狀態,tx_en輸出置為1(此時status2[1]必須為0)。此時如果status2[2]為0,則正常發送,tx_er置為0;否則發送錯誤,tx_er置為1,且跳過該字節繼續執行發送程序。
* status2 [3]為0時,若status2 [2]為0,則處于正常幀間隔,tx_en、tx_er置為0;若status2 [2]為1,則為無效狀態。
綜合與仿真
本文采用Altela公司的Cyclone系列EP1C20F400C8芯片,整個設計全部采用Verilog HDL硬件描述語言來實現,并在Quatus4.0的設計平臺上完成整個模塊的設計、綜合、仿真、映射及布局布線。發送時序仿真的波形如圖3所示,從圖中可以看出,當傳輸過程中發生沖突時,繼續發送32比特的阻塞碼(16進制FF),然后隨機延時一段時間重新爭用介質以傳輸數據,這說明本模塊滿足了協議要求以及CSMA/CD。
結語
本文介紹了一種簡易的基于FPGA的以太網MII協議的設計方法。通過本模塊可以簡單方便地實現小型嵌入式系統的因特網接口,如果再結合基于FPGA實現的MAC層協議和TCP/IP協議棧及其他輔助功能模塊,不僅可以使小型嵌入式系統接入網絡更加簡單,系統的集成度、穩定性也將進一步得到提高。
基于FPGA的以太網MII接口擴展設計與實現
更新時間: 2008-03-24 10:26:09來源: 粵嵌教育瀏覽量:801