ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SGMII V1.8精讲:信号映射、速率适配与LVDS验证

SGMII V1.8精讲:信号映射、速率适配与LVDS验证 简介串行千兆媒体独立接口SGMII规范1.8版是一份面向以太网硬件设计的官方技术文档用于指导十兆、百兆、千兆速率下以少量差分信号线替代并行接口完成高速数据传输与端口速率协商。该规范自二〇〇五年十一月二日起生效共十一页核心修订是在发送数据路径中增加垫片电路以抑制发送使能未生效时错误信号的送出同时覆盖与介质无关接口、千兆介质无关接口的兼容定义介绍物理编码子层编解码流程、一点二五吉波特速率及六百二十五兆赫兹双倍数据率时钟机制并涉及数据采样、时钟恢复、自动协商与思科知识产权保护。资源为单个PDF文件约一百三十三KB附有版本修订历史。目前已有三千六百四十七人学习下载适合需要掌握串行千兆介质无关接口信号时序、帧格式或进行硬件方案验证的工程师作为官方依据使用。1. SGMII 规范 V1.8 把 24 根并行线压成了 4 对差分线做以太网板级调试时GMII 的 24 根并行信号线是第一个让人头疼的东西TXD/RXD 各 8 bit加上 TX_EN、TX_ER、RX_DV、RX_ER、CRS、COL 和两组时钟PCB 上要等长、要包地、要占大量扇出面积跨板互联基本不可能。SGMIISerial Gigabit Media Independent Interface把这一整组信号压缩成两对数据差分线和两对时钟差分线数据线跑 1.25 Gbaud时钟线跑 625 MHz DDRPHY 与 MAC 之间用 8B/10B 编码串行通信。这份 2005 年发布的 V1.8 规范文档号 ENG-46158是 SGMII 被引用最多的版本后续 FPGA 里的 1G Ethernet PCS/PMA IP、各家 PHY 芯片的 SGMII 行为几乎都以它为准。V1.8 相比早期版本最重要的修订是在 PHY 发送路径上加了一个 shim 逻辑全双工模式下当 TX_EN 没有拉高时强制把 TX_ER 钳到 0避免某些 legacy 端点在帧结束后的第一个时钟沿收到 RX_ER 而丢帧。这个细节看起来小却直接影响链路兼容性。下面按信号映射、速率适配、控制信息交换、PCS 实现和 LVDS 电气参数五个层次拆这份规范最后落到示波器验证怎么测。2. 信号映射与编码链路GMII 24 线如何压缩成 4 对差分对2.1 GMII 到 SGMII 的信号映射与 CRS/COL 推导SGMII 物理连接只有 4 对差分信号TX±、TXCLK±、RX±、RXCLK±。TX/RX 以 1.25 Gbaud 传输 8B/10B 编码后的码流TXCLK/RXCLK 是 625 MHz 的源同步 DDR 时钟也就是每个时钟沿上升和下降对应一个数据位。GMII 侧全部信号都在这两对数据线上编码传输映射关系见下表。注意 CRS 并不直接编码接收端用恢复出的 RX_DV 推断出 CRSCOL 则由 MAC 内部把 RX_DV 和 TX_EN 相与得到。半双工下如果有帧同时收发MAC 的冲突检测逻辑就会拉高 COL。这样设计省掉了两条独立的控制线这正是 SGMII 引脚数能压到 GMII 六分之一的原因之一。SGMII 信号方向承载的 GMII 信息说明TX± / TXCLK±MAC→PHYTXD[7:0]、TX_EN、TX_ERPCS 编码后串行输出RX± / RXCLK±PHY→MACRXD[7:0]、RX_DV、RX_ERPCS 编码后串行输出CRS推断—由 RX_DV 推导不单独编码COL推断—RX_DV ∧ TX_ENMAC 内部逻辑相与1.25 Gbaud 这个数字不是拍脑袋定的1000M 模式下 GMII 是 8 bit 125 MHz8B/10B 编码后变成 10 bit10 × 125 MHz 1.25 Gbaud。时钟呢如果只给一个 625 MHz 的 DDR 时钟双边沿采样正好覆盖 1.25 G 个数据位一个时钟周期内传两个 bit。这也是为什么 SGMII 的时序分析要同时看 800 ps 的 UI 和 1.6 ns 的时钟周期两套时间基准。2.2 802.3z PCS 编码路径与 ordered_setSGMII 没有发明新编码直接复用 IEEE 802.3z Clause 36 的 1000BASE-SX PCSGMII 的 8 bit 数据加 TX_EN/TX_ER 状态通过 PCS 发送状态机映射成 10 bit 码组再串行化。规范引用了 Figure 36-5/36-6/36-7 的状态机和 Figure 36-9 的同步模块也就是说只要实现过 1000BASE-X PCSSGMII 的编解码部分基本不用改。看规范里的 PHY 功能框图接收路径是GMII 信号以 2.5/25/125 MHz 进来 → PHY Receive Rate Adaptation 把速率统一到 125 MHz 域 → PCS Transmit State Machine 产生 ENC_RXD[0:9] → 串行化输出 RX。发送路径反过来反序列化 TX 得到 ENC_TXD[0:9] → PCS Receive State Machine 恢复 GMII 信号 → PHY Transmit Rate Adaptation 按端口速率输出。两个方向的 PCS 都是标准 802.3z改动全在 Rate Adaptation 和链路两端的控制信息交换上。需要重点记住的 ordered_set 只有几个/S/帧起始定界符、/T/帧结束、/V/错误传播。MAC 端根据 /S/ 和 /T/ 恢复 RX_DV检测到 /V/ 就拉高 RX_ER。下面的代码给出了这几个码组的 10 bit 形态方便对照仿真波形# SGMII 使用的关键 10-bit 码组8B/10B 编码结果 codes { /K28.5/: 0b0011111010, # 链路空闲、逗号序列用于码组对齐 /S/: 0b1100000101, # 帧起始定界符Start_of_Packet /T/: 0b0011111010, # 帧结束定界符End_of_Packet /V/: 0b1101110100, # 错误传播码Error_Propagation } for name, code in codes.items(): print(f{name}: {code:010b})说明这段代码展示的是 PCS 层最重要的码组形态实际解码时要靠运行不一致性running disparity和 K 码控制位来区分 /K28.5/ 的两种极性。一个容易搞混的点是 /K28.5/ 和 /T/ 用了同一个 10 bit 值区别在运行不一致性的正负方向上接收状态机必须维护当前 disparity 状态才能正确解码这也是 PCS 状态机比简单查表复杂的原因。2.3 同步状态机的实现要点收发双方的 Synchronization 模块检测 ENC_TXD/RXD[0:9]一旦连续收到非法码组或运行不一致性错误就进入失步状态并重新搜索 /K28.5/ 对齐。规范允许 PCS 层丢掉伸长帧的第一个字节接收端要把这个特性考虑进 FIFO 深度设计。一个容易踩的坑规范明确说the first byte of preamble might be only repeated 9/99 times。也就是说在 100M/10M 模式下PHY 接收速率适配复制字节时前导的第一个 0x55 可能只复制了 9 次或 99 次而不是 10/100 次。所以接收端不能假设每个字节都严格重复 N 次采样逻辑必须以 /S/ 为起点重新计数而不是拿帧头对齐后就固定采样位置。3. 帧伸长与控制字1.25 Gbaud 链路怎么承载 10/100 Mbps 业务3.1 帧伸长机制与 SFD 的特殊性SGMII 物理层链路速率固定 1.25 Gbaud但业务速率可以是 10/100/1000 Mbps。PHY 端口工作在 100M 时GMII 侧数据实际是 25 MHz 的 4 bit 时序MII进入 SGMII 的 PCS 之前必须先把每个字节复制 10 份凑成 125 MHz 的 8 bit 节奏10M 模式则复制 100 份。这个复制动作发生在 PCS 编码之前规范的原话是 above the 802.3z PCS layer所以描述成在 PCS 层之上做帧伸长。关键点是 SFD0xD5每个帧只出现一次不参与复制。规范特别强调PHY 送出的帧开头必须至少包含两个前导符号 0x55再接 0xD5也就是 RXD[7:0] 序列要是 0x55、0x55、……、0xD5否则 802.3z PCS 状态机可能无法正确识别帧起始。下面代码模拟复制逻辑SFD 0xD5 def elongate(pkt: bytes, speed_mbps: int) - bytes: 按 SGMII 速率适配规则复制字节。 pkt[0] 是前导 0x55, pkt[1] 是 SFD 0xD5。 1000M 不复制, 100M 复制 10 次, 10M 复制 100 次。 k {1000: 1, 100: 10, 10: 100}[speed_mbps] if k 1: return pkt out bytearray(pkt[:2]) # 前导和 SFD 各保留一份 for byte in pkt[2:]: out.extend([byte] * k) # 数据载荷按速率复制 k 份 return bytes(out) frame bytes([0x55, 0xD5, 0x12, 0x34]) print(elongate(frame, 100).hex()) # 输出: 55d51212121212121212121234343434343434343434输出里 0x55 和 0xD5 各出现一次0x12 和 0x34 各重复 10 次。注意实际前导可能不止一个 0x55而且第一个 0x55 在 PCS 编码时可能少复制一份所以工程上不能拿字节数一定是 10 的倍数来判断帧完整性要按 /S/ 码组定位真正开始采样的位置。3.2 tx_config_Reg[15:0] 控制信息定义链路速率、双工模式、link 状态这些控制信息不走数据通路而是通过 Auto-Negotiation 的 tx_config_Reg[15:0] 在 PHY 和 MAC 之间传递。这个寄存器的位定义是 SGMII 区别于普通 1000BASE-X 自协商的核心完整定义如下BitPHY → MACMAC → PHY15Link1up0down0保留140保留Auto-Negotiation acknowledge按 802.3z130保留0保留12双工模式1全双工0半双工0保留11:10Speed11保留101000M01100M0010M0保留9:10保留0保留00保留0保留注意 PHY 发给 MAC 的 bit 15 是 link up/down 状态MAC 回给 PHY 的 bit 14 是自协商确认位。MAC 收到新的控制信息后把自己的 tx_config_Reg[14] 置 1 发回去PHY 看到确认后完成一次控制信息更新。平时链路稳定时这个寄存器不变化一旦 PHY 检测到端口速率或 link 状态改变就立即发起一次自协商。3.3 Auto-Negotiation 流程与 1.6 ms link_timer与 1000BASE-X 自协商的一个关键差异SGMII 的 link_timer 从 Clause 37 的 10 ms 改成了 1.6 ms。原因是 SGMII 只传控制信息不传能力列表链路状态更新要快10 ms 的等待会让 MAC 侧感知 link down 的时间过长。规范给出的预期延迟是 3.4 ms等于两个 link_timer 加一次确认过程。流程是标准的四步PHY 检测到控制信息变化 → PHY 发送端从数据切换到 configuration 状态发出携带新 tx_config_Reg 的码流 → MAC 接收端解码后启动自己的自协商并把确认位 bit 14 置 1 发回 → PHY 收到确认后恢复数据发送。这个过程中数据通路会被短暂打断所以 SGMII 的 link 状态切换不是无扰的MAC 侧要对这段短暂中断做好容忍。实际做 FPGA 集成时vendor IP 通常自动包了 AN 模块用户只需要在 link 状态变化后重新读取速度和双工寄存器。3.4 速率适配的参考伪代码速率适配本质上是一个状态机按当前速率决定复制倍数和采样节奏。用生成器模型描述最直观def rate_adapt(gmii_rxd, port_speed): 把 2.5/25/125 MHz 域的 GMII RXD 转换到 125 MHz 域字节流。 k {10: 100, 100: 10, 1000: 1}[port_speed] if k 1: yield from gmii_rxd # 千兆直通 else: for byte in gmii_rxd: for _ in range(k): yield byte # 百兆/十兆复制 k 份实现时要注意 FIFO 背压100M 模式下输入侧 4 bit 25 MHz一个字节周期是 40 ns输出侧 125 MHz 每 8 ns 出一个字节复制 10 次正好消耗 80 ns但输入侧两个字节之间隔着 40 ns输出节奏和输入节奏并不总是整数倍对齐。如果速率切换期间 FIFO 没有清空会出现首字节丢失。RTL 里通常用一个简单的双时钟 FIFO 加水位控制解决深度 16 就够。4. TX_ER 抑制、SAMPLE_EN 与 PCS 收发路径实现4.1 TX_ER 抑制 shim 的触发条件V1.8 的 Change History 里明确写着 Add shim to the PHY transmit datapath to suppress TX_ER when TX_EN is not asserted。为什么要加这个规范描述了一个兼容性问题802.3z 的 Receive PCS 状态机在某些帧结束时会产生 RX_ER 信号比如收到了 /V/ 或者非法码组这个 RX_ER 在帧结束后的第一个时钟周期仍然有效。一些老 MAC 端点在帧间隙收到 RX_ER 会直接丢帧哪怕这帧本身是对的。解决办法是一个时序逻辑块当链路工作在全双工、且 RX_DV来自 PCS 接收状态机为低时把 TX_ER 钳到 0。半双工下不能这么干因为冲突检测场景里 TX_ER 可能携带有效信息。参考实现如下// SGMII PHY 发送路径上的 TX_ER 抑制 shim module tx_er_shim ( input wire clk125, // 125 MHz PCS 字节时钟 input wire rst_n, input wire full_duplex, // 自协商结果: 1全双工 input wire rx_dv_i, // PCS RX 状态机输出的 RX_DV input wire tx_er_i, // PCS RX 状态机解码出的 TX_ER output reg tx_er_o ); always (posedge clk125 or negedge rst_n) begin if (!rst_n) tx_er_o 1b0; else if (full_duplex !rx_dv_i) tx_er_o 1b0; // 帧间隙强制拉低 else tx_er_o tx_er_i; end endmodule参数说明clk125 是 8B/10B 解码后恢复出的 125 MHz 字节时钟full_duplex 来自自协商寄存器 bit 12rx_dv_i 是 PCS Receive State Machine 输出的解码 RX_DV。这个 shim 只对 PHY → MAC 方向有效MAC 侧不需要对称逻辑因为 MAC 发出的 TX_ER 本来就是用户逻辑控制的。注意这里的 rx_dv_i 必须取 PCS 解码输出如果误用了速率适配之后、经过 SAMPLE_EN 采样的 RX_DV帧间隙的判断就会慢半拍起不到抑制效果。4.2 数据采样与 SAMPLE_EN 生成然后是 MAC 侧怎么从重复 10 次的码流里找回原始数据。规范的 Figure 4 给出了 100M 模式下的采样示意图SAMPLE_EN 是 MAC 内部信号作用是从 /S/ 后的第一个数据段开始每 10 个数据段采样一次。注意没有固定边界——采样窗口不是每 10 个字节里的固定第几个而是从每个帧的 /S/ 之后重新计数。一旦 PCS 层丢掉第一个前导字节或者前导只重复了 9 次固定边界就会错位。参考实现// MAC 侧 100M 模式 SAMPLE_EN 生成逻辑 reg [3:0] sample_cnt; wire decoded_sof; // PCS 状态机检测到 /S/ 码组 always (posedge clk125 or negedge rst_n) begin if (!rst_n) sample_cnt 4d0; else if (decoded_sof) sample_cnt 4d0; // 每帧从 /S/ 重新计数 else if (rx_dv_i) sample_cnt sample_cnt 1b1; end // 在帧内且计数为 0, 10, 20... 时采样 assign sample_en rx_dv_i (sample_cnt 4d0);逻辑说明decoded_sof 是 PCS 状态机识别到 /S/ 码组时给出的脉冲不参与数据计数只负责把计数器清零。之后每个数据段计一次数sample_en 在计数等于 0、10、20 的时刻拉高这样 /S/ 后的第一个数据段在 sample_cnt 0 时就被采到符合自 /S/ 开始采样的要求。10M 模式把计数器扩到 7 bit、到 99 回绕即可千兆模式 sample_en 恒为 1。4.3 从规范到 RTL 的落地顺序把这几块拼起来一个最小 SGMII MAC 侧接收路径的模块划分是差分接收IBUFDS 时钟管理得到 625 MHz 采样时钟和 125 MHz 字节时钟10 bit 对齐在串行比特流里找 /K28.5/ 码界PCS RX 状态机输出 RXD/RX_DV/RX_ER同时给同步模块送状态速率适配加 SAMPLE_EN 采样得到真正的 2.5/25/125 MHz 域 GMII 信号最后是 TX_ER shim 和 CRS/COL 推导。调试时先看 10 bit 对齐状态机有没有频繁重新对齐——如果反复失步通常是时钟-数据相位不对或链路误码偏大而不是 PCS 逻辑问题。这个判断顺序能省大量时间。另外注意 1000BASE-X PCS 的同步模块要求的连续无效码组计数阈值不要直接套默认值SGMII 场景下建议按规范 Figure 36-9 的原始参数实现。5. LVDS 参数、时序预算与板级验证5.1 LVDS 直流参数与交流耦合取舍SGMII 的电气层基于 IEEE 1596.3-1996 LVDS但针对 1.25 Gbaud 做了参数调整。规范给出的驱动端参数是设计 PHY 输出驱动和接收端输入共模范围的重要依据参数含义MinMax单位Voh输出高电平11501525mVVol输出低电平8751250mV|Vod|差分输出电压摆幅150400mVVos输出共模电压10751325mVVring输出振铃—10% Vod—Ro单端输出阻抗40140ΩΔVod0/1 差分摆幅差—25mVΔVos0/1 共模差—25mVIsaba/b 短路输出电流—12mA如果收发双方直流电平不匹配可以交流耦合因为 SGMII 的数据和时钟都是 DC 平衡的 8B/10B 码流。但交流耦合之后接收端要自带偏置否则共模电平会漂到阈值附近。Vod 只有 150–400 mV接收阈值按 ±50 mVV1.2 修订从 ±100 mV 收紧设计PCB 走线噪声预算相当紧张耦合电容建议放在接收端一侧。5.2 典型时序预算分配SGMII 是源同步接口发送端同时送出数据和时钟两者保持 90° 相位差接收端用时钟的双边沿在数据眼的中央采样。数据率 1.25 Gbaud 意味着一个 UI 是 800 ps时钟周期 1.6 ns90° 相位差正好 400 ps。规范只给了 tclock2q 的最小值和最大值概念没有强制分配具体数值下面是工程上常用的一组参考预算项目典型值说明UI800 ps1.25 Gbaud 数据位宽时钟周期1.6 ns625 MHz DDR相位差400 ps发送端时钟-数据 90°tclock2q200–600 ps输出时钟到数据有效延迟板级 skew±50 ps差分对内/对间走线差接收端 setup/hold200/100 psFPGA ISERDES 典型值800 ps 的 UI 里固定开销已经占掉大半板级设计基本没有余量补偿大的等长误差。这就是为什么 SGMII 走线要求差分对内等长控制在 mil 级而不是 cm 级。如果选择从数据恢复时钟而不是使用源同步时钟时序预算会略微宽松但要额外处理 CDR 的锁定时间和抖动放大。5.3 示波器验证的具体做法验证 SGMII 收发路径用 4 GHz 以上带宽示波器配合差分探头。首先在靠近接收端的位置测量眼图SGMII 要求 Rload 100 Ω ± 1% 的差分终端探头直接点在差分对上时用探头自带的 100 Ω 端接不要额外并联电阻。然后检查三个指标Vod 必须在 150–400 mV 之间Vos 在 1075–1325 mV 之间时钟与数据的相位差应在 400 ps ± 100 ps 范围内眼图交叉点应该稳定抖动大时优先查电源纹波和参考时钟。最后做误码验证时把 MAC 配成 PRBS 模式或发全 0x55 数据跑 10 分钟以上统计误码。链路偶尔丢帧但不报错的情况建议抓 PCS 层的 /V/ 码组计数——数据通路出现 /V/ 说明接收端已经收到了错误码问题定位到物理层而不是 MAC 逻辑。常见现象是眼图张开但误码率在 1e-9 附近徘徊这时优先怀疑 Vos 漂移用直流耦合复测共模电压就能确认。本文还有配套的精品资源点击获取
返回列表