三、基于FPGA的千兆以太網MAC控制器實現方案
1.整體設計方案
以太網控制器的FPGA設計工作包括以太網MAC子層的FPGA設計、MAC子層與上層協議的接口設計以及MAC與物理層(PHY)的MII接口設計。該以太網控制器的總體結構設計框圖如圖10-30所示。整個系統分為發送模塊、接收模塊、MAC狀態模塊、MAC控制模塊、MII管理模塊和主機接口模塊六部分。發送模塊和接收模塊主要提供MAC幀的發送和接收功能,其主要操作有MAC幀的封裝與解包以及錯誤檢測,它直接提供了到外部物理層芯片的并行數據接口。在實現中物理層處理直接利用商用的千兆PHY芯片,主要開發量集中在MAC控制器的開發上。
圖1 以太網控制器的結構設計框圖
MAC 控制模塊則用于執行全雙工模式中的流量控制功能。MAC狀態模塊可用來監視MAC操作過程的各種狀態信息,并作修改。MII管理模塊提供了標準的IEEE 802.3介質獨立接口,可用于連接以太網的鏈路層與物理層。主機接口則提供以太網控制器與上層協議(如TCP/IP協議)之間的接口,以用于數據的發送、接收以及對控制器內各種寄存器(控制、狀態和命令寄存器)的設置。
2.MAC控制器結構和工作流程
1)MAC發送模塊
MAC發送模塊可將上層協議提供的數據封裝之后通過MII接口發送給PHY。發送模塊可接收主機接口模塊的數據幀開始和數據幀結束標志,并通過主機接口從外部存儲器中讀取要發送的數據,然后對數據進行封裝,再通過 PHY提供的載波偵聽和沖突檢測信號,在信道空閑時由MII接口將數據以4位的寬度發送給PHY芯片,最后由PHY將數據發送到網絡上。
發送模塊由CRC生成模塊(crc_gen)、隨機數生成模塊(random_gen)、發送計數模塊(tx_cnt)和發送狀態機(tx_statem_machine)模塊等四個主要子模塊組成,其內部結構如圖10-31所示。
圖2? 以太網MAC發送模塊的結構示意圖
發送狀態機由Idle_State、Preamble_State、Data0_State、Data1_State、PAD_State、 FCS_State、IPG_State、Jam_State、BackOff_State、Defer_State 等十個狀態組成。其狀態轉移圖如圖10-32所示。
圖3? 發送狀態機的狀態轉移圖
系統復位后,發送模塊即進入Defer_State狀態,并一直檢測載波偵聽(CarrierSense)信號。當載波偵聽信號變成無效(表示信道空閑)時,狀態機進入IPG_State狀態。此后,在等待一個幀間間隙之后,狀態機進入Idle_State狀態。如果在幀間間隙的前2/3個周期檢測到信道忙信號,狀態機將重新回到Defer_State狀態。
狀態機進入Idle_State狀態之后,發送模塊將檢測載波偵聽信號和主機接口的發送請求。若主機模塊請求發送,狀態機將進入Preamble_State狀態,發送模塊即通知PHY發送開始,同時開始發送前序碼(7個0x5), 然后發送幀起始定界符(SFD, 0xd)。狀態機進入Data0_State后,發送模塊將發送一個數據字節的低4位(LSB nibble),當其進入Data1_State狀態后,發送模塊則發送數據字節的高4位(MSB nibble)。隨后,狀態機一直在data0和data1之間循環,直到數據發送完畢。當還剩一個字節時,主機模塊將通過發送幀結束信號來通知發送模塊。如果數據幀的長度大于最小幀并且小于最大幀,狀態機就進入FCS_State狀態,此時發送模塊則將CRC生成模塊生成的CRC值添加到幀的FCS字段中并發送給PHY。
幀發送完之后,狀態機進入Defer_State 狀態,之后是IPG_State和Idle_State狀態。此后狀態機又回到初始狀態,以重新等待新的發送請求。如果數據幀的長度小于最短幀,狀態機就進入PAD_State狀態,發送模塊根據系統設置確定是否在數據之后添加填充碼。然后,狀態機進入FCS_State狀態。如果數據幀的長度大于最大幀,而系統設置又支持發送超長幀,那么,狀態機就進入FCS_State狀態;如果不支持發送超長幀,發送模塊將放棄發送,狀態機直接進入Defer狀態,然后是IPG狀態,最后回到Idle狀態。
在發送數據的過程中,發送模塊會一直檢查沖突檢測信號(collision detected)。如果發現沖突且狀態機正處于Preamble_State,狀態機將在發送完前序碼和SFD之后進入Jam_State,并發送擁塞碼,然后進入BackOff狀態,以等待重試。之后,狀態機經過Defer和IPG回到Idle狀態。如果此時重試次數計數器的值沒有達到額定值,發送模塊將重新開始發送剛才的幀,并將重試次數計數器的值加1;如果發現沖突且狀態機處于data0、data1或FCS狀態,而且沒有超過沖突時間窗,那么狀態機將馬上進入Jam狀態發送擁塞碼,之后經過BackOff、Defer、IPG、回到Idle,并根據重試計數器的值決定是否重新發送剛才的數據幀;如果檢測到發生沖突的時間超過了沖突時間窗,狀態機將進入Defer狀態,然后經過IPG到IDLE狀態,并放棄重試。
在全雙工模式中發送幀時,不會進行延遲(defer), 發送的過程中也不會產生沖突。此時,發送模塊將忽略PHY的載波偵聽和沖突檢測信號。當然,幀與幀之間仍然需遵守幀間間隙的規則。因此,全雙工模式下的發送狀態機沒有Jam_State、BackOff_State、Defer_State三個狀態。
2)MAC接收模塊
MAC 接收模塊結構如圖10-33所示,負責數據幀的接收。當外部PHY將通信信道的串行數據轉換為半字節長的并行數據并發送給接收模塊后,接收模塊會將這些半字節數據轉換為字節數據,然后經過地址識別、CRC校驗、長度判斷等操作后,再通過主機接口寫入外部存儲器,并在主機接口模塊的接收隊列中記錄幀的相關信息。此外,接收模塊還負責前序碼和CRC的移除。
圖4? 以太網MAC接收模塊的結構示意圖
接收過程的接收狀態機由Idle_State、Drop_State、Preamble_State、SFD_State、Data0_
State、Data1_State等六個狀態組成, 其狀態轉移圖如圖10-34所示。
圖5? 接收狀態機的狀態轉移圖
當接收模塊檢測到數據有效信號之后,,狀態機將進入Preamble_State,并開始接收前序碼。此后狀態機進入SFD_State,接收一個字節的幀起始定界符,之后根據IFGcnt計數器的值進入不同的狀態。如果IFGcnt所確定的時間大于96個比特時間,狀態機將進入Data0狀態以接收字節的低4位,然后是Data1狀態,并接收字節的高4位,之后又回到Data0狀態。狀態機就一直在這兩個狀態之間循環,直到數據接收完畢(PHY清除 MRxDV信號)后進入Idle,以重新等待接收新的數據;如果接收到幀起始定界符時,IFGcnt計數器所確定的時間小于96個比特時間,那么狀態機將進入Drop_State狀態,并一直維持該狀態直到數據有效信號結束(PHY清除MRxDV信號)。之后,狀態機再回到Idle等待接收新的數據。如果在接收前序碼、幀起始定界符和數據期間,數據有效信號被清除,那么狀態機將回到Idle。
3)MII管理模塊
MII管理模塊用于控制MAC與外部PHY之間的接口,用于對PHY進行配置并讀取其狀態信息。該接口由時鐘信號MDC和雙向數據信號MDIO組成。MII管理模塊則由時鐘生成模塊、移位寄存器模塊和輸出控制模塊三部分組成。
時鐘生成模塊可以根據系統時鐘和系統設置中的分頻系數來產生MII 管理模塊的時鐘信號MDC(10 Mbps速率時為2.5 MHz, 100 Mbps速率時為25 MHz)。移位寄存器模塊既可用于對PHY的控制數據進行寫入操作,也可用于對PHY的狀態信息進行讀出操作。寫控制數據時,移位寄存器根據其他模塊的控制信號將并行控制數據轉換為串行數據;而在讀狀態信息時,移位寄存器則將PHY的串行數據轉換為并行數據,MAC中的其他模塊可將該并行數據寫入適當的寄存器。
由于MDIO是雙向信號,因此輸出控制模塊就用來決定MDIO是處于輸入狀態還是輸出狀態。當MDIO處于輸出狀態時,移位寄存器輸出的串行控制數據在經過時鐘同步后發送到PHY;當MDIO處于輸入狀態時,移位寄存器將數據線上的串行數據轉換為并行數據
4)主機接口模塊
主機接口是運行以太網的上層協議(如TCP/IP協議)與MAC控制器的接口。通過該接口,上層協議可以設置MAC的工作模式并讀取MAC的狀態信息。該接口還可用于上層協議與MAC之間的數據交換。
主機接口模塊內有一組寄存器,可用于存儲上層協議對MAC設置的參數以及MAC的狀態信息。上層協議對MAC設置的參數包括接收超短幀的使能、添加填充碼使能、發送超長幀的使能、添加CRC校驗值使能、全雙工模式或半雙工模式、持超長延遲使能、混雜模式
(Promiscuous)、接收廣播幀使能、發送和接收使能、中斷源和中斷使能、幀間間隙的長度、最大幀和最小幀的長度、重試限制和沖突時間窗、MII地址和MII控制命令、接收和發送隊列的長度以及本機MAC地址等。
上層協議通過MAC發送和接收數據的操作主要由主機接口模塊內的兩個隊列來進行管理,這兩個隊列用于對等待發送的多個幀和接收到的多個幀進行排隊。發送隊列主要記錄等待發送的幀的相關信息、發送該幀時對MAC的設置以及該幀發送完之后產生的狀態信息。幀的相關信息包括幀的長度、幀在外部存儲器中的地址、該幀是否準備好發送以及隊列中是否還有其它幀等待發送;對MAC的設置則包括中斷使能、填充使能、CRC使能;產生的狀態信息包括成功發送之前的重試次數、由于達到重試限制而放棄發送、發送時產生的滯后沖突以及成功發送之前發生過的延遲。
接收隊列主要對接收到的數據幀進行排隊并記錄每個接收到的幀信息。這些信息包括幀的長度、是控制幀還是普通數據幀、幀中包含無效符號、接收到的幀太長或太短、發生CRC錯誤、接收的過程中發生滯后沖突、幀是否接收完、隊列中是否還有其它已接收到的幀以及幀存儲在外部存儲器中的地址等。同時隊列中還有針對每個幀的設置位,用來設置是否在接收到幀時產生中斷。發送隊列和接收隊列的長度都可以在控制寄存器中進行設置。
評論