简介:这份资源是裕太微电子YT8521S PHY芯片的硬件电路设计参考图,面向从事FPGA、CPU与以太网接口开发的硬件工程师,重点解决RGMII转SGMII的电路设计与配置问题。参考图涵盖LS2K1000芯片部分原理图、YT8521S功能与电压配置,以及XC7VX690T芯片部分原理图,并给出复位信号由CPLD或RC电路控制、上拉建议采用3.3V等关键设计细节。资源包共1个PDF文件,约193KB,内容为完整的原理图与配置说明,便于直接对照布线。软件配置方面强调smi_sds_phy需设为SDS模式、mode_sel配置为3'b101即SGMAC_TO_RGPHY模式,并提示故障时优先排查软件配置。该电路已通过实际生产测试,RGMII转SGMII功能验证无误,可放心用于项目设计。目前已有1557人学习下载,适合需要快速搭建稳定以太网通信电路的开发者参考。
1. 从一张 25 页参考图说起:YT8521S 到底解决了什么
如果你手上有 LS2K1000 这类国产 CPU,想接千兆以太网,又不想让 CPU 的 GMAC 直接去扛 RGMII 的时序,那 YT8521S 这颗 PHY 大概率会进入你的选型清单。它的核心价值就一句话:把 CPU 侧的 RGMII 接口,转换成可以走背板、走光模块、走长距离的 SGMII 接口。参考图里画得很清楚,LS2K1000 的 GMAC 出 RGMII,进 YT8521S,YT8521S 再出 SGMII 给 FPGA(XC7VX690T)或者直接上光模块。这套组合在国产化板卡里非常常见,尤其是需要多网口、需要接口灵活切换的场景。
但参考图不是拿来照抄就完事的。我见过太多人把原理图连对,结果板子回来 ping 不通,最后卡在软件配置上。摘要里那句“RGMII 转 SGMII 功能测试验证没有问题,主要需要注意功能配置和软件配置”,翻译成大白话就是:硬件只要不画错,基本能跑;跑不起来,八成是寄存器没配对。这篇笔记就按“先看懂图、再配好寄存器、最后避开那几个必踩的坑”这个顺序,把这份参考图拆开讲一遍。
2. YT8521S 硬件设计拆解:电源、时钟与 RGMII 走线
2.1 三路电源怎么配,CFG_LDO 引脚别悬空
YT8521S 的电源设计是第一个容易翻车的地方。参考图里出现了 VCC_3V3、VCC_1V8、DVDD_RGMII、AVDD33_G1 这几路,看起来多,其实逻辑很清晰:数字核心和 RGMII 接口电平可以走 3.3V 或 1.8V,模拟部分固定 3.3V,内部 LDO 的输出需要外部电容稳住。
关键在 CFG_LDO[1:0] 这两个引脚。参考图里 LED2/CFG_LDO1 和 LED1/CFG_LDO0 是复用引脚,上电时它们的状态决定了芯片内部 LDO 的输出电压。图里标注了CFG_LDO[1:0]=2b00时DVDD_RGMII=3.3V,也就是说如果你要让 RGMII 侧走 3.3V 电平,这两个脚在上电瞬间都得是低电平。实际画板时,这两个脚通常各挂一个下拉电阻到地,同时兼做 LED 驱动。注意,上电之后它们就变成 LED 控制了,所以下拉电阻的阻值要兼顾 LED 亮度和上电默认电平,一般 4.7K 是常见选择。
电源去耦这块,参考图给的是 100nF 和 4.7uF 组合,每个电源引脚附近放一个 100nF,每路电源入口放一个 4.7uF。别省这几个电容,PHY 对电源纹波比 CPU 敏感得多,尤其是 AVDD33 这路模拟电源,纹波大了眼图直接闭合。
2.2 25MHz 参考时钟:ppm 和电平标准要卡死
YT8521S 需要一个 25MHz 的参考时钟,参考图里标的是25MHZ/3.3V/25ppm/CMOS。这三个参数一个都不能含糊:
- 25MHz:这是 PHY 内部 PLL 的基准,给错了芯片根本不工作。
- 3.3V CMOS 电平:如果时钟源是 1.8V 的,要么加电平转换,要么选支持双电压的晶振。直接接 1.8V 时钟,PHY 可能起振但输出眼图很差。
- 25ppm:千兆以太网对时钟精度要求是 ±50ppm 以内,25ppm 留了足够余量。用 100ppm 的便宜晶振,短距离可能能通,温度一变就丢包。
参考图里 REFCLK_PHY_G1_25M 是直接进芯片的,走线要尽量短,包地处理。如果板上已经有 25MHz 时钟源,可以共用,但要注意驱动能力,一个时钟源带多个 PHY 时,加个时钟 buffer 更稳妥。
2.3 RGMII 走线:等长不是玄学,是底线
RGMII 接口在 1000M 模式下,时钟频率是 125MHz,数据是双边沿采样,等效 250Mbps 每根线。参考图里 RGMII1_TXD[3:0]、RGMII1_RXD[3:0]、RGMII1_TX_CTL、RGMII1_RX_CTL 这些信号,加上时钟 RGMII1_TXC 和 RGMII1_RXC,一共 14 根线。
我一般会要求:
- 数据线相对时钟线的等长控制在 ±50mil 以内,越短越好。
- 时钟线包地,不要跨分割。
- 串联端接电阻放靠近驱动端,参考图里 RGMII 线上有 4.7K 上拉,那是给 MDIO 用的,别和数据线端接搞混。
如果走线实在绕不开,宁可加长时钟线去匹配数据线,也不要让数据线之间差太多。RGMII 没有源同步训练机制,全靠硬件保证时序窗口。
3. RGMII 转 SGMII 的寄存器配置:mode_sel 和 smi_sds_phy 怎么设
3.1 先搞清楚数据流向:SGMAC_TO_RGPHY 是什么意思
YT8521S 内部有两个 MAC 侧接口:一个 RGMII,一个 SGMII。它要做的是在两者之间做转换。参考图里 FPGA 的 SGMII 接 YT8521S 的 SGMII 侧,CPU 的 RGMII 接 YT8521S 的 RGMII 侧。数据从 CPU 出来,走 RGMII 进 PHY,PHY 转成 SGMII 发给 FPGA;反过来 FPGA 发 SGMII 进来,PHY 转成 RGMII 给 CPU。
mode_sel这个配置项就是告诉 PHY:你站在哪一边。摘要里写的3'b101:SGMAC_TO_RGPHY 模式,意思是 SGMII 侧的 MAC(也就是 FPGA 里的 SGMAC)作为主控,数据流向是从 SGMII 到 RGMII。这个模式选择错了,数据方向就反了,表现就是一边能收不能发,或者两边都收不到。
3.2 配置代码示例:MDIO 写寄存器
配置是通过 MDIO 接口写 PHY 寄存器完成的。CPU 侧一般用 Linux 的 mdio-tools 或者直接在 U-Boot 里用 mii 命令。下面是一段用 Python 通过 MDIO 写寄存器的示例,假设 MDIO 总线已经挂好:
import mii # 打开 MDIO 总线,总线号根据实际硬件调整 bus = mii.MDIOBus(0) # PHY 地址,参考图里 PHYAD0 上电为低电平,所以地址是 0 phy_addr = 0 # 第一步:切换到扩展寄存器页,YT8521S 的扩展寄存器在 page 0xa000 以上 # 写寄存器 0x1e(页面选择寄存器)为 0xa000 bus.write(phy_addr, 0x1e, 0xa000) # 第二步:配置 smi_sds_phy 为 SDS 模式 # 寄存器地址 0x10,bit[2] 置 1 表示 SDS 模式 reg_val = bus.read(phy_addr, 0x10) reg_val |= (1 << 2) bus.write(phy_addr, 0x10, reg_val) # 第三步:配置 mode_sel 为 3'b101 # 寄存器地址 0x11,bit[2:0] 写 0b101 reg_val = bus.read(phy_addr, 0x11) reg_val &= ~0x07 # 清低三位 reg_val |= 0x05 # 写入 101 bus.write(phy_addr, 0x11, reg_val) # 第四步:软复位,让配置生效 bus.write(phy_addr, 0x00, 0x9140) print("YT8521S 配置完成,等待复位完成...")这段代码的逻辑是:先切到扩展页,因为 YT8521S 的 SDS 和 mode_sel 相关寄存器不在标准页里;然后分别设置 SDS 模式和 mode_sel;最后软复位。注意软复位后要等至少 100ms 再访问 PHY,否则读回来的都是无效值。
参数说明:phy_addr由 PHYAD0 引脚上电时的电平决定,参考图里 PHYAD0 上电为低,所以地址是 0。如果你的板子 PHYAD0 上拉,地址就是 1。0x1e是页面选择寄存器,写0xa000进入扩展页,写完配置后建议切回0x0000标准页,避免后续调试时读错寄存器。
3.3 复位信号:CPLD 控制还是 RC 电路
参考图里 G1_RESET_N 这个信号,标注了“复位由 CPLD 控制,或者设计 RC 电路”。两种方式各有适用场景:
- CPLD 控制:适合板上有 CPLD 且需要精确控制复位时序的场景。CPLD 可以在电源稳定后延时 10ms 再释放复位,确保 PHY 内部 LDO 和 PLL 都稳了。
- RC 电路:成本低,一个电阻一个电容搞定。参考图里 R64 是 1K,C16 是 100nF,时间常数 100us,对于 PHY 复位来说偏短,实际调试时如果发现复位不干净,可以把电容加大到 1uF,时间常数拉到 1ms。
复位信号上拉建议接 3.3V,因为 YT8521S 的复位引脚是 3.3V 域,上拉到 1.8V 可能导致复位阈值不够,芯片一直处于复位状态。
4. 避坑排查:板子回来 ping 不通,先查这五件事
4.1 现象:MDIO 读不到 PHY ID,所有寄存器返回 0xFFFF
原因:MDIO 总线上拉电阻没接,或者 PHY 地址配错。参考图里 RGMII1_MDC 和 RGMII1_MDIO 各有一个 4.7K 上拉到 DVDD33_G1,如果漏了这两个电阻,MDIO 总线就是浮空的,读回来全是 1。
解决:万用表量 MDIO 对地电压,正常应该在 1.6V 左右(3.3V 分压)。如果量到 0V 或 3.3V,检查上拉电阻和 PHY 供电。另外确认 PHYAD0 引脚上电电平,地址不对也读不到。
4.2 现象:PHY ID 能读到,但 link 一直 down
原因:参考时钟没起振,或者时钟电平不对。YT8521S 对参考时钟的幅度有要求,3.3V CMOS 时钟的峰峰值至少要 2.5V。如果用 1.8V 时钟直接接,芯片可能识别不到。
解决:示波器量 REFCLK_PHY_G1_25M 引脚,看频率和幅度。频率不对换晶振,幅度不够加电平转换或者换 3.3V 晶振。另外检查 CFG_LDO 引脚上电电平,如果配成了 1.8V 但实际给的是 3.3V,内部 LDO 可能没工作。
4.3 现象:RGMII 侧能通,SGMII 侧不通
原因:mode_sel 配错,或者 smi_sds_phy 没切到 SDS 模式。这是最常见的软件配置问题。摘要里专门强调了这两个配置,说明实际调试中踩坑的人不少。
解决:按第 3 章的代码重新配一遍,重点确认0x11寄存器的低三位是不是0b101,0x10寄存器的 bit2 是不是 1。配完软复位,等 100ms 再测。如果还不通,读回这两个寄存器确认写入生效。
4.4 现象:ping 通但丢包严重,大包必丢
原因:RGMII 走线等长没做好,或者时钟线被干扰。RGMII 在千兆模式下时序窗口很窄,数据线之间差超过 100mil 就可能采样错。
解决:示波器抓 RGMII1_TXC 和 RGMII1_TXD0,看数据眼图。如果眼图闭合,先检查走线长度,再检查是否有其他高速信号平行走线。实在改不了板子,可以在 PHY 寄存器里调 RGMII 延时,YT8521S 支持内部延时调整,具体寄存器地址查手册的 RGMII Timing 章节。
4.5 现象:复位后 PHY 不工作,但断电重启就好了
原因:复位信号释放太快,PHY 内部 PLL 还没锁定就开始了初始化。参考图里 RC 电路的时间常数只有 100us,对于 PHY 来说太短了。
解决:把 C16 从 100nF 加大到 1uF,或者改用 CPLD 控制复位,在电源稳定后延时 10ms 再释放。如果已经投板,可以在软件里加一段延时,复位后等 50ms 再配置 PHY。
5. 进阶验证:用 FPGA 回环测 SGMII 眼图与误码率
硬件调通之后,怎么确认这套 RGMII 转 SGMII 的设计真的稳?我一般会在 FPGA 侧做一个 SGMII 回环,让数据从 FPGA 发出去,经过 YT8521S 转成 RGMII,再进 CPU,CPU 原路返回。这样能同时验证两个方向的转换。
具体做法是在 XC7VX690T 里例化一个 SGMII MAC,配置成内环模式,然后写一个简单的误码测试逻辑:
// SGMII 回环测试顶层,假设 SGMII MAC IP 已经例化 module sgmii_loopback_test ( input wire clk_125m, input wire rst_n, output wire [7:0] led_status ); // 发送递增数据 reg [31:0] tx_cnt; always @(posedge clk_125m or negedge rst_n) begin if (!rst_n) tx_cnt <= 32'd0; else tx_cnt <= tx_cnt + 1'b1; end // 接收数据比对 reg [31:0] rx_data; reg err_flag; always @(posedge clk_125m or negedge rst_n) begin if (!rst_n) begin err_flag <= 1'b0; end else begin // 假设 rx_data 来自 SGMII MAC 的接收端口 if (rx_data != tx_cnt) err_flag <= 1'b1; end end assign led_status = {7'b0, err_flag}; endmodule这段代码的逻辑很简单:发送一个 32 位计数器,接收端比对,不一致就拉高 err_flag。实际跑的时候,用示波器或者误码仪看 SGMII 差分对的眼图,眼高和眼宽都达标,误码率在 1e-12 以下,基本就可以批量生产了。
验证通过之后,我习惯把配置参数写成一个脚本,每次板子回来先跑一遍自动配置,再跑回环测试。这样即使换批次 PHY,也能快速确认是不是硬件一致性问题。从那以后我每次画 PHY 电路,都会把 CFG_LDO 和 mode_sel 这两个配置项单独标红,提醒自己别漏。希望帮到你。
本文还有配套的精品资源,点击获取