反射与端接:从根源上消除信号“回声”
信号从驱动端跑到接收端,如果沿途的阻抗不连续,部分能量就会反弹回来——这就是反射。反射会让波形出现过冲、下冲、振铃,严重时直接导致误判。我早年调试一块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 会拖慢上升/下降时间。如果你对时序余量很紧张,慎用。
如何选择端接方案?一张图理清思路
下面这张流程图展示了我在实际项目中的决策路径。不用死记硬背,对照着走一遍就清楚了。
最佳实践:我在项目中的端接参数速查
下面这张表是我自己常用的参考值,基于50Ω差分或单端特征阻抗。实际以SI仿真为准,但可以帮你快速起步。
| 端接类型 | 典型电阻值 | 电容(AC端接) | 适用信号 |
|---|---|---|---|
| 源端串联 | 22Ω ~ 39Ω | N/A | 时钟、低速控制线 |
| 末端并联上拉到VTT | 49.9Ω (1%精度) | N/A | DDR 地址/控制 |
| 戴维南 | 两个 100Ω | N/A | SSTL/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。这个电容会改变末端阻抗,让你算好的端接值失效。仿真时务必把模型里的封装电容加上。