FPGA实战:用KSZ9031RN PHY芯片的MDIO接口,手把手教你搞定千兆网自协商(附Verilog代码)

张开发
2026/4/21 4:23:18 15 分钟阅读

分享文章

FPGA实战:用KSZ9031RN PHY芯片的MDIO接口,手把手教你搞定千兆网自协商(附Verilog代码)
FPGA实战KSZ9031RN PHY芯片MDIO接口开发全流程解析当你在FPGA开发板上首次看到千兆网口的LED指示灯闪烁时那种成就感堪比第一次点亮LED。但要让这颗KSZ9031RN PHY芯片真正工作起来MDIO接口的配置往往是第一个需要攻克的堡垒。不同于常见的I2C或SPI接口MDIO协议在工业级网络设备中扮演着物理层配置的关键角色而Microchip的KSZ9031RN更是以其稳定的RGMII接口和丰富的配置选项成为中高端FPGA开发板的标配PHY芯片。1. 硬件环境搭建与复位策略豌豆开发板上的KSZ9031RN电路设计堪称教科书级别的参考方案。这颗PHY芯片通过RGMII接口与FPGA相连仅需4对数据线即可实现千兆速率传输相比传统GMII接口节省了50%的引脚资源。但要注意RGMII接口的时序约束更为严格在125MHz时钟频率下需要同时利用上升沿和下降沿采样数据。硬件复位电路设计要点复位引脚(RESETn)需保持低电平至少1ms推荐使用FPGA的GPIO控制复位而非简单的RC电路复位期间确保供电电压稳定在3.3V±5%实测发现KSZ9031RN对硬件复位更为敏感软复位成功率仅约60%这与芯片手册描述有所出入。建议始终采用硬件复位确保稳定性。复位时序示例代码// 硬件复位模块 module phy_reset( input clk_50m, // 50MHz时钟 output reg phy_rst_n ); reg [31:0] cnt; always (posedge clk_50m) begin if(cnt 32d50_000) begin // 保持1ms低电平 phy_rst_n 1b0; cnt cnt 1; end else begin phy_rst_n 1b1; end end endmodule2. MDIO协议状态机实现MDIO协议看似简单但时序要求极为严格。协议时钟MDC必须不超过2.5MHz且数据变化必须在时钟下降沿采样在上升沿。这种双边沿操作对FPGA时序约束提出了挑战。协议状态机关键状态IDLE等待启动条件PREAMBLE发送32位前导码(全1)ST_OP发送起始位(01)操作码PHYAD_REGAD发送PHY地址寄存器地址TA转向阶段(读操作时需要切换驱动方向)DATA数据传输阶段END恢复高阻状态状态转移图示例parameter [2:0] IDLE 3d0, PREAMBLE 3d1, ST_OP 3d2, PHYAD_REGAD3d3, TA 3d4, DATA 3d5, END 3d6; always (posedge clk or negedge rst_n) begin if(!rst_n) state IDLE; else case(state) IDLE: if(start) state PREAMBLE; PREAMBLE: if(bit_cnt31) state ST_OP; // ...其他状态转移 endcase end时钟分频方案对比输入时钟分频系数输出频率适用场景50MHz202.5MHz极限速率50MHz501MHz稳定运行100MHz402.5MHz高频系统3. 关键寄存器配置详解KSZ9031RN的寄存器空间包含32个16位寄存器但实际开发中主要关注以下三个核心寄存器3.1 基本控制寄存器(0x00)Bit[15]软复位(1启动复位)Bit[12]自协商使能Bit[9]重启自协商Bit[8]双工模式(1全双工)// 软复位配置示例 localparam SOFT_RESET 16h8000; mdio_write(5h01, 5h00, SOFT_RESET);3.2 基本状态寄存器(0x01)Bit[5]自协商完成标志Bit[2]链路状态Bit[1] Jabber检测Bit[0]扩展能力状态检测代码片段reg [15:0] status_reg; mdio_read(5h01, 5h01, status_reg); if(status_reg[5] status_reg[2]) led 1b1; // 链路正常 else error 1b1;3.3 PHY控制寄存器(0x1F)Bit[6:4]速度指示(100千兆)Bit[3]全双工指示Bit[2]]: 主从模式4. 调试技巧与常见问题使用Xilinx的ILA或Intel的SignalTap进行调试时重点关注以下信号必须捕获的信号eth_mdc时钟信号是否连续eth_mdio数据变化是否在时钟下降沿状态机当前状态位计数器值典型问题排查表现象可能原因解决方案读取全FFPHY未响应检查PHY地址、复位状态TA阶段无响应MDIO方向未切换验证三态控制逻辑数据不稳定时序违例增加时钟约束自协商失败硬件连接问题检查RJ45接口LED状态调试波形分析要点确认前导码为连续的32个1检查PHY地址是否正确(通常为5b00001)读操作时TA阶段是否出现低电平数据是否在正确的时钟边沿采样// ILA触发条件设置示例 ila_trigger ( .clk(eth_mdc), .probe0(state), // 状态机状态 .probe1(bit_cnt), // 位计数器 .probe2(eth_mdio) // MDIO信号 );在多次项目实践中最棘手的往往是PHY芯片的复位时序问题。曾遇到过一个案例硬件复位信号与电源上电时序不同步导致PHY内部状态机卡死。最终通过在FPGA代码中加入延时复位逻辑解决了问题。这也提醒我们PHY芯片的硬件设计不能完全依赖参考电路必须结合实际调试经验进行调整。

更多文章