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