【科普贴】MDIO接口详解

一、 MDIO接口介绍

MDIO是Management Data Input/Output的缩写。MDIO接口包含在IEEE802.3协议中,是专用于MAC与PHY管理的串行总线接口。主要用于配置PHY芯片状态、读取寄存器、读取PHY地址、获取LINK状态等操作。与网口MII、RMII(TX_CLK、RX_CLK)等数据通讯无关。MDIO接口最多可以挂载32个PHY设备。

二、MDIO接口信号定义

MDIO接口是实时、半双工、串行的数据接口。MDIO接口由MDIO(Management Data Input/Output)线和MDC(Management Data Clock)线组成。

1、 MDC信号特点

单向传输:由MAC芯片驱动给PHY芯片,在MDC上升沿时对MDIO进行数据采样
信号要求:MDC可以是非周期性信号。协议对MDC的高低电平的最大宽度并没有限制,仅限制了MDC的最小高低电平宽度不能小于160ns,最小周期不能小于400ns。这意味着MDC最高频率不能超过2.5MHz(协议要求)
在这里插入图片描述

PS:当前很多PHY芯片为追求更高通讯速率,提高了MDC频率。如IP101实际要求的MDC最小周期为300ns,最高频率达到3.3MHz。

2、 MDIO信号特点

双向传输:MDIO为双向信号,MAC和PHY均可以接管。用来在MAC和PHY芯片之间的传递控制和状态信息。写寄存器是MAC驱动,读寄存器时PHY驱动。
数据传输:先传高位(MSB),后传低位(LSB)。
输出采用三态电路设计:MDIO需要接1.5K~10K的上拉电阻。
MAC芯片内部下拉MDIO:通过MDIO线上是否有上拉电阻,来检测MDIO接口是否连接到PHY芯片上。

3、 MDIO 接口时序

以MDC上升沿为基准。当MDIO由MAC(STA)输出时,需要满足建立时间、保持时间均大于10ns。当MDIO由PHY输出时,需要满足输出延迟不超过300ns。
在这里插入图片描述

如下是RTL的PHY芯片的手册关于时序的要求,可做参考。
在这里插入图片描述

三、MDIO接口通讯帧定义

MDIO接口用于MAC与PHY之间进行通讯,根据IEEE802.3协议中将MDIO分为两种帧格式分别是Clause22和Clause45。其中 Clause22帧格式,主要应用于千兆/百兆的以太PHY,Clause45定义帧格式,主要用于千兆以上的以太PHY。

1、帧格式Clause22

在这里插入图片描述

IDLE:空闲域。无MDIO帧发送时,MDIO接口输出高阻(外部有上拉电阻,总线上看到的是高电平)。
PRE:Preamble,前导。每帧发送前,MAC通过MDIO连续发送32个MDC周期的高电平,同时通过MDC输出32个时钟周期。前导的作用是为PHY建立同步提供时间。如果STA能够确定PHY可以接收管理帧,可以压缩前导的发送。
ST:2bit,Start of Frame。帧起始符,2’b01代表帧起始。
OP:2bit,操作码。2’b10代表读,2’b01代表写。
PHYAD:5bit,PHY地址。因此1个MDIO最多管理32个PHY。MDIO在访问PHY之前,需要提前知晓各个PHY的地址。所有PHY均需要对地址0进行响应。
REGAD:5bit,寄存器地址。总共32个寄存器地址,协议对前16个寄存器地址进行了详细的定义。其中地址0为控制寄存器,地址1为状态寄存器,其他14个地址为扩展寄存器。
TA:2bit,Turnaround。TA是地址传输和数据传输转换时的空闲时间。因为读操作的时候,地址传输和数据传输控制方不同,设置2bit TA的目的就是为了防止MDIO总线上产生竞争。
读情形,TA第1bit,PHY和MAC均释放总线控制输出高阻。TA第2bit,总线交由PHY控制,输出0,即读操作时TA为2‘bZ0(由于总线有上拉电阻存在,从总线上看到的依然是2’b10)。写情形,TA由MAC输出2‘b10。
DATA:16bit,数据域。写操作的时候,MAC用来发送写数据。读操作的时候,PHY用来发送读数据。

2、帧格式Clause45

在这里插入图片描述

MDIO Clause45在Clause22基础上做了一些扩展,目的是为了访问更多的寄存器。相对于Clause22帧格式而言,Clause45做了如下修改:
1)ST由01修改为00
2)OP进行了重新定义。00:地址帧 01:写 11:读 10:增量读(Post-read-increment-address)
3)PHYAD域修改名称为PRTAD,端口地址但仍代表PHY地址
4)REGAD修改为DEVAD,Clause45将PHY内部子模块的地址进行细分,这些子模块用DEVAD寻址。子模块内部的寄存器则使用地址帧进行寻址。

四、MDIO逻辑分析仪测试实例

使用逻辑分析仪实际分析MAC与SOC之前的通讯,对接口协议加深理解。
如下图是MAC与SOC之前MDIO的通讯波形(Clause22)。
在这里插入图片描述

1)START 01 确定使用Clause 22帧格式
2)OP 10 进行读的操作
3)PHY地址0X03
4)读寄存器0X01的值
5)TA 10 进行读操作
6)PHY发送0X786D值

  • 20
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的SystemVerilog代码示例,用于将MDIO接口转换为APB接口: ``` module mdio_to_apb ( input logic clk, input logic resetn, input [4:0] logic mdio_addr, input [4:0] logic mdio_reg, input logic mdio_rd, input [15:0] logic mdio_data_in, output [31:0] logic apb_addr, output [31:0] logic apb_data_out, output logic apb_rd_en, output logic apb_wr_en, output logic apb_cs_n, output logic apb_resetn ); // Define APB register mapping localparam APB_ADDR_OFFSET = 32'h10000000; localparam APB_CTRL_REG = 0; localparam APB_DATA_REG = 4; // Define MDIO register mapping localparam MDIO_CTRL_REG = 0; localparam MDIO_STATUS_REG = 1; localparam MDIO_PHYID_REG = 2; localparam MDIO_PHYID2_REG = 3; localparam MDIO_ANAD_REG = 4; localparam MDIO_ANLPAD_REG = 5; // Define internal registers logic [15:0] mdio_data_out; logic [31:0] apb_addr_reg; logic apb_rd_en_reg; logic apb_wr_en_reg; // Control register logic [31:0] ctrl_reg; assign apb_addr = apb_addr_reg; assign apb_data_out = ctrl_reg[31:0]; assign apb_rd_en = apb_rd_en_reg; assign apb_wr_en = apb_wr_en_reg; assign apb_cs_n = 1'b0; assign apb_resetn = resetn; always_ff @(posedge clk) begin // Read from MDIO if (mdio_rd) begin case (mdio_addr) MDIO_CTRL_REG: begin mdio_data_out = {mdio_data_in[0], ctrl_reg[31:1]}; end MDIO_PHYID_REG: begin mdio_data_out = 16'h1234; end // Add additional cases for other MDIO registers here endcase end // Write to MDIO else if (!mdio_rd) begin case (mdio_addr) MDIO_CTRL_REG: begin mdio_data_out = mdio_data_in[15:1]; ctrl_reg[31:1] = mdio_data_in[15:1]; end // Add additional cases for other MDIO registers here endcase end // Generate APB address apb_addr_reg = APB_ADDR_OFFSET + (mdio_reg << 2); // Generate APB control signals if (mdio_rd) begin apb_rd_en_reg = 1'b1; apb_wr_en_reg = 1'b0; end else if (!mdio_rd) begin apb_rd_en_reg = 1'b0; apb_wr_en_reg = 1'b1; end end endmodule ``` 该代码模块包括一个名为`mdio_to_apb`的模块,该模块将MDIO接口转换为APB接口。该模块包括一个时钟信号(`clk`)和复位信号(`resetn`),以及输入MDIO信号和输出APB信号。该模块还定义了一些内部寄存器和常数,用于将MDIO寄存器映射到APB寄存器。在时钟上升沿时,该模块读取MDIO接口并将数据写入APB接口,或者从APB接口读取数据并将其写入MDIO接口中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值