基于Xilinx FPGA的千兆以太網(wǎng)控制器的開(kāi)發(fā)
2.MAC控制器結構和工作流程
1)MAC發(fā)送模塊
MAC發(fā)送模塊可將上層協(xié)議提供的數據封裝之后通過(guò)MII接口發(fā)送給PHY。發(fā)送模塊可接收主機接口模塊的數據幀開(kāi)始和數據幀結束標志,并通過(guò)主機接口從外部存儲器中讀取要發(fā)送的數據,然后對數據進(jìn)行封裝,再通過(guò)PHY提供的載波偵聽(tīng)和沖突檢測信號,在信道空閑時(shí)由MII接口將數據以4位的寬度發(fā)送給PHY芯片,最后由PHY將數據發(fā)送到網(wǎng)絡(luò )上。
發(fā)送模塊由CRC生成模塊(crc_gen)、隨機數生成模塊(random_gen)、發(fā)送計數模塊(tx_cnt)和發(fā)送狀態(tài)機(tx_statem_machine)模塊等四個(gè)主要子模塊組成,其內部結構如圖10-31所示。
圖10-31 以太網(wǎng)MAC發(fā)送模塊的結構示意圖
發(fā)送狀態(tài)機由Idle_State、Preamble_State、Data0_State、Data1_State、PAD_State、FCS_State、IPG_State、Jam_State、BackOff_State、Defer_State 等十個(gè)狀態(tài)組成。其狀態(tài)轉移圖如圖10-32所示。
圖10-32 發(fā)送狀態(tài)機的狀態(tài)轉移圖
系統復位后,發(fā)送模塊即進(jìn)入Defer_State狀態(tài),并一直檢測載波偵聽(tīng)(CarrierSense)信號。當載波偵聽(tīng)信號變成無(wú)效(表示信道空閑)時(shí),狀態(tài)機進(jìn)入IPG_State狀態(tài)。此后,在等待一個(gè)幀間間隙之后,狀態(tài)機進(jìn)入Idle_State狀態(tài)。如果在幀間間隙的前2/3個(gè)周期檢測到信道忙信號,狀態(tài)機將重新回到Defer_State狀態(tài)。
狀態(tài)機進(jìn)入Idle_State狀態(tài)之后,發(fā)送模塊將檢測載波偵聽(tīng)信號和主機接口的發(fā)送請求。若主機模塊請求發(fā)送,狀態(tài)機將進(jìn)入Preamble_State狀態(tài),發(fā)送模塊即通知PHY發(fā)送開(kāi)始,同時(shí)開(kāi)始發(fā)送前序碼(7個(gè)0x5), 然后發(fā)送幀起始定界符(SFD, 0xd)。狀態(tài)機進(jìn)入Data0_State后,發(fā)送模塊將發(fā)送一個(gè)數據字節的低4位(LSB nibble),當其進(jìn)入Data1_State狀態(tài)后,發(fā)送模塊則發(fā)送數據字節的高4位(MSB nibble)。隨后,狀態(tài)機一直在data0和data1之間循環(huán),直到數據發(fā)送完畢。當還剩一個(gè)字節時(shí),主機模塊將通過(guò)發(fā)送幀結束信號來(lái)通知發(fā)送模塊。如果數據幀的長(cháng)度大于最小幀并且小于最大幀,狀態(tài)機就進(jìn)入FCS_State狀態(tài),此時(shí)發(fā)送模塊則將CRC生成模塊生成的CRC值添加到幀的FCS字段中并發(fā)送給PHY。
幀發(fā)送完之后,狀態(tài)機進(jìn)入Defer_State 狀態(tài),之后是IPG_State和Idle_State狀態(tài)。此后狀態(tài)機又回到初始狀態(tài),以重新等待新的發(fā)送請求。如果數據幀的長(cháng)度小于最短幀,狀態(tài)機就進(jìn)入PAD_State狀態(tài),發(fā)送模塊根據系統設置確定是否在數據之后添加填充碼。然后,狀態(tài)機進(jìn)入FCS_State狀態(tài)。如果數據幀的長(cháng)度大于最大幀,而系統設置又支持發(fā)送超長(cháng)幀,那么,狀態(tài)機就進(jìn)入FCS_State狀態(tài);如果不支持發(fā)送超長(cháng)幀,發(fā)送模塊將放棄發(fā)送,狀態(tài)機直接進(jìn)入Defer狀態(tài),然后是IPG狀態(tài),最后回到Idle狀態(tài)。
在發(fā)送數據的過(guò)程中,發(fā)送模塊會(huì )一直檢查沖突檢測信號(collision detected)。如果發(fā)現沖突且狀態(tài)機正處于Preamble_State,狀態(tài)機將在發(fā)送完前序碼和SFD之后進(jìn)入Jam_State,并發(fā)送擁塞碼,然后進(jìn)入BackOff狀態(tài),以等待重試。之后,狀態(tài)機經(jīng)過(guò)Defer和IPG回到Idle狀態(tài)。如果此時(shí)重試次數計數器的值沒(méi)有達到額定值,發(fā)送模塊將重新開(kāi)始發(fā)送剛才的幀,并將重試次數計數器的值加1;如果發(fā)現沖突且狀態(tài)機處于data0、data1或FCS狀態(tài),而且沒(méi)有超過(guò)沖突時(shí)間窗,那么狀態(tài)機將馬上進(jìn)入Jam狀態(tài)發(fā)送擁塞碼,之后經(jīng)過(guò)BackOff、Defer、IPG、回到Idle,并根據重試計數器的值決定是否重新發(fā)送剛才的數據幀;如果檢測到發(fā)生沖突的時(shí)間超過(guò)了沖突時(shí)間窗,狀態(tài)機將進(jìn)入Defer狀態(tài),然后經(jīng)過(guò)IPG到IDLE狀態(tài),并放棄重試。
在全雙工模式中發(fā)送幀時(shí),不會(huì )進(jìn)行延遲(defer), 發(fā)送的過(guò)程中也不會(huì )產(chǎn)生沖突。此時(shí),發(fā)送模塊將忽略PHY的載波偵聽(tīng)和沖突檢測信號。當然,幀與幀之間仍然需遵守幀間間隙的規則。因此,全雙工模式下的發(fā)送狀態(tài)機沒(méi)有Jam_State、BackOff_State、Defer_State三個(gè)狀態(tài)。
評論