<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 用FPGA實(shí)現MAC核所要完成的功能

用FPGA實(shí)現MAC核所要完成的功能

作者: 時(shí)間:2017-10-13 來(lái)源:網(wǎng)絡(luò ) 收藏

發(fā)送模塊

  發(fā)送模塊可將上層協(xié)議提供的數據封裝之后通過(guò)接口發(fā)送給PHY。發(fā)送模塊可接收主機接口模塊的數據幀開(kāi)始和數據幀結束標志,并通過(guò) 主機接口從外部存儲器中讀取要發(fā)送的數據,然后對數據進(jìn)行封裝,然后通過(guò)PHY提供的載波偵聽(tīng)和沖突檢測信號,在信道空閑時(shí)通過(guò)接口將數據以4位的 寬度發(fā)送給PHY,最后由PHY將數據發(fā)送到網(wǎng)絡(luò )上。
  發(fā)送模塊由CRC生成模塊(crc_gen)、隨機數生成模塊(random_gen)、發(fā)送計數模塊(tx_cnt) 和發(fā)送狀態(tài)機(tx_statem_模塊等四個(gè)子模塊組成。

本文引用地址:http://dyxdggzs.com/article/201710/365687.htm

CRC生成模塊(crc_gen)

  該模塊用于計算發(fā)送數據的CRC值,并將CRC值添加到數據幀的幀校驗序列字段(FCS)內。為了提高效率,并考慮到與PHY的數據通道 為4位,設計時(shí)可采用4位并行CRC計算方法,算法中可使用一個(gè)次態(tài)函數,并通過(guò)循環(huán)迭代來(lái)模擬移位操作。這樣,發(fā)送模塊就可以在邊發(fā)送數據到PHY的同 時(shí),一邊計算CRC,這樣當數據發(fā)送完時(shí),CRC值也計算完成了。

隨機數生成模塊(random_gen)

  如在發(fā)送過(guò)程中檢測到?jīng)_突,發(fā)送模塊就先發(fā)送擁塞碼(jam),隨后停止發(fā)送。在下次重新發(fā)送之前,發(fā)送模塊會(huì )先執行一個(gè)后退 (backoff)操作,即發(fā)送模塊等待一個(gè)半隨機(生成的隨機數有范圍限制)的時(shí)間之后再開(kāi)始發(fā)送。該隨機數就是由隨機數生成模塊產(chǎn)生的,它采用經(jīng)典的 截斷二元指數后退算法,后退的時(shí)間是一個(gè)與發(fā)生沖突次數有關(guān)的隨機數,隨著(zhù)沖突的次數增多,用于生成該隨機數的范同也將逐漸增大,以減少沖突的概率。

發(fā)送計數模塊(tx_cnt)

  發(fā)送計數模塊由半字節計數器(nibcnt)、字節計數器和重試次數計數器(retrycnt)三個(gè)計數器組成。其中重試次數計數器 (retrycnt)可對發(fā)送某個(gè)幀時(shí)產(chǎn)生沖突次數進(jìn)行計數。當計數器的值達到最大重試次數時(shí),它將放棄重試,并丟棄發(fā)送緩沖器內的數據。同時(shí),重試計數 器的值還被隨機數生成模塊用于計算下次重試之前需要后退(backoff)的時(shí)隙的個(gè)數。
  半字節計數器和字節計數器分別用于對發(fā)送過(guò)程中的半字節(bibble)和字節進(jìn)行計數。
  信道忙時(shí),發(fā)送模塊會(huì )一直等待,半字節計算器一直計數。當計數到額定等待時(shí)間時(shí)(最大幀長(cháng)度的兩倍,即3036字節時(shí)間),系統會(huì )根據設置放棄 發(fā)送或是一直等待(可選功能)。一旦信道空閑再進(jìn)入幀間間隙周期(≥96個(gè)比特時(shí)間),南半字節計數器從零開(kāi)始計數。幀間間隙分為兩個(gè)部分,在前2/3個(gè) 周期中,如果檢測到信道忙信號,則半字節計數器復位,發(fā)送模塊重新開(kāi)始等待;在后l/3周期中,即使檢測到信道忙信號,半字節計數器也不會(huì )復位,而是繼續 計數,以保證每個(gè)站點(diǎn)公平的競爭信道。而當半字節計數器的值達到幀問(wèn)間隙周期時(shí),此時(shí)如果有數據等待發(fā)送,發(fā)送模塊就開(kāi)始發(fā)送數據。此外,半字節計算器還 用于前序碼的生成和短幀的判斷,在數據幀的長(cháng)度小于最小幀時(shí),發(fā)送模塊必須根據系統設置進(jìn)行填充或不填充。
  字節計算器還可用于滯后沖突(late collision)和超長(cháng)幀的判斷。當滯后沖突發(fā)生時(shí),正在發(fā)送的數據將被丟棄。超長(cháng)幀的判斷則是從對幀內容(包括FCS)進(jìn)行字節計數,如果字節計數 器的值大于最大有效幀的長(cháng)度(1518個(gè)字節),發(fā)送模塊就根據系統設置(是否支持超長(cháng)幀)丟棄或發(fā)送。

發(fā)送狀態(tài)機模塊(tx_statem)

  發(fā)送狀態(tài)機模塊是整個(gè)發(fā)送模塊的核心,主要用于控制整個(gè)發(fā)送過(guò)程。發(fā)送狀態(tài)機由I-die_State、Preamble_State、 Data0_State、 Da-tal_State、 PAD_State、 FCS_State、 IPG_State、Jam_State、BackOff_State、Defer_State等十個(gè)狀態(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ā)送模塊根據系統設置是否在數據之后來(lái)添加填充碼。然后,狀態(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、da-tal或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)。

MAC接收模塊

  MAC接收模塊負責數據幀的接收。當外部PHY將通信信道的串行數據轉換為半字節長(cháng)的并行數據并發(fā)送給接收模塊后,接收模塊會(huì )將這些半字節數據 轉換為字節數據,然后經(jīng)過(guò)地址識別、CRC校驗、長(cháng)度判斷等操作后,再通過(guò)主機接口寫(xiě)入外部存儲器,并在主機接口模塊的接收隊列中記錄幀的相關(guān)信息。此 外,接收模塊還負責前序碼和CRC的移除。
  接收模塊由CRC校驗模塊、地址識別模塊、接收計數器模塊和接收狀態(tài)機模塊等四部分組成。
  接收模塊中的CRC校驗模塊可通過(guò)檢查輸入幀的CRC值來(lái)驗證幀的正確性。其算法與CRC生成模塊相同。
  地址識別模塊用于決定是否接收收到的幀,接收模塊首先接收輸入幀而不管目的地址,隨后由地址識別模塊檢查幀中的目的地址。若MAC被設置為混雜模式(Promiscuous mode)且目的地址為廣播地址,同時(shí)允許接收廣播幀,幀則被接收。否則,幀被丟棄。
  接收計數器模塊由字節計數器(Bytecnt)和幀間間隙計數器(IFGcnt)組成。字節計數器在接收幀過(guò)程中將對字節進(jìn)行計數,以用于識別 幀中的各個(gè)字段(前序碼、目的地址字段、數據、FCS等)以及判斷超長(cháng)幀。幀間間隙計數器則對兩幀之間的間隔時(shí)間進(jìn)行計數,以用于判斷下一幀數據的開(kāi)始。 IEEE 802.3規定,兩幀之間的間隔至少必須為96個(gè)比特時(shí)間(10 Mbps中為9 600ns,100 Mbps中為960 ns)。如果兩幀之間的間隔小于要求,幀將被丟棄。
  接收狀態(tài)機為接收模塊的核心,用于控制整個(gè)接收過(guò)程。接收狀態(tài)機由Idle_State、Drop_State、Preamble_State、 SFD_State、 Da-ta0_State、Data1_State等六個(gè)狀態(tài)組成。
  系統復位后,狀態(tài)機處于Drop_State。如果此時(shí)的數據有效信號(MRxDV)無(wú)效,狀態(tài)機馬上進(jìn)入Idle_State狀態(tài),并一直處于Idle等待接收輸入幀。
  當接收模塊檢測到數據有效信號之后,狀態(tài)機將進(jìn)入Preamble_State,并開(kāi)始接收前序碼。此后再狀態(tài)機進(jìn)入SFD_State,接收 一個(gè)字節的幀起始定界符,之后,根據IFGcnt計數器的值進(jìn)入不同的狀態(tài)。如果,IFGcnt所確定的時(shí)間大于96個(gè)比特時(shí)間,狀態(tài)機將進(jìn)入Data0 狀態(tài)以接收字節的低4位,然后是Data1狀態(tài),并接收字節的高4位,之后又回到Data0狀態(tài)。狀態(tài)機就一直在這兩個(gè)狀態(tài)之間循環(huán),直到數據接收完畢 (PHY清除MRxDV信號)后進(jìn)入Idle,以重新等待接收新的數據;如果接收到幀起始定界符時(shí),IFGcnt計數器所確定的時(shí)間小于96個(gè)比特時(shí)間, 那么狀態(tài)機將進(jìn)入Drop_State狀態(tài),并一直維持該狀態(tài)直到數據有效信號結束(PHY清除MRxDV信號)。之后,狀態(tài)機再同到Idle等待接收新 的數據。
  如果在接收前序碼、幀起始定界符和數據期間,數據有效信號被清除,那么,狀態(tài)機將回到Idle。

MAC的其它模塊

MAC狀態(tài)模塊

  在接收過(guò)程的狀態(tài)信息中,接收錯誤表明PHY在接收過(guò)程中檢測到了錯誤;接收到無(wú)效符號則表明接收到的幀中包括無(wú)效(PHY無(wú)法識別)的符號; 滯后沖突表明接收幀時(shí)檢測到滯后沖突信號;超短幀表明接收到的幀小于最短有效的長(cháng)度;超長(cháng)幀表明接收到的幀大于最大有效幀的長(cháng)度;半字節對齊錯誤表明接收 到的半字節不是偶數(即幀的長(cháng)度不是字節的整數倍);接收溢出則表明接收模塊來(lái)不及處理接收到的數據而導致接收FIFO溢出。
  在發(fā)送過(guò)程的狀態(tài)信息中,超過(guò)重試限制表示由于沖突導致的重試次數超過(guò)了額定值;滯后沖突表示發(fā)送幀的過(guò)程中檢測到的沖突信號超過(guò)了規定的沖突時(shí)間窗;延遲,表明在發(fā)送幀之前檢測到信道忙。

MAC控制模塊

  MAC控制模塊提供有全雙工操作中的流量控制功能,流量控制可通過(guò)發(fā)送和接收PAUSE的MAC控制幀來(lái)實(shí)現。當接收站點(diǎn)的接收緩沖區(Rx FIFO)快溢出而主機接口義來(lái)不及取走數據時(shí),系統就會(huì )發(fā)出流量控制請求。MAC在接收到流量控制請求之后,即發(fā)送PAUSE控制幀,以使數據發(fā)送站點(diǎn) 在指定的時(shí)間內暫停發(fā)送數據。
  數據發(fā)送站點(diǎn)接收到PAUSE控制幀后,便可根據幀中的參數設置PAUSE定時(shí)器。PAUSE定時(shí)器在減到0之前,發(fā)送模塊將暫停發(fā)送數據(PAUSE控制幀除外)。PAUSE定時(shí)器減到0之后,發(fā)送模塊將恢復發(fā)送數據。

MII管理模塊

  MII管理模塊用于控制MAC與外部PHY之間的接口,以用于對PHY進(jìn)行配置并讀取其狀態(tài)信息。該接口由時(shí)鐘信號MDC和雙向數據信號MDIO組成。MII管理模塊則由時(shí)鐘生成模塊、移位寄存器模塊和輸出控制模塊三部分組成。
  時(shí)鐘生成模塊可以根據系統時(shí)鐘和系統設置中的分頻系數來(lái)產(chǎn)生MII管理模塊的時(shí)鐘信號MDC(10 Mbps速率時(shí)為2.5 MHz,100 Mbps速率時(shí)為25 MHz)。
  移位寄存器模塊既可用于對PHY的控制數據進(jìn)行寫(xiě)入操作,也可用于對PHY的狀態(tài)信息進(jìn)行讀出操作。寫(xiě)控制數據時(shí),移位寄存器根據其他模塊的控 制信號將并行控制數據轉換為串行數據;而在讀狀態(tài)信息時(shí),移位寄存器則將PHY的串行數據轉換為并行數據,MAC中的其他模塊可將該并行數據寫(xiě)入適當的寄 存器。
  由于MDIO是雙向信號,因此,輸出控制模塊就用來(lái)決定MDIO是處于輸入狀態(tài)還是輸出狀態(tài)。當MDIO處于輸出狀態(tài)時(shí),移位寄存器輸出的串行控制數據在經(jīng)過(guò)時(shí)鐘同步后發(fā)送到PHY;當MDIO處于輸入狀態(tài)時(shí),移位寄存器將數據線(xiàn)上的串行數據轉換為并行數據。

主機接口模塊

  主機接口是運行以太網(wǎng)的上層協(xié)議(如TCP/IP協(xié)議)與MAC控制器的接口。通過(guò)該接口,上層協(xié)議可以設置MAC的工作模式并讀取MAC的狀態(tài)信息。該接口還可用于上層協(xié)議與MAC之間的數據交換。
  主機接口模塊內有一組寄存器,可用于存儲上層協(xié)議對MAC設置的參數以及MAC的狀態(tài)信息。上層協(xié)議對MAC設置的參數包括接收超短幀的使能、 添加填充碼使能、持發(fā)送超長(cháng)幀的使能、添加CRC校驗值使能、全雙工模式或半雙工模式、持超長(cháng)延遲(Defer)使能、混雜模式 (Promiscuous)、接收廣播幀使能、發(fā)送和接收使能、中斷源和中斷使能、幀間間隙的長(cháng)度、最大幀和最小幀的長(cháng)度、重試限制和沖突時(shí)間窗、MII 地址和MII控制命令、接收和發(fā)送隊列的長(cháng)度以及本機MAC地址等。
  上層協(xié)議通過(guò)MAC發(fā)送和接收數據的操作主要由主機接口模塊內的兩個(gè)隊列來(lái)進(jìn)行管理,這兩個(gè)隊列用于對等待發(fā)送的多個(gè)幀和接收到的多個(gè)幀進(jìn)行排隊。
  發(fā)送隊列主要記錄等待發(fā)送的幀的相關(guān)信息、發(fā)送該幀時(shí)對MAC的設置以及該幀發(fā)送完之后產(chǎn)生的狀態(tài)信息。幀的相關(guān)信息包括幀的長(cháng)度、幀在外部存 儲器中的地址、該幀是否準備好發(fā)送以及隊列中是否還有其它幀等待發(fā)送;對MAC的設置則包括中斷使能、填充使能、CRC使能;產(chǎn)生的狀態(tài)信息包括成功發(fā)送 之前的重試次數、由于達到重試限制而放棄發(fā)送、發(fā)送時(shí)產(chǎn)生的滯后沖突以及成功發(fā)送之前發(fā)生過(guò)的延遲。
  接收隊列主要對接收到的數據幀進(jìn)行排隊并記錄每個(gè)接收到的幀信息。這些信息包括幀的長(cháng)度、是控制幀還是普通數據幀、幀中包含無(wú)效符號、接收到的 幀太長(cháng)或太短、發(fā)生CRC錯誤、接收的過(guò)程中發(fā)生滯后沖突、幀是否接收完、隊列中是否還有其它已接收到的幀以及幀存儲在外部存儲器中的地址等。該位同時(shí)隊 列中還有針對每個(gè)幀的設置位,用來(lái)設置是否在接收到幀時(shí)產(chǎn)生中斷。
  發(fā)送隊列和接收隊列的長(cháng)度都可以在控制寄存器中進(jìn)行設置。



關(guān)鍵詞: FPGA MAC MII

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>