SDRAM 布线等长与反射实战:一块板子在高温下”隔几个字节就错”,逼我把信号完整性从头补了一遍

2026年9月20日 0 By admin

上一期聊 ADC 精度的时候文末挖了个坑,说 SDRAM 布线这事要展开讲,一拖就是两期,这期还上。

事情是这样的:我们一块带 STM32F429 + 一片 SDR SDRAM 的板子,常温下老化测试跑了两天一点事没有,一到 55°C 温箱里跑压力测试,每隔几小时就冒一次数据校验错误,而且错的永远是固定某几个字节。软件同事第一反应是驱动有 bug,我第一反应是——完了,多半是布线的锅。

这篇文章把 SDRAM 布线里的等长和反射问题,按我实际排查和整改的顺序捋一遍。老规矩,先说结论:SDRAM 的”等长”不是玄学,本质是在给建立/保持时间做预算;反射不是玄学,本质是阻抗不连续。把这两件事当数学题算,大部分”偶发错误”都能治好。

一、先算一笔账:为什么 168MHz 就开始挑走线

很多初学的朋友觉得”才 100 多 MHz,Wi-Fi 都是几 GHz 了,这点频率怕什么”。我以前也这么想,直到被教育。

SDRAM 是同步时序器件,所有信号的判断都锚定时钟边沿。时序裕量 = 时钟周期 − 数据在路上的传播延时 − 器件的建立时间 + 保持时间余量。走线延时的经验值大约是 150 ps / inch(FR4 内层约 180 ps/inch,外层微带更快一些),我们算一下 100MHz 和 166MHz 各自的预算:

时钟频率 周期 走线每英寸延时 12 inch 线延时 延时占周期比例
100 MHz 10 ns ~150 ps ~1.8 ns 18%
133 MHz 7.5 ns ~150 ps ~1.8 ns 24%
166 MHz 6 ns ~150 ps ~1.8 ns 30%

100MHz 时,一根 12 英寸的线就把五分之一的周期吃掉了。这还只是绝对延时,更要命的是线与线之间的相对延时:地址/控制线相对时钟如果差了 2 英寸,就是 300 ps 的偏斜,等效于让器件的建立/保持窗口平移了 300 ps。频率越高,这个偏斜占建立/保持窗口的比例越大——这就是为什么 72MHz 的 FSMC 大家随便拉,166MHz 的 FMC 就得认真算。

另外注意:SDRAM 的数据和 DQS(对 SDR SDRAM 来说是 DQM 掩信号组)是在同一个时钟沿被采样的,所以等长的目标不是”所有线一样长”,而是分组内相对等长 + 组与组之间对齐到时钟。

二、反射:信号为什么会”弹回来”

反射的机理一句话就能说清:传输线上的信号遇到阻抗突变,就会有一部分能量被反射回来。反射系数 ρ = (Z₂ − Z₁) / (Z₂ + Z₁),阻抗差得越大,弹回来的越多。

SDRAM 布线上常见的阻抗不连续,按我踩过的坑排序:

  • 走线分支(T 型/星型):一根时钟线分成两叉去两片器件,分叉点之后每条支路都成了另一条支路的”短桩”,反射来回叠加,时钟眼图直接烂掉。单芯片点对点还好,两片以上的拓扑设计要谨慎。
  • 过孔短桩:信号从表层打到底层,如果过孔还带着一小段没连出去的残桩,那段残桩就是开路短桩,反射能量按短桩长度缩放。
  • 线宽/介质突变:走线绕过过孔密集区时局部变细,阻抗突升;换层时参考平面从地平面切到电源平面,回流路径阻抗变化。
  • 没有端接的 stub 拉线:为了”以后调试方便”从总线上拉出一根测试线悬空——这是我最悔的一次,3cm 的悬空短桩在 166MHz 下贡献了整整一个振铃周期。

反射的直观后果是振铃和过冲:第一次反射回到源端,源端驱动阻抗和走线阻抗不匹配(通常源端阻抗偏低),又反射第二次……在时钟上表现为上升沿振铃,严重时一个沿被”数”成两个,状态机直接跑飞。

三、等长实操:怎么分组、留多少容差

我的分组原则就一条:同一个时钟沿有效的关系,就在一个组里等长。对 SDR SDRAM 具体是两组:

  1. 时钟组:CLK 单独一根(或差分 CLK/CKE 相关),是全组的基准。
  2. 地址/控制组:A0–A12、BA0–BA1、CAS#、RAS#、WE#、CS#、CKE —— 这些信号和时钟在同一沿被锁存,相对时钟等长。
  3. 数据组:DQ0–DQ15、DQM0–DQM1 —— 相对彼此等长,且相对时钟组对齐。

经验容差(SDR SDRAM,100–166MHz,多层板内层走线):

信号组 相对基准 容差建议 说明
数据组 DQ/DQM 组内互相比 ±100 mil(约 ±50 ps) 最敏感的一组
地址/控制组 相对时钟 ±250 mil(约 ±125 ps) 可稍放宽
时钟 CLK 自身 点对点,不分支 全板基准

几个实操细节,都是血泪:

  • 蛇形绕线留够间距,我按 3W(线宽的三倍)间距绕,靠太近会引入耦合,等长等来了串扰,得不偿失。
  • 绕线绕在信号进入芯片前的”平直段”,别在 BGA 扇出区绕——那里空间小,必然贴很近。
  • 所有组保持同样的走线层,不同层传播速度不一样,跨层等长是自欺欺人。万不得已要换层,把换层的过孔延时算进去(每个过孔约 15–25 ps)。
  • 长度从芯片引脚量到芯片引脚,不是从 CPU 焊盘量到 SDRAM 焊盘,封装内部的引线长度差异有时能到 100 mil 量级,数据手册里有 Pin/package delay 表的要算上。

四、串联电阻:最便宜的”反射灭火器”

点对点的 SDR SDRAM 总线,最实用的整改手段就是在源端串联小电阻,典型值 22–33Ω。原理是源端端接:驱动器输出阻抗(通常 10–20Ω)加上串联电阻后接近走线特性阻抗(单端 50–60Ω),第一次反射回来的能量在源端被吃掉,不再来回弹。

我的默认配置是:每根数据线、地址线、时钟线源端各一颗 22Ω。有人会问”这么多电阻占面积”,我说这排 0402 的 22Ω 阵是我买过最便宜的保险——它们不仅压反射,还能限制过冲保护 IO,出问题时还能当断点测量位。

注意两个例外:

  • 容性负载很轻的短走线(<3cm)可以不焊,串了电阻反而把上升沿拖缓;
  • 时钟线串阻位置一定在靠近源端,放错了位置等于把端接变成了新的反射点。

那 VTT 端接(DDR2/3 的戴维南端接)要不要上?SDR SDRAM 频率下一般不需要,功耗代价大,源端串阻足够。只有走线长到 6 英寸以上、或者频率冲到 DDR 级别,才考虑 VTT 电源岛。

五、参考平面与回流:等长救不了断掉的回流

这一节是我最想塞进每个工程师脑子里的一条:每根信号的回流电流就在它正下方的参考平面上走。等长做得再漂亮,回流路径断了全部白搭。

常见的回流杀手:

  • 地平面被分割槽切断(比如为了隔离模拟地挖了一条横穿总线的缝);
  • 信号换层时参考平面从 GND 切到 VCC——回流被迫通过平面间的位移电流过桥,阻抗突变;
  • 板边走线离地平面边缘太近(<3 倍线宽),边缘场泄漏。

规矩是:总线全程至少有一层完整、不分割的地平面做参考;信号必须换层时,在过孔旁边 1mm 内打一颗地过孔给回流”过桥”。当年那块问题板子,地址总线为了绕过 USB 差分对换了一次层,而且换层位置远离任何地过孔——后来回看,那就是高温下”固定几个字节出错”的物理根源之一。

六、怎么定位:三板斧测试方法

整改不能靠感觉,我的三板斧:

第一斧:软件压力测试圈定嫌疑线。 写一个破坏性内存测试,对嫌疑地址做 0xAA5555AA、递增、walking-1 三种 pattern 各百万次循环,记录出错地址和出错位。出错位固定 → 物理走线问题;出错位随机 → 时序余量整体偏紧或电源问题。

/* walking-1 测试:每个 bit 单独置 1,读回比对 */
uint32_t walking1_test(volatile uint32_t *addr)
{
    for (uint32_t bit = 0; bit < 32; bit++) {
        uint32_t pattern = 1UL << bit;
        *addr = pattern;
        if (*addr != pattern) {
            return pattern;   /* 返回第一个出错 bit */
        }
    }
    return 0;
}

第二斧:示波器看实际波形。 用高带宽探头(≥500MHz)在 SDRAM 引脚侧量时钟和一根数据线,看三样东西:上升沿振铃是否超过 VDDQ ±10%、过冲幅度、时钟和数据的眼宽。示波器测时钟千万只用接地弹簧,别用长地线夹子,否则测出来的振铃一半是你自己探头的地环路振出来的。

第三斧:温度/电压扫描。 建立时间类问题通常在低温高电压下暴露(信号沿变快,偏斜影响放大),保持时间类问题在高温低电压下暴露(信号沿变慢)。我们的 bug 只在高温出,指向保持时间余量不足——和后来查出的”时钟比数据组长了 400 mil”完全对得上:时钟晚到,数据先到,等效于吃掉了保持时间。

七、整改后的自查清单

现在每次 SDRAM/DDR 布线评审,我照着这张单子过一遍,基本没再翻过车:

  • ☑ 时钟点对点,全程不分支、不打 T 型
  • ☑ 数据组组内等长 ±100 mil,地址/控制组相对时钟 ±250 mil
  • ☑ 所有信号源端预留 22Ω 串阻焊位(可 NC)
  • ☑ 蛇形绕线间距 ≥3W,绕在平直段
  • ☑ 全程有完整不分割地平面参考,未跨越任何分割槽
  • ☑ 换层处 1mm 内配套地过孔
  • ☑ 走线层全程一致,跨层时把过孔延时计入等长预算
  • ☑ 无悬空 stub、无临时测试拉线
  • ☑ 距板边 ≥3 倍线宽
  • ☑ 数据手册的封装内引线延时已计入长度计算
  • ☑ 整改后重跑 walking-1 + 温度循环(−40°C / +25°C / +55°C 各 2 小时压力测试)

八、写在最后

那次整改后,同一块板子在温箱里连续跑了两个星期零错误。回头看,问题从来不是什么”玄学偶发”,而是三件朴素的事:等长是时序预算,反射是阻抗不连续,回流是路径完整性。频率越往上走,这三件事越是绕不开。

下一期继续在嵌入式硬件和嵌入式开发之间轮换,预告一个方向:多路电源的上电时序控制——CPU、DDR、IO 各路电源谁先谁后,时序错了同样会”偶发不开机”,到时候聊聊电源时序的几种实现和监测手段。回见。