基于FPGA的以太網(wǎng)MII接口擴(kuò)展設(shè)計(jì)與實(shí)現(xiàn)
奇偶分頻器的實(shí)現(xiàn)
分頻器是數(shù)字系統(tǒng)設(shè)計(jì)中的基本電路,同一個設(shè)計(jì)中有時要求多種形式的分頻。通常由計(jì)數(shù)器或計(jì)數(shù)器的級聯(lián)構(gòu)成各種形式的偶數(shù)分頻及非等占空比的奇數(shù)分頻,實(shí)現(xiàn)較為簡單;對等占空比的奇數(shù)分頻實(shí)現(xiàn)則較為困難。本文對2n+1等占空比奇數(shù)分頻的基本思路是:先通過模2n+1的計(jì)數(shù)器實(shí)現(xiàn)占空比為n+1/n的奇數(shù)分頻(比如三分頻,正負(fù)波形的占空比為2:1),然后有兩種方法可以實(shí)現(xiàn)等占空比的奇數(shù)分頻,一種是當(dāng)計(jì)數(shù)器至n+1時,讓此波形與輸入時鐘波形相“與”,不過可能會存在毛刺輸出;另一種是當(dāng)計(jì)數(shù)器至n+1時,在輸入時鐘的下降沿觸發(fā)產(chǎn)生低電平脈沖,然后再和原波形相“或”,這種方法沒有毛刺產(chǎn)生。因此本文采用第二種方法。
4b/5b編解碼器的設(shè)計(jì)
為了減少系統(tǒng)的開銷,本文把4b/5b的編碼和解碼同時集中到一個模塊上實(shí)現(xiàn)。數(shù)據(jù)0~F可以直接編、解碼。PCS層有6個特殊的5b碼:11111為幀間填充碼;11000、10001和01101、00111是兩對成對出現(xiàn)的碼組,分別為數(shù)據(jù)流開始和結(jié)束時的分隔符;00100則是數(shù)據(jù)錯誤位,用以表示錯誤。數(shù)據(jù)接收時,可以直接對這幾個5b碼組解碼,00100則產(chǎn)生信號rx_er。發(fā)送時,需要對從MII接口傳來的信號位進(jìn)行判斷:若tx_en上升沿,則在頭兩個前導(dǎo)碼時編碼輸出SSD;若tx_en下降沿(幀間隔),則在FCS后輸出ESD,然后一直用11111為數(shù)據(jù)流間隔填充碼;若有tx_er觸發(fā),則編碼00100輸出。
異步雙口FIFO的設(shè)計(jì)
為了滿足PCS層數(shù)據(jù)的物理層時鐘以及MAC層總線時鐘不同步的需求,需要FIFO有異步的讀、寫時鐘。當(dāng)沖突檢測COL為高時,要求發(fā)送幀執(zhí)行退回操作回至FIFO中等待下一個Transmitting信號。
FIFO的設(shè)計(jì)思路如下:設(shè)置異步Reset,高電平觸發(fā);設(shè)置8位寄存器fifodata保存FIFO的數(shù)據(jù);設(shè)置fifo_rp和fifo_wp為讀、寫指針;cr_rp和cr_wr為進(jìn)位標(biāo)志,fifo_rp和fifo_wp為FIFO_DEPTH-1的時候取反;設(shè)置nempty、nfull、near_empty、near_full為數(shù)據(jù)空、滿指示。
讀寫時,F(xiàn)IFO_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的進(jìn)位輸出來判斷實(shí)現(xiàn)。當(dāng)讀寫兩個指針的值相等,即fifo_rp==fifo_wp時,判斷cr_rp^cr_wr(異或)的值:若是1,則FIFO滿,nfull=0;若是0,則FIFO空,nempty=0。如果fifo_rp!=fifo_wp,則nfull=nempty=0,F(xiàn)IFO不為空也不為滿。
測試時,暫定容量FIFO_DEPTH為32(實(shí)際要求是至少一個幀的大小即1530字節(jié)大小),讀、寫時鐘分別為50MHz和25MHz,在寫550ns之后同時讀寫。
主控制模塊的實(shí)現(xiàn)
主控制模塊要求實(shí)現(xiàn)的功能是:4/8位數(shù)據(jù)的轉(zhuǎn)換;給MAC層和PCS層的控制信號輸出;雙向數(shù)據(jù)MDIO,表征MII接口與物理層相連接的情況,可以異步輸入輸出控制。
實(shí)現(xiàn)4/8位數(shù)據(jù)轉(zhuǎn)換的要求是:發(fā)送時,將8位數(shù)據(jù)分成兩個nibble依次輸出;接收時,將4b/5b編解碼器接收到的4位數(shù)據(jù)依次填入高、低nibble組成8位數(shù)據(jù)輸出。
采用狀態(tài)寄存器對控制信號的輸出是MII模塊的核心。設(shè)立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,開始執(zhí)行退回(backoff)程序;如果status1[0]為1,則CarrierSense輸出置為1,繼續(xù)等待。
status2 [1]為1時,工作在接收狀態(tài),Receiving輸出置為1 (此時status2[3]必須為0)。此時如果status2[0]為0,則接收數(shù)據(jù)有效,ReceiveDataValid輸出為1;反之則置為0,停止數(shù)據(jù)傳輸。
status2 [1]為0時,工作在接收停止?fàn)顟B(tài),Receiving輸出置為0。此時如果status2[0]為1,eceiveDataValid輸出為0,若接收端數(shù)據(jù)為1110,則表示載波錯誤,若接收端數(shù)據(jù)為0000,則表示正常的幀間隔階段;如果status2[0]為0,則表示正常的幀間隔階段,ReceiveDataValid輸出為1。
status2 [3]為1時,工作在發(fā)送狀態(tài),tx_en輸出置為1(此時status2[1]必須為0)。此時如果status2[2]為0,則正常發(fā)送,tx_er置為0;否則發(fā)送錯誤,tx_er置為1,且跳過該字節(jié)繼續(xù)執(zhí)行發(fā)送程序。
status2 [3]為0時,若status2 [2]為0,則處于正常幀間隔,tx_en、tx_er置為0;若status2 [2]為1,則為無效狀態(tài)。
綜合與仿真
本文采用Altela公司的Cyclone系列EP1C20F400C8芯片,整個設(shè)計(jì)全部采用Verilog HDL硬件描述語言來實(shí)現(xiàn),并在Quatus4.0的設(shè)計(jì)平臺上完成整個模塊的設(shè)計(jì)、綜合、仿真、映射及布局布線。發(fā)送時序仿真的波形如圖3所示,從圖中可以看出,當(dāng)傳輸過程中發(fā)生沖突時,繼續(xù)發(fā)送32比特的阻塞碼(16進(jìn)制FF),然后隨機(jī)延時一段時間重新爭用介質(zhì)以傳輸數(shù)據(jù),這說明本模塊滿足了協(xié)議要求以及CSMA/CD。
結(jié)語
本文介紹了一種簡易的基于FPGA的以太網(wǎng)MII協(xié)議的設(shè)計(jì)方法。通過本模塊可以簡單方便地實(shí)現(xiàn)小型嵌入式系統(tǒng)的因特網(wǎng)接口,如果再結(jié)合基于FPGA實(shí)現(xiàn)的MAC層協(xié)議和TCP/IP協(xié)議棧及其他輔助功能模塊,不僅可以使小型嵌入式系統(tǒng)接入網(wǎng)絡(luò)更加簡單,系統(tǒng)的集成度、穩(wěn)定性也將進(jìn)一步得到提高。
分頻器相關(guān)文章:分頻器原理
評論