ARTICLE DETAIL

资讯详情

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

STM32MP255 DDR4布线全攻略:从原理图规划到调试验证

STM32MP255 DDR4布线全攻略:从原理图规划到调试验证 一块MPU板卡最难画的部分往往不是CPU本身而是DDR颗粒到处理器的每一根走线。STM32MP255这颗基于Cortex-A35的MPU把DDR4带到了很多过去只做MCU级别设计的工程师面前DDR4 Routing这件事也从要不要考虑变成了必须认真考虑。这次我基于STM32MP255的DDR4接口把从原理图规划到布线落地、再到调试验证的完整链路梳理一遍重点讲清楚DDR4布局布线的核心约束、等长控制和高频信号完整性处理思路也穿插一些实际项目中踩过的坑。1. 先搞清楚DDR4协议给你的设计余量很多人在画DDR4之前第一反应是去翻参考设计、抄等长规则这个思路对了一半。DDR4和DDR3、LPDDR4的管脚定义不同协议层面的时序参数决定了布线时你的等长容差可以放到多少、信号完整性的压力有多大这些不搞明白后面很容易出现照着画也跑不稳的情况。1.1 DDR4管脚分组是布线的第一张地图DDR4的管脚看起来多但真正布线时需要关心的信号可以分成几个大组这个分组决定了你的等长规则怎么写数据组DQ0-DQ15单颗粒16bit为例、DQS0/DQS1差分对、DM/DBI相关管脚。每组DQ都对应一个DQS差分对布线时DQS和DQ必须作为一个整体约束。地址/命令组A[15:0]、BA[1:0]、BG[1:0]、RAS_n/CAS_n/WE_n、CS_n、CKE、ODT、ACT_n。这些信号在DDR4里都是单端信号走的是CA总线。时钟组CK_t/CK_c差分对。DDR4的时钟是差分信号地址命令信号以时钟为参考进行采样。电源/地/参考VDD、VDDQ、VSS、VTT、VREFCA、VREFDQ、ZQ。尤其是ZQ管脚需要一颗240Ω的1%精度电阻接地这个电阻位置摆放和精度会影响DDR控制器内部的校准结果。在STM32MP255的参考设计中DDR控制器的数据线可以配置为16bit或32bit模式具体看用的DDR4颗粒是x16还是x8。布线之前一定要先确认颗粒位宽和MPU侧的DQ映射因为MPU手册里的DQ管脚并不是从DQ0开始顺序排列的很可能DQ0在E列、DQ1在F列中间还夹着电源地布局时必须按照原理图网络逐根核对。1.2 模式寄存器决定了时序时序决定了等长容差DDR4颗粒上电以后必须由控制器通过模式寄存器设置时序参数这个设置过程会直接影响到你的PCB能否满足时序要求。MR0到MR6这几个寄存器分别控制突发长度、CAS Latency、写延迟、附加延迟、ODT阻抗、驱动强度等关键参数。举例来说MR0的低三位决定突发长度BLDDR4默认BL8MR2寄存器中有RLRead Latency和WLWrite Latency的相关配置这些数值是控制器根据DDR4频率和颗粒tCK、tAA等参数算出来的。STM32MP255的DDR控制器在启动阶段由TF-A中的DDR驱动完成初始化ST官方提供的DDR tuning工具会根据你选的颗粒型号自动生成一组寄存器值不需要你手工去算CL是多少但你需要知道这些寄存器的含义否则调参时根本不知道改哪里。为什么说模式和时序决定了布线容差呢DDR4在3200MT/s时一个UIUnit Interval只有312.5ps换算成走线延迟大约是3.125ps/mm这样一条DQS差分对和对应DQ之间的长度偏差如果超过1mm就有大约3ps的skew。而DDR4规范里同一字节通道内DQS-DQ的时序容差一般在正负十几ps到几十ps量级具体数值要看颗粒的tDQSCK、tDQSQ。在实际项目中我们通常直接用等长约束来满足时序比如组内DQS与DQ的误差控制在±5mil到±10mil这个值就是从协议时序反推出来的工程经验值而不是拍脑袋定的。1.3 2133和3200的差距到底差在哪热词里有人在问DDR4 2133和3200差距大不大。从性能层面看带宽差距明显3200MT/s的理论带宽是25.6GB/s2133只有17.064GB/s。但对硬件设计来说更关键的是两者对PCB的要求几乎不在一个等级。2133MT/s时UI约468.75ps时序裕量相对宽裕走线等长稍微松一点、阻抗偏差大一点可能还能跑稳。到了3200MT/sUI压缩到312.5ps信号上升沿和下降沿也更快反射、串扰、参考平面不连续这些问题对眼图的开销影响成倍增加。我在实际项目中见到过一块板子在DDR4-2400下完全正常把DDR控制器频率调到3200后Linux启动时内存校验就报错后来排查发现是DQS差分对在换层处参考平面被分割有一段走线绕到表层经过了一个电感封装区域2133时还能容忍3200就撑不住了。所以如果你选用了3200MT/s的DDR4颗粒布线时就要按照更严格的等长和阻抗要求来做而不是照着2133的参考设计直接抄。2. 布局布线前的四项规划比拉线本身更重要我见过不少工程师打开PCB工具就开始拉线结果拉到一半发现叠层不支持想要的阻抗、端接电阻没地方放、DDR颗粒离MPU太远导致等长根本绕不出来。这些都是规划阶段的问题。2.1 叠层设计DDR4布的其实是参考平面DDR4布线的第一优先级不是走线而是参考平面。STM32MP255这类BGA封装的MPUDDR信号基本都要走内层因为表层要留给器件和电源。这就要求你的PCB叠层至少为DDR信号提供完整的参考层。常见的四层板做DDR4-3200会比较吃力除非走线非常短、颗粒就贴在MPU旁边。我一般建议六层板起做典型叠层是L1信号、L2地、L3信号、L4电源、L5信号、L6地。这样DDR信号走L1参考L2、走L3参考L2或L4、走L5参考L6每一层都有完整的回流路径。关键是不要让地平面在走线下方被切断尤其不能让DDR信号跨越电源层的分割槽。叠层中的层间介质厚度决定了布线阻抗。以常规FR4为例如果L1到L2的介质厚度是0.1mm50Ω单端线宽大概能做到0.15mm左右如果介质厚度加大到0.2mm同样的线宽阻抗会变高需要加宽走线才能回到50Ω。这个计算在PCB投产前就要和板厂确认因为板厂的PP片型号和压合叠构会直接影响实际阻抗。2.2 原理图阶段就把信号分组和端接方案定下来原理图阶段最容易忽略的是把DDR4相关的网络在原理图中就做好分组和标注。我会在原理图里把以下信息单独整理出来方便布线时直接引用每个字节通道的DQ、DQS、DM网络清单标注清楚组内编号。地址/命令/控制信号清单标注哪些信号需要按地址组做等长。时钟信号CK/CK_n标注差分对和参考地网络。端接方案地址/命令/控制信号在颗粒端需要VTT上拉端接还是用ODT替代数据线用ODT还是外接端接。STM32MP255的DDR控制器内置了ODT功能数据线一般不需要外接端接电阻但地址/命令/控制信号通常还是建议采用端接。如果只有一颗DDR颗粒且走线长度较短地址线也可以省略端接靠驱动器阻抗匹配来压制反射但如果DDR颗粒不止一颗或者走线超过50mm我建议还是老老实实加VTT端接并预留端接电阻位置。端接电阻的位置也有讲究它应该放在地址线信号的末端也就是最后一颗DDR颗粒的远端而不是放在MPU侧。放反了的话端接效果会大打折扣。2.3 摆位MPU、DDR颗粒、端接电阻、去耦电容的空间分配DDR颗粒离MPU越近越好这个方向没有错但近不是唯一标准关键要看等长是否绕得开。STM32MP255的DDR走线扇出后需要穿过电源区域如果你把DDR颗粒放得离MPU太近扇出通道狭窄反而会导致走线必须在颗粒和MPU之间反复绕线等长绕线多了之后实际布线长度反而比放远一点更长还增加了串扰风险。我习惯的做法是DDR颗粒中心距离MPU边缘控制在30-50mm左右具体看PCB板宽和扇出空间。VTT端接电阻和VTT电源的储能电容放在地址线末端即DDR颗粒的远端。ZQ电阻靠近DDR颗粒的ZQ管脚走线长度控制在5mm以内。DDR电源去耦每个VDD/VDDQ脚对地放100nF瓷片电容位置尽量靠近BGA焊盘对应侧另外在DDR电源入口放4.7μF到10μF的钽电容或陶瓷大电容用于蓄能。这一步很多人会省但DDR4在频繁读写时电流瞬变很大去耦不足会导致供电电压塌陷跑高频率时就会出现随机性数据错误。2.4 拓扑选择单颗粒和双颗粒完全是两回事DDR4的地址/命令/控制信号可以采用fly-by拓扑或者T型拓扑。单颗DDR4颗粒时不存在拓扑争论走线从MPU单端延伸过去即可。两颗或多颗颗粒时fly-by拓扑是更推荐的方式。Fly-by拓扑的特点是地址/命令/控制信号从MPU出发按顺序经过每颗颗粒的对应管脚类似于一串菊花链而T型拓扑是从MPU分出两条等长支路分别到两颗颗粒。DDR4时代支持读写均衡Write Leveling技术就是为了配合fly-by的走线延迟差异所以选择fly-by是标准做法。STM32MP255参考设计中的双颗粒方案基本都是fly-by因为这样布线的难度更低地址线不需要严格等长到两颗颗粒的各自分支。但要注意数据信号DQ/DQS在双颗粒方案中依然是点对点的每颗颗粒有自己的DQS差分对所以数据线不存在拓扑问题只做组内等长即可。3. DDR4走线约束详解阻抗、等长、绕线、过孔做DDR4布线真正花时间的不是把线连通而是把每一组线都控制到符合约束的范围内并且在整个布线过程中持续保证信号参考平面完整。3.1 阻抗目标单端40Ω、差分80Ω别照抄50ΩDDR4单端信号的目标阻抗通常是40Ω差分信号是80Ω。很多人习惯拿着50Ω的通用阻抗去套DDR这就错了。DDR4的POD12接口输出驱动器的输出阻抗设计在34Ω到40Ω之间所以PCB走线阻抗匹配到40Ω才能获得最佳信号质量。这里要特别提醒阻抗目标和走线宽度是两码事。同样是40Ω在L1表层、L3内层、L5内层线宽完全不同。比如六层板0.1mm介质厚度下表层40Ω单端线宽可能是0.18mm内层40Ω线宽可能是0.15mm。所以布线前必须根据实际叠层算好各层的目标线宽并写进布线约束规则里。差分对DQS和CK的差分阻抗80Ω差分对的线宽和线距要一起调整。通常取差分线宽和单端线宽相同然后调节线距使得差分阻抗落在80Ω±10%范围内。3.2 等长约束分组颗粒内组间给余量下面是STM32MP255 DDR4布线中等长约束的常见做法注意每个具体项目的数值要以ST官方应用笔记和颗粒数据手册为准但方法论是通用的信号组等长约束对象建议误差备注数据组每组DQS与同组DQ±5mil组内最严格数据组间不同组DQ与DQS±20mil~±50mil组间可以放宽地址/命令/控制相对CK差分对±10mil~±20mil配合Write Leveling后可以放宽CK差分对差分对内P/N±5mil尽量短为什么DQS和DQ的误差要控制在±5mil这么小因为在读操作时DQS是随路时钟DQ数据以DQS为基准被采样两者之间的skew必须小于颗粒规定的tDQSQ范围否则就会采错。写操作时控制器同样以DQS为中心对准DQ。在3200MT/s下这个窗口非常窄±5mil对应的skew大约是15.6ps已经是很紧的余量了。地址/命令信号相对CK的等长可以适当放宽到±10mil到±20mil因为DDR4的控制器会通过Write Leveling机制来补偿fly-by走线带来的延迟差异。如果STM32MP255的DDR驱动初始化时没有使能Write Leveling或者你选用的颗粒不支持那么地址组的等长还是要严格一些建议控制在±10mil以内。绕线时等长加长需要计算绕线长度。比如DQS从MPU到DDR走完自然长度是1200mil而DQ中最长的一根是1250mil那么DQS需要增加50mil的绕线长度。绕线增加的长度是按走线中心线长度计算的一段标准的45度绕线通过绕线区的横向跨越距离和纵向偏移量可以算出等效长度一般PCB工具会自动计算不需要手算但你要保证绕线区有足够的空间不要在颗粒BGA下方硬绕。3.3 绕线技巧与3W规则绕出来的长度必须是有效长度绕线不是随便绕绕就行的。DDR4的高频信号对绕线形式有要求优先使用45度折角绕线或圆弧绕线严禁直角绕线。直角会产生阻抗突变反射增大会体现在眼图上。同一组DDR信号绕线间距至少满足3W规则即走线中心到中心距离不小于3倍线宽。在绕线密集区如果空间紧张2.5W也可以但不能再小。3W规则是为了控制相邻走线间的串扰。绕线段的折返次数不要太密集。如果必须绕很多长度可以把绕线拆成几段分布在整条走线上不要都堆在一个位置这样对回流路径和阻抗一致性影响更小。差分对的绕线要保持P/N同步绕线时两根线同时绕不要只加长其中一根。对于走线间距不同信号组之间的隔离比组内间距更重要。数据组和地址组之间的间距建议拉到4W以上时钟差分对与其他信号之间的间距尽量拉到5W以上这样可以有效降低组间串扰。如果板面积实在紧张可以增加地保护走线来隔离但我个人经验是地保护走线对DDR这类多点信号的效果有限不如直接拉开间距实在。3.4 过孔与回流路径每一个换层都要有理由DDR4布线中过孔是信号完整性的大敌。过孔有一个寄生电容和寄生电感会改变走线阻抗尤其是在3200MT/s时一个过孔带来的反射可能会让本来很好的眼图变差。所以DDR4走线尽量减少换层次数能一层走完的就不要换层。必须换层时要注意几点在过孔旁边就近放置接地过孔给信号提供回流路径。信号从L3换到L5回流电流需要在地平面或电源平面之间换层没有地过孔回流就要绕很远会形成大的电流回路增加EMI辐射和地弹噪声。过孔stub尽量短。所谓stub是指过孔从信号层到目标层之后多余的部分。比如从L3走到L5过孔如果继续钻到L6那么L5到L6这一段就是stub会形成传输线分支高频时产生反射。解决办法是选用盲埋孔或者在工艺允许的情况下让过孔打在靠近底层的位置。普通的六层板全贯穿过孔stub问题通常可以接受但DDR4-3200对stub比较敏感建议尽量把信号走线放在靠近过孔末端的层或者和板厂确认背钻工艺。换层前后的走线阻抗要保持一致。如果L3层阻抗是40Ω换到L5层还是40Ω就不要在L3用40Ω线宽、到L5换成另一个线宽无特殊理由不要改变线宽。4. 布线检查清单与实际调试里的几个坑布线完成到投板之间我习惯做一次从DDR颗粒往回到MPU的全网络复查这个习惯帮我在至少三个项目里避免了改板。4.1 投板前的信号完整性自查清单我会逐项核对下面这些内容建议你也建立一个自己的checklist电源网络完整性VDD/VDDQ电源plane是否覆盖DDR颗粒区域电源过孔数量是否足够每个VDD管脚是否有去耦电容。参考平面完整性DDR信号的参考地或参考电源层是否连续有没有被过孔阵列、隔离区切断。等长报告检查按信号分组导出等长报告逐组核对DQS与DQ误差、CA与CK误差是否符合约束。差分对检查DQS和CK的差分对内等长误差、差分阻抗是否满足80Ω±10%。端接电阻和ZQ电阻位置是否在远端ZQ电阻是否靠近颗粒管脚精度是否1%。丝印和阻焊DDR颗粒下不要铺铜不要放丝印给焊接和信号完整性留出干净区域。其中最容易出问题的是参考平面完整性。我曾经调试一块板子DDR4只要跑到2133以上就会随机死机检查原理图和等长都没问题后来把PCB文件一层层打开才发现地址线在L3层的正下方L4层刚好有一条电源层的隔离带横穿过去地址线等于在半空中跨了一个断层。这个问题在布局阶段就可以避免但很多人布局时优先考虑电源走线怎么布忽略了DDR区域的电源plan分割。4.2 加电调试从DDR初始化日志到压力测试STM32MP255上电后DDR初始化是在TF-A阶段完成的。第一次上电时我会在U-Boot里观察DDR相关的初始化日志如果DDR控制器初始化失败或者颗粒训练没过通常会打印错误信息或者直接卡在启动过程中。如果DDR训练失败可以按照以下顺序排查确认DDR电源电压。DDR4的VDD和VDDQ都是1.2V±3%如果电压偏低颗粒可能无法完成上电初始化。确认DDR时钟频率设置。STM32MP255的DDR控制器默认会根据TF-A中的配置初始化如果配置的速率颗粒不支持或者频率设置太高导致时序裕量不足可以先用2133MT/s或1600MT/s降速验证排除颗粒和后端内存芯片的能力问题。检查ZQ校准网络。ZQ电阻虚焊、精度不够或者ZQ走线过长都会导致颗粒校准失败。检查模式寄存器配置。确认MR0-MR6的值和颗粒数据手册匹配尤其是CAS Latency、写延迟、ODT阻抗这些项。在调试过程中如果你用的是Zynq等平台DDR控制器降速配置的方式其实类似——通过修改PS端的DDR配置参数或者设备树中的频率选项把内存控制器降到较低速率验证稳定性。这个降速排查法同样适用于STM32MP255先把DDR频率降到最低可配置档位跑一遍内存压力测试如果低频率下都报错说明是硬件或基础配置问题如果低频率稳定、高频率报错基本可以锁定是时序裕量或信号完整性问题。内存压力测试工具方面我常用的有三个Memtester简单易用跑ddr内存的地址线和数据线测试适合快速验证。Stressapptestgoogle开源的稳定性测试工具能模拟高负载访问适合跑长时间稳定性测试。Linux内核自带的内存自检选项和内核日志中的EDAC报告可以帮忙抓DDR的ECC错误。如果STM32MP255带ECC功能建议在硬件设计时把ECC颗粒选上DDR的软错误在实际项目中还是有的。4.3 我踩过的几个实际坑DDR3和DDR4外观区别要分清楚。虽然这个听起来很低级但我确实见过有人把DDR4颗粒当成DDR3贴到板子上原因是两种内存条外观差异很大DDR4金手指284pin、DDR3是240pinDDR4金手指底部有个弧度突出DDR3是平直内凹但BGA封装的颗粒外观上差别很小封装尺寸和球距都不一样。好在STM32MP255支持DDR3L和DDR4但颗粒不能混用原理图封装和PCB封装都要仔细核对尤其别把DDR4颗粒的电源和地定义搞混。NDA的管脚映射图别直接抄上一代设计。STM32MP255的DDRDQ映射和之前的STM32MP1系列是有区别的如果你想让布线更顺想在原理图里重新映射DQ管脚那需要看芯片手册的允许映射范围不是所有DQ都能随便交换。有的MPU允许DQ在字节通道内任意交换有的则是固定的强行交换的话后续初始化会有问题。ZQ电阻离颗粒太远。有一次我布板时把ZQ电阻放在了DDR颗粒的背面距离超过10mm。结果DDR控制器在校准时得到的阻抗参考偏高导致所有信号驱动强度都不对整块板子的时序裕量明显变小跑memtester在高温下会报错。后来把电阻移到颗粒同侧并控制在3mm以内问题才消失。5. 一些锦上添花的建议眼图测试与仿真如果你的项目对DDR4速率要求不是特别高或者你有比较充分的把握直接投板也未必不行。但如果要跑3200MT/s或者整机工作环境温度变化大我建议做一下仿真或者至少留出测试点。5.1 仿真不是大公司才做的事现在免费的SI仿真工具也有不少最简单的办法是用KiCad配合开源仿真工具或者在Cadence Signal Integrity里做简单的反射和串扰分析。不需要做极其复杂的全链路仿真至少可以做以下两件事用IBIS模型做一根DQ信号的反射仿真验证端接阻值是否合适看看走线的阻抗突变点会不会导致眼图塌陷。用简单的2D场求解器计算阻抗确认你设定的线宽线距在目标叠层下能得到40Ω和80Ω。STM32MP255和DDR4颗粒的IBIS模型都可以从ST官网和颗粒厂商官网下载这比对着经验值猜要可靠得多。5.2 实测眼图怎么看板子回来以后示波器有没有必要测DDR4的眼图如果你有带DDR4协议分析能力的示波器当然可以测。没有的话可以通过DDR控制器的训练结果来间接判断信号质量。STM32MP255的DDR驱动在初始化时会做读训练和写训练训练完成后会得到一组per-bit的skew补偿值这些值如果出现极端大或极端小的异常通常暗示布线有问题。如果没有高速示波器也可以用一个简单办法验证DDR稳定性在Linux启动完成后用devmem直接读写一段内存反复跑几千次同时观察是否有CRC或校验错误。这虽然看不到信号波形但能在功能层面确认时序裕量是否足够。5.3 温度测试也要安排DDR4对温度比较敏感尤其是高负载读写时颗粒温度升高时序参数会发生变化。如果颗粒本身散热不良或者PCB上DDR区域通风差高速率下就可能出现温度相关的随机性错误。所以我会在DDR调试完毕后做一次高低温测试至少常温到70℃的范围内跑stressapptest半小时以上确认系统的热稳定性。这一点对工业级产品尤其重要。STM32MP255这种MPU常用于工业HMI、边缘计算网关等场景环境温度范围可能达到-40℃到85℃如果DDR布线没有足够的时序余量高低温下就会暴露出来。总的来说STM32MP255的DDR4布线并不神秘它考验的是对信号完整性基础知识的理解和把规则落到每一根走线的执行力。把协议时序吃透、把叠层规划好、把等长约束建到位、把调试排查方法准备好这块板子就能稳稳当当地跑起来。我在实际项目中体会最深的是DDR4布线拼的不是某个单项的极致而是对整个链路的均衡把控。你要是能在这几方面都做到位STM32MP255这颗MPU的DDR4接口会成为整块板子上最让人放心的一块。
返回列表