<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計應(yīng)用 > 第4節(jié) 基于Xilinx FPGA的千兆以太網(wǎng)控制器的開發(fā)

          第4節(jié) 基于Xilinx FPGA的千兆以太網(wǎng)控制器的開發(fā)

          作者: 時間:2010-08-18 來源:網(wǎng)絡(luò) 收藏

          2.MAC結(jié)構(gòu)和工作流程

          1)MAC發(fā)送模塊

          MAC發(fā)送模塊可將上層協(xié)議提供的數(shù)據(jù)封裝之后通過MII接口發(fā)送給PHY。發(fā)送模塊可接收主機(jī)接口模塊的數(shù)據(jù)幀開始和數(shù)據(jù)幀結(jié)束標(biāo)志,并通過主機(jī)接口從外部存儲器中讀取要發(fā)送的數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行封裝,再通過PHY提供的載波偵聽和沖突檢測信號,在信道空閑時由MII接口將數(shù)據(jù)以4位的寬度發(fā)送給PHY芯片,最后由PHY將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。

          發(fā)送模塊由CRC生成模塊(crc_gen)、隨機(jī)數(shù)生成模塊(random_gen)、發(fā)送計數(shù)模塊(tx_cnt)和發(fā)送狀態(tài)機(jī)(tx_statem_machine)模塊等四個主要子模塊組成,其內(nèi)部結(jié)構(gòu)如圖10-31所示。

          本文引用地址:http://www.ex-cimer.com/article/191613.htm


          圖10-31 以太網(wǎng)MAC發(fā)送模塊的結(jié)構(gòu)示意圖

          發(fā)送狀態(tài)機(jī)由Idle_State、Preamble_State、Data0_State、Data1_State、PAD_State、FCS_State、IPG_State、Jam_State、BackOff_State、Defer_State 等十個狀態(tài)組成。其狀態(tài)轉(zhuǎn)移圖如圖10-32所示。


          圖10-32 發(fā)送狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖

          系統(tǒng)復(fù)位后,發(fā)送模塊即進(jìn)入Defer_State狀態(tài),并一直檢測載波偵聽(CarrierSense)信號。當(dāng)載波偵聽信號變成無效(表示信道空閑)時,狀態(tài)機(jī)進(jìn)入IPG_State狀態(tài)。此后,在等待一個幀間間隙之后,狀態(tài)機(jī)進(jìn)入Idle_State狀態(tài)。如果在幀間間隙的前2/3個周期檢測到信道忙信號,狀態(tài)機(jī)將重新回到Defer_State狀態(tài)。

          狀態(tài)機(jī)進(jìn)入Idle_State狀態(tài)之后,發(fā)送模塊將檢測載波偵聽信號和主機(jī)接口的發(fā)送請求。若主機(jī)模塊請求發(fā)送,狀態(tài)機(jī)將進(jìn)入Preamble_State狀態(tài),發(fā)送模塊即通知PHY發(fā)送開始,同時開始發(fā)送前序碼(7個0x5), 然后發(fā)送幀起始定界符(SFD, 0xd)。狀態(tài)機(jī)進(jìn)入Data0_State后,發(fā)送模塊將發(fā)送一個數(shù)據(jù)字節(jié)的低4位(LSB nibble),當(dāng)其進(jìn)入Data1_State狀態(tài)后,發(fā)送模塊則發(fā)送數(shù)據(jù)字節(jié)的高4位(MSB nibble)。隨后,狀態(tài)機(jī)一直在data0和data1之間循環(huán),直到數(shù)據(jù)發(fā)送完畢。當(dāng)還剩一個字節(jié)時,主機(jī)模塊將通過發(fā)送幀結(jié)束信號來通知發(fā)送模塊。如果數(shù)據(jù)幀的長度大于最小幀并且小于最大幀,狀態(tài)機(jī)就進(jìn)入FCS_State狀態(tài),此時發(fā)送模塊則將CRC生成模塊生成的CRC值添加到幀的FCS字段中并發(fā)送給PHY。

          幀發(fā)送完之后,狀態(tài)機(jī)進(jìn)入Defer_State 狀態(tài),之后是IPG_State和Idle_State狀態(tài)。此后狀態(tài)機(jī)又回到初始狀態(tài),以重新等待新的發(fā)送請求。如果數(shù)據(jù)幀的長度小于最短幀,狀態(tài)機(jī)就進(jìn)入PAD_State狀態(tài),發(fā)送模塊根據(jù)系統(tǒng)設(shè)置確定是否在數(shù)據(jù)之后添加填充碼。然后,狀態(tài)機(jī)進(jìn)入FCS_State狀態(tài)。如果數(shù)據(jù)幀的長度大于最大幀,而系統(tǒng)設(shè)置又支持發(fā)送超長幀,那么,狀態(tài)機(jī)就進(jìn)入FCS_State狀態(tài);如果不支持發(fā)送超長幀,發(fā)送模塊將放棄發(fā)送,狀態(tài)機(jī)直接進(jìn)入Defer狀態(tài),然后是IPG狀態(tài),最后回到Idle狀態(tài)。

          在發(fā)送數(shù)據(jù)的過程中,發(fā)送模塊會一直檢查沖突檢測信號(collision detected)。如果發(fā)現(xiàn)沖突且狀態(tài)機(jī)正處于Preamble_State,狀態(tài)機(jī)將在發(fā)送完前序碼和SFD之后進(jìn)入Jam_State,并發(fā)送擁塞碼,然后進(jìn)入BackOff狀態(tài),以等待重試。之后,狀態(tài)機(jī)經(jīng)過Defer和IPG回到Idle狀態(tài)。如果此時重試次數(shù)計數(shù)器的值沒有達(dá)到額定值,發(fā)送模塊將重新開始發(fā)送剛才的幀,并將重試次數(shù)計數(shù)器的值加1;如果發(fā)現(xiàn)沖突且狀態(tài)機(jī)處于data0、data1或FCS狀態(tài),而且沒有超過沖突時間窗,那么狀態(tài)機(jī)將馬上進(jìn)入Jam狀態(tài)發(fā)送擁塞碼,之后經(jīng)過BackOff、Defer、IPG、回到Idle,并根據(jù)重試計數(shù)器的值決定是否重新發(fā)送剛才的數(shù)據(jù)幀;如果檢測到發(fā)生沖突的時間超過了沖突時間窗,狀態(tài)機(jī)將進(jìn)入Defer狀態(tài),然后經(jīng)過IPG到IDLE狀態(tài),并放棄重試。

          在全雙工模式中發(fā)送幀時,不會進(jìn)行延遲(defer), 發(fā)送的過程中也不會產(chǎn)生沖突。此時,發(fā)送模塊將忽略PHY的載波偵聽和沖突檢測信號。當(dāng)然,幀與幀之間仍然需遵守幀間間隙的規(guī)則。因此,全雙工模式下的發(fā)送狀態(tài)機(jī)沒有Jam_State、BackOff_State、Defer_State三個狀態(tài)。

          2)MAC接收模塊

          MAC接收模塊結(jié)構(gòu)如圖10-33所示,負(fù)責(zé)數(shù)據(jù)幀的接收。當(dāng)外部PHY將通信信道的串行數(shù)據(jù)轉(zhuǎn)換為半字節(jié)長的并行數(shù)據(jù)并發(fā)送給接收模塊后,接收模塊會將這些半字節(jié)數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)據(jù),然后經(jīng)過地址識別、CRC校驗(yàn)、長度判斷等操作后,再通過主機(jī)接口寫入外部存儲器,并在主機(jī)接口模塊的接收隊(duì)列中記錄幀的相關(guān)信息。此外,接收模塊還負(fù)責(zé)前序碼和CRC的移除。



          圖10-33 以太網(wǎng)MAC接收模塊的結(jié)構(gòu)示意圖



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();