反射与端接:从根源上消除信号“回声”

信号从驱动端跑到接收端,如果沿途的阻抗不连续,部分能量就会反弹回来——这就是反射。反射会让波形出现过冲、下冲、振铃,严重时直接导致误判。我早年调试一块DDR3板子,时钟线上一点点振铃就导致系统随机死机,查了整整三天才发现是端接没做好。从那以后,我对端接方案的重视程度直接拉满。

核心逻辑:端接的本质是让传输线末端或者源端的阻抗与特征阻抗匹配,吸收掉反射波,不让它在线上来回弹。

反射是怎么产生的?

信号沿着传输线传播,遇到阻抗突变(比如分支、过孔、连接器、末端开路),一部分能量继续往前,另一部分折返。反射系数 Γ = (ZL - Z0) / (ZL + Z0)。ZL 是负载阻抗,Z0 是传输线特征阻抗。如果 ZL 等于 Z0,反射系数为零——这就是我们想要的状态。

你想想看,反射回来波形与原始信号叠加,可能会抬高阈值(过冲)或拉低电压(下冲),甚至在高低电平之间来回振荡(振铃)。过冲太大会击穿芯片的I/O保护二极管,振铃则让接收端在逻辑门限附近反复跳变,导致输出毛刺。

注意:反射并非只在长线才发生。只要信号上升时间小于2倍的传输线延迟,就必须考虑端接。我曾经用经验公式估算延时,结果因为忽略了一个短的stub导致误码率居高不下——再短的不连续,在高频下都是个大坑。

四类端接方案详解

1. 源端端接(串联端接)

在驱动器的输出脚串联一个电阻 Rs,使得驱动端内阻 + Rs ≈ 传输线特征阻抗 Z0。这样信号从源端出发时被分压到一半,到达末端开路时会反射回来,在源端被 Rs 吸收,最终末端电压达到满摆幅。

我喜欢源端端接,因为它只用一个电阻,不增加直流功耗。我在FPGA板卡上用过很多次,尤其是点对点时钟线,效果很好。但注意:它要求驱动端必须是低阻抗输出(比如CMOS ~10Ω),而且只适合单负载情况。多负载时反射波会在多个分支间来回蹿,容易出事。

  • 优点: 单电阻、无直流功耗、不降低信号摆幅
  • 缺点: 只能用于单负载,对驱动内阻一致性敏感
  • 常用值: 22Ω~47Ω(根据驱动内阻调整)

2. 末端端接(并联端接)

在接收端把信号拉到 VTT(通常是 VDD/2)或者对地接一个电阻。最常见的是电阻拉到VTT,阻值等于Z0。这样信号到达末端直接被吸收,不会反射。

我早期做DDR2布线时,末端上拉到0.9V(1.8V/2),一次性解决过冲问题。不过代价是直流功耗持续存在——每个信号线都多了一个上拉电阻,电流一直流。对于高速总线(如DDR数据线),这种端接效果稳定,但板子空间和功耗预算得提前算好。

参数源端端接末端并联端接
直流功耗无有(持续)
适用场景点对点点对点、总线
电阻数量1个/信号1个/信号
信号摆幅完整摆幅可能降低(需配合VTT)

3. 串行端接 & 并行端接(组合)

串行端接和并行端接其实经常被混用。串行端接就是我上面说的源端串联电阻。并行端接则是在末端对地或对电源接电阻。但有时人们把末端上拉/下拉归为并行端接,把末端戴维南网络也归为并行端接。

这里我习惯把“串行端接”独立出来,指源端串联,“并行端接”指末端并联(单一电阻或戴维南网络)。戴维南端接是用两个电阻分压,提供匹配到VTT的同时也能吸收共模噪声。不过这两个电阻必须精确匹配,否则分压点会漂。

曾经有个项目,为了省一个电阻,我用单一并联电阻对地,结果因为电源噪声耦合进来,眼图闭合。后来换成戴维南端接,两条腿分别拉到电源和地,噪声问题解决,但多了一倍电阻。嗯,成本和性能的平衡,你自己斟酌。

4. AC端接(电容耦合端接)

AC端接是在末端并联一个电阻再串联一个小电容到地。电阻值等于特征阻抗,电容用于隔直。这样直流功耗为零(电容隔断了直流通道),但对交流信号(上升沿/下降沿)的短时阻抗匹配效果很好。

什么时候用AC端接? 当你需要端接但又不想浪费直流功耗时,比如低频时钟信号,或者那些频率变化范围很大的信号线。电容的大小取决于最低信号频率:fmin 对应的电容容抗要远小于R。我一般取 C ≥ 10 / (2π fmin R)。

但AC端接有个弊端:它会让信号边沿变缓,因为电容充放电时间常数 RC 会拖慢上升/下降时间。如果你对时序余量很紧张,慎用。

如何选择端接方案?一张图理清思路

下面这张流程图展示了我在实际项目中的决策路径。不用死记硬背,对照着走一遍就清楚了。

端接方案选择流程图 信号存在反射? 无需端接 是 点对点拓扑? 源端串联端接 否 末端端接 并行/戴维南 AC端接 提示:AC端接适合低频/非连续信号;戴维南端接多一倍的电阻但抗噪更好

最佳实践:我在项目中的端接参数速查

下面这张表是我自己常用的参考值,基于50Ω差分或单端特征阻抗。实际以SI仿真为准,但可以帮你快速起步。

端接类型典型电阻值电容(AC端接)适用信号
源端串联22Ω ~ 39ΩN/A时钟、低速控制线
末端并联上拉到VTT49.9Ω (1%精度)N/ADDR 地址/控制
戴维南两个 100ΩN/ASSTL/HSTL 总线
AC端接49.9Ω100nF~1μF低频时钟、复位

一个省事的习惯: 我每次layout前,会先问自己三个问题:① 信号长度超过临界长度了吗?② 阻抗控制能做到 ±10% 吗?③ 驱动端内阻是多少? 答案明确了,端接方案就自动浮出水面了。

避坑指南:几个曾让我头疼的反射陷阱

  • 陷阱1:末端端接位置放错。 有人说“靠近接收端就行”,但必须放在接收器的输入引脚旁边,如果经过一小段stub再端接,stub本身就成了新的反射源。我曾经把端接电阻放在过孔另一侧,结果多了一英寸的stub,振铃反而更严重了。
  • 陷阱2:串联电阻离驱动端太远。 源端电阻必须紧挨着输出引脚,最佳距离 < 0.1英寸。远了的话,电阻到驱动器之间的那段trace阻抗不连续,反射照样发生。
  • 陷阱3:AC端接电容选太小。 如果电容容抗在信号基频附近与电阻相当,则高频分量也会被衰减,导致眼图高度下降。我的建议是让 XC ≤ R/10 在信号最低频率处。
  • 陷阱4:忘记考虑芯片的I/O电容。 每个输入引脚都有几pF的寄生电容,加上PCB焊盘和过孔,可能达到5~10pF。这个电容会改变末端阻抗,让你算好的端接值失效。仿真时务必把模型里的封装电容加上。