楊 武,張 俊,蘇國旺,丁旭然,李 秋
(中南大學(xué)自動化學(xué)院,湖南長沙 410083)
以太網(wǎng)是目前局域網(wǎng)最常見的通信協(xié)議標(biāo)準(zhǔn)[1],具有網(wǎng)絡(luò)靈活、兼容性高等優(yōu)點。嵌入式系統(tǒng)逐漸走向網(wǎng)絡(luò)化,對以太網(wǎng)接入的需求逐漸增大[2]。MAC(介質(zhì)訪問控制)層屬于OSI參考模型的數(shù)據(jù)鏈路層,主要實現(xiàn)數(shù)據(jù)幀構(gòu)建、差錯檢驗、傳輸控制和接口轉(zhuǎn)換等功能[3],是實現(xiàn)以太網(wǎng)技術(shù)的關(guān)鍵之一。
許多學(xué)者設(shè)計了功能、接口不一的MAC控制器以提供以太網(wǎng)傳輸功能?;粜l(wèi)濤等[4]提出基于AMBA協(xié)議的雙通道以太網(wǎng)MAC,并使用RGMII接口,以減少管腳數(shù)目。曾明[5]提出基于DMA的千兆以太網(wǎng)MAC,采用基于描述符的DMA結(jié)構(gòu)實現(xiàn)數(shù)據(jù)的高速傳輸,兼容十兆、百兆傳輸速率。文豐等[6]提出僅支持千兆速率的以太網(wǎng)MAC軟核,相較于兼容百兆、十兆的MAC控制器,具有更強的針對性和專一性。包海燕等[7]提出GMII接口單元,可完成MAC層幀數(shù)據(jù)的封裝、解封及對媒體的訪問管理。
本文設(shè)計了基于FPGA的MAC控制器,在滿足千兆以太網(wǎng)MAC協(xié)議所要求功能及性能的同時,盡可能降低邏輯資源使用量,并提高系統(tǒng)可靠性。
MAC控制器工作在半雙工模式時,通過CSMA/CD(載波監(jiān)聽多路訪問/碰撞檢測)協(xié)議來控制對共享介質(zhì)的訪問,而在全雙工模式,只需保證相鄰兩幀之間的幀間間隔不小于最小幀間間隔。IEEE 802.3規(guī)定的MAC幀格式如圖1所示,包括前導(dǎo)碼、幀起始定界符、目的地址、源地址、長度/類型字段、MAC客戶數(shù)據(jù)、填充、幀校驗(FCS)和擴展字段。
圖1 IEEE 802.3規(guī)定MAC幀格式
本文提出的MAC控制器的總體架構(gòu)如圖2所示,MAC控制器通過GMII接口和物理層連接。主要模塊包括主機接口模塊、發(fā)送/接收緩存、發(fā)送發(fā)起模塊、流量控制模塊、發(fā)送控制器模塊、接收控制器模塊、接收保存模塊、狀態(tài)檢測模塊和MII管理模塊。
圖2 MAC控制器整體架構(gòu)
主機接口模塊實現(xiàn)地址譯碼,提供對MAC控制器內(nèi)部寄存器、發(fā)送緩存和接收緩存的訪問。狀態(tài)檢測模塊采集發(fā)送和接收過程中的狀態(tài)信息,并同步到主機接口模塊。發(fā)送和接收緩存各包括一個改進型異步FIFO(位寬為32)和一個普通異步FIFO,分別用于存儲幀數(shù)據(jù)和幀長度(字節(jié)數(shù))。發(fā)送發(fā)起模塊負責(zé)將幀從發(fā)送緩存讀出,并將其轉(zhuǎn)換成字節(jié)形式,提供給流量控制模塊。流量控制模塊實現(xiàn)控制幀的響應(yīng)和發(fā)送,以支持全雙工流量控制。發(fā)送控制器模塊對幀進行封裝并發(fā)送給PHY芯片。接收控制器模塊完成幀的識別,并將解封裝后的幀傳遞給上層模塊。接收保存模塊將幀轉(zhuǎn)換為32位形式,寫入接收緩存。MII管理模塊實現(xiàn)對PHY芯片內(nèi)部寄存器的訪問。
發(fā)送和接收緩存都由存儲幀數(shù)據(jù)的改進型異步FIFO和存儲數(shù)據(jù)長度的幀長度FIFO模塊組成。以發(fā)送緩存為例,存儲幀數(shù)據(jù)的緩存需要完成幀數(shù)據(jù)從主機時鐘域到發(fā)送時鐘域的同步。僅考慮這一點時,可使用異步FIFO,但是發(fā)送幀時可能因沖突導(dǎo)致需要重發(fā),也可能因為某些錯誤,導(dǎo)致放棄當(dāng)前幀的發(fā)送,直接跳到下一幀,而異步FIFO不能滿足這兩點要求。為此,本文在異步FIFO的基礎(chǔ)上進行改進,設(shè)計出讀端口可清除及重讀式異步FIFO。在異步FIFO的讀端口增加幀重讀和幀清除信號。幀重讀信號有效時,讀指針回到當(dāng)前幀的起始位置。幀清除信號有效時,讀指針跳到下一幀的起始位置。讀端口可清除及重讀式異步FIFO電路結(jié)構(gòu)如圖3所示。
圖3 讀端口可清除及重讀式異步FIFO結(jié)構(gòu)
除讀寫指針外,增加了指向當(dāng)前幀起始地址的基地址指針,3個指針的最高位為翻轉(zhuǎn)標(biāo)志,其余位用于指示地址。進行讀寫操作時讀寫指針加一,幀重讀信號有效時,讀指針回到基地址,幀清除信號有效時,讀指針和基地址指針變?yōu)榛刂分羔樇訋L度。將讀指針和寫指針比較得到空信號,將寫指針和基地址指針比較得到滿信號。
由于寫指針、讀指針及基地址指針處于不同時鐘域,所以比較前要進行跨時鐘域的同步操作。寫指針只會順序變化,所以采用格雷碼并打兩拍的方法。當(dāng)讀指針格雷碼和寫指針格雷碼打兩拍后的結(jié)果相同時空信號有效。基地址指針會跳變,不適合使用格雷碼,因此采用握手機制進行同步。實現(xiàn)方法為:當(dāng)進行幀清除操作時,基地址指針變?yōu)榛刂分羔樇訋L度,同時產(chǎn)生請求信號。在寫時鐘域?qū)φ埱笮盘柎騼膳?取上升沿,得到同步后的請求信號。當(dāng)同步后的請求信號有效時,在寫時鐘域鎖存基地址指針(即得到同步后的基地址指針),并產(chǎn)生應(yīng)答信號。在讀時鐘域?qū)?yīng)答信號打兩拍,取上升沿得到同步后的應(yīng)答信號,讀時鐘域檢測到同步后的應(yīng)答信號有效時,清除請求信號。寫時鐘域檢測到請求信號打兩拍的結(jié)果無效時,清除應(yīng)答信號。當(dāng)寫指針和同步后的基地址指針的最高位不同,剩余位相同時,滿信號有效。
存儲接收幀數(shù)據(jù)的緩存需要完成幀數(shù)據(jù)從接收時鐘域到主機時鐘域的跨時鐘域同步操作,且在地址不匹配、CRC校驗錯誤等情況下應(yīng)當(dāng)丟棄當(dāng)前幀。因此采用類似的方法,在異步FIFO的寫端口增加幀清除和幀完成信號,設(shè)計出寫端口可清除式異步FIFO。定義讀寫指針和指向當(dāng)前寫的幀起始地址的基地址指針,幀清除信號有效時寫指針回到基地址,清除寫入的幀數(shù)據(jù),幀完成信號有效時基地址指針更新為寫指針的值,代表一幀數(shù)據(jù)正式寫入。將寫指針和讀指針比較得到滿信號,將讀指針和基地址指針比較得到空信號。比較前對讀指針和基地址指針進行跨時鐘域的同步處理,讀指針的同步使用格雷碼并打兩拍的方式實現(xiàn),基地址的同步使用握手機制實現(xiàn)。當(dāng)讀指針格雷碼打兩拍后的結(jié)果和寫指針的格雷碼最高兩位不同,剩余位相同時,滿信號有效。當(dāng)同步后的基地址指針和讀指針相同時,空信號有效。
發(fā)送幀時,發(fā)送發(fā)起模塊按照發(fā)送幀長度FIFO提供的長度,從讀端口可清除及重讀式異步FIFO讀取相應(yīng)長度的幀數(shù)據(jù),將其從32位形式轉(zhuǎn)換為字節(jié)形式,并生成相應(yīng)的控制信號,提供給流量控制模塊。流量控制模塊同意發(fā)送發(fā)起模塊的發(fā)送請求后,再將數(shù)據(jù)和控制信號提供給發(fā)送控制模塊。發(fā)送發(fā)起模塊還需要根據(jù)發(fā)送控制器模塊返回的發(fā)送結(jié)果對發(fā)送緩存中的幀進行管理。當(dāng)幀發(fā)送完成或放棄幀時,發(fā)送發(fā)起模塊向讀端口可清除及重讀式異步FIFO輸出幀清除信號。當(dāng)幀需要重發(fā)時,發(fā)送發(fā)起模塊向讀端口可清除及重讀式異步FIFO輸出幀重讀信號。
接收保存模塊負責(zé)將接收控制器模塊輸出的解封裝后的字節(jié)形式的幀數(shù)據(jù)拼接成32位形式,然后將幀數(shù)據(jù)和數(shù)據(jù)長度寫入接收緩存。當(dāng)接收幀沒有錯誤時,接收保存模塊將全部幀數(shù)據(jù)寫入寫端口可清除式異步FIFO之后,向?qū)懚丝诳汕宄疆惒紽IFO輸出幀完成信號,并將數(shù)據(jù)長度寫入接收幀長度FIFO。當(dāng)出現(xiàn)地址不匹配、幀校驗錯誤等情況時,接收保存模塊停止寫入幀數(shù)據(jù),并向?qū)懚丝诳汕宄疆惒紽IFO輸出幀清除信號,清除已寫入數(shù)據(jù)。
流量控制模塊實現(xiàn)全雙工模式下的流量控制,支持控制幀的發(fā)送、識別和響應(yīng),內(nèi)部結(jié)構(gòu)如圖4所示。
圖4 流量控制模塊結(jié)構(gòu)框圖
流量控制模塊對數(shù)據(jù)幀和控制幀的發(fā)送請求進行仲裁,然后選通相應(yīng)數(shù)據(jù)通路,將數(shù)據(jù)幀或控制幀提供給發(fā)送控制器模塊進行封裝和發(fā)送,控制幀擁有更高的發(fā)送優(yōu)先級??刂茙赡K負責(zé)產(chǎn)生控制幀的幀數(shù)據(jù)和相應(yīng)控制信號??刂茙R別模塊對接收控制器模塊提供的接收幀目的MAC地址、長度/類型字段、操作碼等字段進行檢查,判斷其是否為控制幀。確定接收到控制幀時,按照控制幀中暫停時間參數(shù)的要求,在相應(yīng)時間內(nèi)阻斷數(shù)據(jù)幀的發(fā)送。
發(fā)送控制器模塊從流量控制模塊接收字節(jié)形式的幀數(shù)據(jù),按照設(shè)置為其添加前導(dǎo)碼、幀起始定界符、填充、FCS和擴展等字段,通過GMII接口發(fā)送給物理層,并實現(xiàn)CSMA/CD協(xié)議。發(fā)送幀時,可能成功發(fā)送,可能會因沖突導(dǎo)致需要重發(fā),也可能因遲沖突、重發(fā)次數(shù)超過限制等錯誤導(dǎo)致需要放棄當(dāng)前幀的發(fā)送。發(fā)生這幾種情況時,發(fā)送控制器模塊需要向發(fā)送發(fā)起模塊提供相應(yīng)信號,告知當(dāng)前幀的發(fā)送結(jié)果。發(fā)送控制器模塊的內(nèi)部結(jié)構(gòu)如圖5所示。
圖5 發(fā)送控制器模塊結(jié)構(gòu)框圖
在半雙工模式下,發(fā)送狀態(tài)機模塊根據(jù)CSMA/CD協(xié)議的要求執(zhí)行載波檢測、沖突強化、沖突退避、載波擴展、幀突發(fā)等操作,并根據(jù)MAC幀格式添加封裝。在全雙工模式下,發(fā)送狀態(tài)機模塊確保兩幀之間的間隔滿足96 bit的最小幀間間隔要求,并進行MAC層封裝。發(fā)送狀態(tài)機模塊控制整個發(fā)送的流程,根據(jù)其狀態(tài)可確定當(dāng)前發(fā)送的字段。發(fā)送計數(shù)器模塊提供各項計數(shù),為發(fā)送狀態(tài)機模塊的狀態(tài)轉(zhuǎn)換等提供參考。隨機數(shù)模塊使用線性反饋移位寄存器提供沖突退避時所需要的退避隨機數(shù)。為降低系統(tǒng)對時鐘速率的要求,CRC計算模塊使用8位并行CRC算法計算CRC-32碼[8],將其按位取反后得到幀校驗字段。
接收控制器模塊通過GMII接口從物理層接收幀數(shù)據(jù),進行幀的識別、解封裝和有效性檢查,將解封裝后的幀數(shù)據(jù)向上層模塊傳遞,其內(nèi)部結(jié)構(gòu)如圖6所示。
圖6 接收控制器模塊結(jié)構(gòu)框圖
接收狀態(tài)機模塊根據(jù)CSMA/CD協(xié)議及MAC幀格式識別接收內(nèi)容,進行最小幀間間隔等檢查,判斷是否接收到幀,并區(qū)分接收幀的各字段。接收計數(shù)器模塊提供各種計數(shù),為其他模塊提供參考。地址檢查模塊進行地址過濾,對目的MAC地址進行單播、多播和廣播地址檢查,判斷是否接收當(dāng)前幀。同樣,CRC校驗?zāi)K使用8位并行CRC算法對接收幀進行CRC校驗,以降低系統(tǒng)對時鐘速率的要求。當(dāng)接收幀出現(xiàn)地址不匹配、CRC校驗錯誤、長度/類型字段描述與實際不符等情況時,接收控制器模塊輸出相應(yīng)的狀態(tài)信號。
MII管理模塊通過管理接口向PHY芯片發(fā)送管理幀,訪問PHY芯片內(nèi)部的寄存器,對PHY芯片進行配置或讀取其狀態(tài)信息。管理接口包括MDC時鐘信號和MDIO串行雙向數(shù)據(jù)信號,管理幀結(jié)構(gòu)如圖7所示。
圖7 管理幀結(jié)構(gòu)
MII管理模塊內(nèi)部結(jié)構(gòu)如圖8所示。時鐘生成模塊對主機時鐘進行分頻,得到MDC時鐘。輸出控制模塊控制三態(tài)門的輸出數(shù)據(jù)和輸出使能信號,實現(xiàn)MDIO串行雙向數(shù)據(jù)接口。前導(dǎo)碼由輸出控制模塊提供,其余幀內(nèi)容由移位寄存器模塊提供。開始發(fā)送管理幀時啟動位計數(shù)器,通過位計數(shù)器可確定當(dāng)前發(fā)送的位。移位寄存器模塊中包含一個8位的移位寄存器,從發(fā)送幀起始標(biāo)志開始,每隔8個MDC時鐘周期將管理幀的下一字節(jié)數(shù)據(jù)更新到移位寄存器模塊中,中間將數(shù)據(jù)移位輸出,提供給輸出控制模塊。移位寄存器模塊還負責(zé)在讀操作時將串行讀數(shù)據(jù)并行化,存入讀數(shù)據(jù)寄存器,供主機接口模塊讀取。
圖8 MII管理模塊結(jié)構(gòu)框圖
MAC控制器采用Verilog HDL硬件描述語言進行RTL代碼設(shè)計,并利用ModelSIM軟件完成功能仿真驗證。在Qaurtus上建立工程,選擇FPGA器件型號為EP4CE115F29C7,得到MAC控制器綜合結(jié)果和最大主頻如表1所示。MAC控制器的邏輯資源使用量較少,存儲器資源使用量由緩存大小決定,可調(diào)整。發(fā)送及接收時鐘均超過125 MHz,滿足GMII接口要求。
表1 綜合結(jié)果及最大主頻
采用DE2-115開發(fā)板搭建硬件測試平臺對設(shè)計的MAC控制器進行測試,測試平臺如圖9所示,開發(fā)板包含物理層芯片88E1111。
圖9 硬件測試平臺
由于開發(fā)板僅支持RGMII接口,所以需要在物理層芯片和MAC控制器之間增加一個接口轉(zhuǎn)換模塊。接收-發(fā)送模塊負責(zé)對MAC控制器進行相應(yīng)的配置,并在MAC控制器接收到有效幀時,將接收幀讀出,更改幀的目的MAC、目的IP地址改為PC機地址,源MAC和源IP地址改為FPGA地址,然后寫回MAC控制器,讓MAC控制器將幀發(fā)回給PC機。
在PC機上運行網(wǎng)絡(luò)調(diào)試助手,發(fā)送幀給FPGA,用wireshark抓包軟件抓取發(fā)送和接收幀,結(jié)果如圖10和圖11所示。PC機發(fā)送和接收的幀除了源地址和目的地址相反之外,其他內(nèi)容一致,說明MAC控制器工作正常。
圖10 PC機發(fā)送抓包結(jié)果
圖11 PC機接收抓包結(jié)果
本文設(shè)計的千兆以太網(wǎng)MAC控制器可工作在千兆傳輸速率下,配合物理層芯片能夠完成以太網(wǎng)數(shù)據(jù)的收發(fā)。此外,MAC控制器支持控制幀的收發(fā),實現(xiàn)了流量控制,且可通過管理接口對PHY芯片進行配置或讀取其狀態(tài)信息。設(shè)計中提出2種改進型異步FIFO,解決沖突幀的重傳及錯誤幀的丟棄問題。