在以太網通訊中,設備之間的物理局鏈路均由 PHY 芯片創建。PHY 芯片內部含有一些列寄存器,用戶可經過這些寄存器來配置 PHY 芯片的工做模式以及獲取 PHY 芯片的若干狀態信息,如鏈接速率、雙工模式、自協商狀態等。PHY 內部寄存器的讀寫經過 MDIO 接口進行。
web
8.5.2.1 MDIO 接口微信
MDIO 接口由數據傳輸時鐘 MDC 和雙向數據信號 MDIO 組成,以下圖所示app
圖8‑33 MDIO接口ide
MDIO 爲雙向接口,在 PHY 芯片外部須要鏈接上拉電阻, 1 個 MDIO 接口能夠同時鏈接多個 PHY 芯片。因爲 MDIO 協議中 PHY 芯片地址的位寬爲 5bit,所以, 1 個 MDIO 接口最多能夠同時鏈接 32 個PHY 芯片。字體
表8‑9 MDIO接口通訊協議flex
Preambleui |
Starturl |
Opcodespa |
PHY address.net |
Register address |
Turn-around |
Register data |
Idle |
32bit 1 |
01 |
Read:10 Write:01 |
5bit |
5bit |
Read:z0 Write:10 |
16 bit |
z |
MDIO的寄存器讀時序波形以下圖所示。
圖8‑34 MDIO的寄存器讀時序波形
MDIO的寄存器寫時序波形以下圖所示。
圖8‑35 MDIO的寄存器寫時序波形
8.5.2.2 PHY關鍵參數
通常的PHY芯片最高可支持15Mhz的MDC時鐘,本例程中使用了10Mhz的頻率。
(1)PHY芯片地址
通常的PHY地址都是能夠經過硬件進行設置,查看相關原理圖就能夠肯定。
(2)控制寄存器
通常的PHY中地址爲0x00的寄存器可用於芯片的復位以及其餘功能的控制。本例程中用到了其中的bit9,用於使芯片從新進行自協商。寄存器描述以下圖所示。
圖8‑36 0x00的寄存器
(3)狀態寄存器
通常PHY中地址爲0x19的寄存器反映了芯片當前的狀態。本例程中用到了bit15,bit10~8,bit2,用於判斷芯片自協商、鏈接速率、雙工狀態等信息。寄存器描述以下圖所示。
圖8‑37 0x19的寄存器
8.5.2.1 模塊設計
(一)模塊結構
MDIO接口模塊結構以下圖所示,由模塊mdio_top及其子模塊mdio_control組成。
圖8‑38 MDIO接口模塊結構
(二)模塊接口
(1)mdio_top模塊
mdio_top模塊各接口定義以下表所示。
表8‑10 mdio_top模塊接口定義
接口名稱 |
信號方向 |
接口說明 |
clk |
input |
輸入參考時鐘 |
reset |
input |
模塊全局復位信號,高電平有效 |
mdio_en |
input |
MDIO接口使能信號,高電平有效 |
link_ok[1:0] |
output |
2個PHY芯片鏈路狀態正常指示信號,高電平有效 |
mdc |
output |
MDIO接口mdc時鐘信號 |
mdio |
inout |
MDIO接口mdio雙向數據信號 |
(2)mdio_control模塊
mdio_control模塊各接口定義以下表所示。
表8‑11 mdio_control模塊接口定義
接口名稱 |
信號方向 |
接口說明 |
mdc_clk |
input |
輸入參考時鐘 |
reset |
input |
模塊全局復位信號,高電平有效 |
mdio_write_en |
input |
MDIO接口寫寄存器使能信號,高電平有效 |
mdio_read_en |
input |
MDIO接口讀寄存器使能信號,高電平有效 |
phy_address[4:0] |
input |
PHY芯片地址 |
register_address[4:0] |
input |
須要讀或寫的寄存器地址 |
mdio_write_done |
output |
寫寄存器完成指示信號 |
mdio_read_done |
output |
讀寄存器完成指示信號 |
write_register_data[15:0] |
input |
經過MDIO接口寫入PHY芯片的寄存器值 |
read_register_data[15:0] |
output |
經過MDIO接口從PHY芯片讀取的寄存器值 |
mdc |
output |
MDIO接口mdc時鐘信號 |
mdio |
inout |
MDIO接口mdio雙向數據信號 |
(三)模塊原理
(1)mdio_top模塊
本模塊主要完成PHY芯片狀態監控和配置,並控制子模塊mdio_control完成2個PHY芯片的寄存器的寫入和讀取。本模塊的工做狀態機以下圖所示。
圖8‑39 mdio_top模塊工做狀態機
IDLE狀態
本模塊復位後隨即進入本狀態。在本狀態,本模塊等待外部模塊輸入MDIO啓動信號mdio_en拉高,若接收到啓動信號爲1,則進入READ PHY STATUS狀態,不然在本狀態循環。
READ PHY STATUS狀態
在本狀態時,本模塊向子模塊mdio_control發送所要讀取的PHY芯片地址phy_address和寄存器地址register_address,並將mdio_read_en使信號置1,使能mdio_control模塊接收數據,隨後進入WAIT AUTO NEG DONE狀態。在本例程中,讀取的爲1.2.2節中所述地址爲0x19的狀態寄存器的bit15,bit10~8,bit2。該寄存器包含了當前以太網鏈路的鏈接速率、雙工模式、鏈接狀態等信息。
WAIT AUTO NEG DONE狀態
在本狀態時,本模塊等待mdio_control模塊返回寄存器讀取完成信號mdio_read_done。當寄存器讀取完成後,根據寄存器的值判斷PHY芯片是否完成自協商,鏈接速率是否爲1000Mbps,且傳輸模式是否爲全雙工。若知足上述條件,則將鏈路狀態指示信號link_ok信號置1,並進入DELAY狀態;若不知足條件,則將link_ok信號置0,並進入PHY RE AUTO NEG狀態。若寄存器未讀取完畢則在本狀態循環。
PHY RE AUTO NEG狀態
在本狀態時,本模塊向子模塊mdio_control發送所需寫入的PHY芯片地址phy_address和寄存器地址register_address,並將mdio_write_en使信號置1,使能mdio_control模塊發送數據,隨後進入DELAY狀態。在本例程中,寫入的爲1.2.1節中所述的地址爲0x00的控制寄存器的bit9,使PHY芯片從新進行自協商,從新創建以太網鏈接。
DELAY狀態
在本狀態時,本模塊進行延時操做,等待以太網鏈路的從新創建。延時完成後進入READ PHY STATUS狀態。該延時值可根據實際需求進行設置。
(2)mdio_control模塊
本模塊在mdio_top模塊的控制下,完成MDIO接口協議的實現,以及PHY芯片相應寄存器的讀寫操做。
模塊中,經過ODDR實現PHY芯片mdc時鐘的輸出。以下圖。
經過IOBUF實現mdio雙向端口,以下圖。其中mdio_direction用於控制mdio接口的方向。
本模塊的工做狀態機以下圖所示。
圖8‑40 mdio_control模塊工做狀態機
IDLE狀態
本模塊復位後隨即進入本狀態。在本狀態時,本模塊等待mdio_top模塊拉高讀寄存器使能信號mdio_read_en或寫寄存器使能信號mdio_write_en。若讀或寫使能信號拉高則進入SEND PREAMBLE狀態,不然在本狀態循環。
SEND PREAMBLE狀態
在本狀態時,本模塊經過MDIO接口發送32bit的MDIO通訊前綴「1」,若mdio_top拉高是的讀寄存器使能信號,則進入READ REG狀態,若爲寫寄存器使能信號則進入WRITE REG狀態。
READ REG狀態
在本狀態時,本模塊根據mdio_top模塊輸入的PHY芯片地址phy_address和寄存器地址register_address,按照MDIO通訊協議從PHY芯片讀出相應地址的寄存器值read_register_data,輸出至mdio_top模塊,同時將讀寄存器完成信號mdio_read_done拉高一個時鐘週期,隨後進入IDLE狀態。
WRITE REG狀態
推薦閱讀
媒體訪問控制(MAC,Media Access Control)
媒體獨立接口(MII,Meida Independent Interface)
點擊上方字體便可跳轉閱讀喲
本文分享自微信公衆號 - OpenFPGA(OpenFPGA)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。