上个月调一块Zynq-7020的采集板,两片美光DDR3 x16颗粒挂在PS端,第一版打样回来,初始化偶尔卡在DDR training,跑Linux压力测试十几分钟就随机死机。抓波形发现地址线的过冲几乎顶到1.9V,振铃幅度接近500mV,DQS与DQ之间的相位偏差也在临界值。这块板子的原理图其实没画错,问题全出在PCB设计阶段的阻抗匹配和端接电阻策略没做透。这篇文章把我在Zynq7系列DDR3 PCB设计里踩过的坑、算过的数、实测过的方案完整捋一遍,覆盖目标阻抗怎么定、叠层怎么选、端接电阻该不该加、加在哪儿,以及板子回来后怎么用仿真和示波器验证。适合正在画Zynq7板子、或者对DDR3高速布线还想深挖的人看,就算你用的是别的SoC,里面的思路也一样能搬过去用。
1. 先想清楚Zynq7的DDR3接口到底在跑多快的信号
1.1 PS侧和PL侧是两套完全不同的DDR3玩法
Zynq7是一个ARM+FPGA的异构SoC,DDR3接口分两种:PS端的硬核DDR控制器和PL端的MIG IP软核。PS端是ARM Cortex-A9访问内存的通道,引脚在BGA上是固定死的,数据线、地址线、控制线的物理分配不能改,你只能顺着引脚去布线,不能在PCB上做字节通道交换。PL端用MIG生成DDR3控制器,灵活性高得多,MIG IP里可以配置字节通道交换和数据位交换,布线上能省掉不少绕线的麻烦。
我这两年经手的Zynq板子大多数走PS端,因为要跑操作系统,DDR3是系统的内存。板子上的DDR3-1066接口实际数据率是1066MT/s,DQS时钟533MHz,这和DDR2时代400MT/s的时序预算完全不是一个量级。很多人画过DDR2板子,觉得DDR3也就是换颗粒、改供电,结果一上板就翻车,就是因为没意识到速率翻倍之后,PCB寄生参数对时序的影响也从“可以忽略”变成了“决定成败”。
1.2 阻抗失配是怎么一点一点吃掉时序裕量的
DDR3是源同步接口,数据信号不是靠独立的系统时钟对齐,而是跟着DQS strobe一起走。写操作时,控制器发DQS,数据以DQS为中心对齐;读操作时,颗粒发DQS,Zynq用DQS采样DQ。整个系统能正常工作,靠的是接收端能在DQS的某一边沿稳定采到数据,这个稳定窗口就是时序裕量。
问题来了:如果走线阻抗和驱动端、接收端的阻抗不匹配,信号到达接收端时会产生反射。反射叠加在原信号上,轻则造成振铃,重则过冲超过输入阈值,让接收端在该判0的时候判1、该判1的时候判0。更隐蔽的是,反射造成的波形畸变会让数据有效窗口变窄,本来有300ps的裕量,反射一折腾可能就剩下50ps,再加上温度漂移、电压波动,偶发错误就成了必然。
DDR3的电平标准是SSTL-15,JEDEC规范里对走线阻抗的推荐值是单端40Ω、差分80Ω。为什么是40Ω而不是50Ω?因为DDR3颗粒的输出驱动阻抗和片内ODT端接都是围绕40Ω设计的。你可以用ZQ校准把驱动强度调成RZQ/6(约40Ω)或RZQ/7(约34Ω),ODT也可以选RZQ/2、RZQ/4、RZQ/6。这些值都和40Ω的传输线配合时,反射系数最小。
1.3 速率等级不同,设计投入完全不同
Zynq-7000不同速度等级、不同型号,PS端DDR3的支持速率有差异。我用的Z-7020速度等级是-2,搭配DDR3-1066颗粒按533MHz时钟设计。这个速率下,信号上升沿大概150~250ps,信号带宽约1.5GHz,对应在FR4板材里的波长也就4英寸左右。只要走线超过波长的十分之一,也就是0.4英寸,就必须按传输线来处理,不能再拿它当普通连线。
如果你选的是-3速度等级的片子,把DDR3跑到1600MT/s甚至更高,那对阻抗控制的误差要求会成倍收紧。40Ω目标阻抗如果实际做成48Ω,DDR3-1066可能只是波形难看点,到了1600时序直接崩。所以做设计之前,先把你的Zynq型号、速度等级、DDR3颗粒速率对上,再决定后续投入多少精力在阻抗和端接上。
2. 叠层设计与阻抗计算:把理论落到具体的板材上
2.1 六层板还是八层板,参考平面的完整性才是一切的前提
DDR3走线必须有连续完整的参考平面,这是阻抗控制的物理基础。最理想的情况是DDR3信号全部走内层带状线,上下都有地平面夹着,这样阻抗可控、抗干扰好、对外辐射也小。四层板做DDR3不是不行,但信号基本只能走外层微带线,参考平面还不一定完整,除非板面积特别小、走线特别短,否则我不建议拿四层板去赌DDR3的稳定性。
六层板是性价比比较高的方案。我常用的叠层是L1信号、L2地、L3内层带状线、L4电源、L5地、L6信号。DDR3的主要信号全部放L3,这样L3的上下参考是L2和L4,虽然L4是电源平面,但只要能保证DDR3走线下方对应区域是完整的电源平面、不去跨越其他电源分割,问题就不大。有条件的话,我会把L3下面那层也改成地平面,形成真正的对称带状线,这种叠层用八层板实现。
八层板比六层板贵的部分,在高密度、大批量的产品上可能要拉扯一下成本,但对Zynq+DDR3这种组合,我个人的态度很明确:如果板子上DDR3走线超过1.5英寸,或者挂了4片以上颗粒,直接上八层板,别在叠层上抠钱,省下的那点PCB费用不够你多调两周板子的时间成本。
2.2 微带线和带状线的取舍,以及一个Polar计算实例
外层微带线的好处是过孔少、走线方便,坏处是阻抗受阻焊层影响大、容易受外部干扰。内层带状线则相反,参考平面夹得很死,阻抗稳定,串扰也好控制,所以DDR3的数据线、DQS、时钟我基本都安排在内层走。
阻抗计算我都是用Polar Si9000这类工具做的,不建议拿网上那些近似公式手算,公式算出来的值和实际板材的差异很容易超过10%,在DDR3这种场合不够看。这里给一组我最近一块板子的实际参数,板材是生益S1000-2M,Er约4.2@1GHz,板厚1.6mm,六层板,L2到L3间距0.12mm,L3到L4间距0.12mm,铜厚1oz。
在这个叠层下,Polar算出来的单端40Ω带状线线宽大约是0.15mm(6mil)。差分80Ω,线宽0.13mm、线距0.20mm,算出来约82Ω,正好在±10%范围内。板厂加工回来实际用TDR测,单端阻抗基本落在38~42Ω之间,和仿真基本一致。
需要强调一点:同样的线宽在不同板材、不同介质厚度下的阻抗可以差出十万八千里。所以定叠层的时候就要把目标阻抗告诉板厂,让板厂按你的目标做阻抗测试条,而不是你自己画一个线宽就指望板厂一定能做出来。我一般在发板文件里专门给一页“阻抗叠层要求”,标注每层目标阻抗、线宽、参考平面,板厂按这个控制生产,回来的板子一致性才会好。
2.3 阻抗误差和板材参数波动,设计时就得留余量
FR4的介电常数不是固定值,不同批次、不同频率下Er会在3.8到4.5之间波动。板厂生产时介质厚度也有公差,铜厚也有波动。所以阻抗控制不可能做到绝对精准,JEDEC对DDR3阻抗的容差要求是±10%,算下来单端36~44Ω、差分72~88Ω都在合格范围。
实际设计里,我给自己的内部目标是控制在±8%以内,也就是单端37~43Ω。因为端接电阻本身也有1%精度误差,驱动强度设置也有档位漂移,每项都往极端走,叠起来就能吃掉全部裕量。留一点余量,后面调试时你会感谢自己。
还有一点容易踩坑:DDR3的地址线、命令线、控制线如果走线层不同,或者参考平面不同,实际阻抗也会有差异。尽量让同一组信号走在同一个层、使用同一组参考平面,保证它们阻抗一致,比单一根线绝对阻抗多准更重要。
3. 端接电阻方案:不是所有信号都该加端接
3.1 数据信号:主角是ODT,板级端接反而容易帮倒忙
DDR3的数据线DQ、数据选通DQS和掩码DM,在设计上走的是点对点连接:Zynq的引脚通过走线直接连到DDR3颗粒的对应引脚。这种拓扑天生适合用ODT做端接。
写操作时,Zynq输出数据,DDR3颗粒内部的ODT开启,阻抗匹配在颗粒端完成。DDR3颗粒的ODT可以配置成40Ω、60Ω、120Ω或者禁用,配合40Ω走线阻抗,反射很小。很多新手一看到“端接”两个字,就在DQ线上加串联电阻或者并联到VTT,这反而是画蛇添足:串阻会分压,降低到达颗粒的信号摆幅;并联到VTT的电阻会大幅增加驱动电流,SSTL-15的驱动能力可经不起这么折腾。我在第一块DDR3板子上就吃过这个亏,DQ线上串了22Ω电阻,结果写操作眼图幅度掉到不到400mV,颗粒端采样裕量惨不忍睹。
那Zynq这一侧什么时候需要外接端接?读操作时,DDR3颗粒输出数据,Zynq接收。Zynq PS端的DDR接口本身没有像颗粒那样丰富的ODT配置,如果读波形在Zynq侧振铃明显,可以在布局时预留一个并联到VTT的电阻位,比如每根DQ线上预留一个68Ω到0.75V的0201电阻位。先不贴,实测振铃超标再贴,用0欧跳线或者直接焊上比较。我实测过,贴了之后读操作的眼图过冲确实有所收敛,但代价是静态电流增加,所以这个电阻位宁可有、不用,也不要没有。
3.2 地址、命令、控制线:VTT上拉端接才是真正的关键
地址线、片选、行选、列选、写使能这类信号,在DDR3里是单向多负载的,接收端是颗粒,而且没有ODT。这类信号在走线末端的反射非常严重,尤其是走线较长、挂了多片颗粒的时候。
业界标准的做法是末端接VTT上拉电阻,电阻阻值一般用39Ω到68Ω,根据走线阻抗和驱动能力折中。VTT电压是0.75V,正好是VDD的一半,这样端接电阻不会引入直流偏置问题。电阻的另一端接VTT电源平面。
我最初做Zynq+两片DDR3时,听别人说两片颗粒走线短可以省掉VTT端接,就在地址线上只加了22Ω源端串阻。结果就是开头说的情况,-40℃到85℃温度循环下,常温勉强能跑,高温时地址线过冲超过1.9V,长时间运行出现了偶发的training失败。后来在地址线末端加了一排47Ω到VTT的电阻,过冲直接削到1.6V以内,振铃明显收敛,问题彻底消失。
但要不要加VTT端接,还取决于你的布局和走线长度。如果是两片颗粒、走线短于1.5英寸、板子工作在常温环境,确实有一些量产产品不加VTT也能稳定过测。我的建议是原理图上预留端接电阻位,第一版先不贴或贴上,通过实测决定。如果空间紧张,预留位置不一定非得放,但一定得有测试机会。
另外还有一个细节:VTT端接电阻的放置位置必须在信号链路的末端,也就是最后一颗DDR3颗粒的后面,电阻到颗粒引脚的stub越短越好。我把这排电阻放在DDR3颗粒的背面对应区域,过孔直接落到端接电阻焊盘,电阻到VTT平面的过孔紧挨电阻本体,保证端接点的寄生电感最小。
3.3 差分时钟对的端接,和我的一次实测对比
DDR3的差分时钟CK/CK#是全局走线,到达每颗颗粒。对于差分信号,标准的端接是在接收端跨接一个100Ω差分电阻。
问题在于,有些DDR3颗粒内部已经把差分端接做进去了,规格书里会明确写内部差分端接的阻值;有些则没有。我做第一版板子时,因为不确定颗粒是否内置差分端接,干脆在原理图上预留了100Ω跨接电阻位,放在最后一颗颗粒附近。实测结果很有意思:贴了这颗电阻,CK差分信号的眼图更干净,差分幅度略微下降但完全满足SSTL-15要求;去掉这颗电阻,波形上升沿出现轻微过冲。最终我选择保留这颗电阻。
对差分时钟对的端接,不能照抄别人的原理图,要结合你选的DDR3颗粒型号去看规格书。如果颗粒已经内置100Ω差分端接,外接电阻就是多余的,反而增加功耗;如果没有,就必须靠外部电阻补上。
3.4 ZQ电阻和VTT电源,两个最容易被忽略的隐性角色
DDR3颗粒的ZQ引脚需要一颗240Ω±1%电阻到地,这是ODT和输出驱动强度的校准基准。如果这颗电阻精度不够或者位置不对,颗粒内部的校准结果就会偏移,数据信号质量会莫名其妙变差。我见过有人用5%精度的240Ω电阻,训练时好时坏,查到最后就是ZQ电阻精度不够。现在我一律用0402封装、1%精度、低温漂的电阻,放在颗粒ZQ引脚旁边,接地过孔紧邻电阻。
VTT电源是另一个被轻视的角色。VTT端接电阻在工作时要持续灌入和吸收电流,地址线翻转越频繁、端接电阻越小,VTT电源的瞬态电流冲击越大。我用的VTT稳压器是TI的TPS51200,专门为DDR设计的,可以灌电流和拉电流。VTT输出端放了4个0.1μF和2个10μF陶瓷电容,紧挨端接电阻组。VTT的纹波控制在±15mV以内是底线,如果VTT本身噪声大,端接电阻就会把这个噪声直接耦合到信号上。
VREF电压一般由颗粒内部产生,有些设计用电阻分压从VDD取0.75V,这个分压点必须加0.1μF去耦电容,VREF引脚本身也要求极低的噪声,否则输入判定的阈值会抖动,等于直接吃掉时序裕量。
4. 布局布线实操:Zynq7 DDR3走线怎么走才算数
4.1 先把引脚分组和颗粒选型理清楚,再动手拉线
Zynq PS端的DDR引脚是按字节通道组织的:每个字节通道包含8根DQ、1根DQS差分对、1根DM。引脚在BGA上已经排好,布局时要先把每个字节通道的引脚扇出关系理出来,不能把不同字节通道的信号混在一起布线,否则等长和串扰控制会非常痛苦。
DDR3颗粒选x16还是x8,直接决定布线复杂度。30位地址、32位数据?我通常选两片x16颗粒组成32位DDR3,这样每个颗粒自己就是一个字节通道的邻居,颗粒放在Zynq DDR引脚对应的BGA扇出方向,数据线走线长度最短。
布局顺序是先放Zynq,再放DDR3颗粒,最后放端接电阻和去耦电容。DDR3颗粒离Zynq的DDR Bank越近越好,我一般控制在500~900mil以内,这样走线短、过孔少、等长好做。两片颗粒并排放在Zynq同一侧,地址线往一个方向走,数据线分别走向两侧,形成清晰的布线通道。
4.2 数据总线等长策略和组内分组规则
数据线组内等长是最硬的要求。DDR3-1066下,我的经验值是:同一字节通道内,DQ、DM相对DQS的等长控制在±20mil以内。FR4里信号传播速度大约163ps/inch,20mil对应约3.3ps的skew,对这个速率完全够用。不同字节通道之间的相对偏差可以放宽到±50mil,因为控制器内部对每个字节通道分别做training。
DQS差分对内两根线要严格等长,误差控制在±5mil以内。DQS到DQ的等长以DQS为基准,在布线时我会先走DQS,拉好蛇形线定一个基准长度,然后其他DQ冲着这个基准去绕。不要每根线都单独绕蛇形,那样浪费面积还容易造成相邻线间串扰,蛇形线的间距要保持在3倍线宽以上。
数据线换层时,每根线尽量只换一次层,而且DQ和对应的DQS最好在同一层走,避免因为层间传播速度不同带来额外的skew。我在布线时会让整个字节通道都固定在一个布线层上,从一个方向进出颗粒。
4.3 地址命令总线:fly-by拓扑和组内等长控制
DDR3标准推荐地址、命令、控制总线采用fly-by拓扑。所谓fly-by,就是走线像串糖葫芦一样,从Zynq出发,先经过颗粒1,再经过颗粒2,而不是像DDR2的T型拓扑那样从中间分叉到每颗颗粒。
fly-by的好处是末端阻抗更容易控制,坏处是每颗颗粒收到的地址信号到达时间不一样,控制器通过write leveling功能去补偿这个时间差。所以地址线组内部的相对等长不用做到数据线那么严,我一般控制整组地址、片选、时钟使能、写使能等信号的长度差在±150~200mil以内。
但地址线组整体相对DQS/时钟的关系要留意。因为地址线走fly-by链,CKE、CS#、ODT这些控制信号也要跟着地址线一起走,不能让它们单独绕远路。所有地址组的走线尽量走在同一层、用同一组参考平面,保证传播速度一致。末端VTT端接电阻排在fly-by链的终点,每个信号线到末端颗粒的stub尽量短,最好直接打过孔到电阻。
4.4 过孔、换层和回流路径,这些细节决定成败
DDR3-1066速率下,单个过孔的寄生电容约0.3~0.5pF,寄生电感约0.5~1nH,对信号本身影响有限,但过孔的stub如果太长,会在信号路径上形成阻抗不连续点。内层走线从L3换到L1或者L6时,过孔残桩会像一个短截线,在1.5GHz附近产生谐振,实测表现就是眼图中间出现毛刺。
我的做法是:DDR3信号换层时,信号过孔旁边务必放一个地过孔,距离不超过40mil,给返回电流提供低阻抗换层路径。换层的过孔不要用贯穿板厚的通孔,而是尽量把走线安排在顶层以内两层之间切换,减少残桩长度。如果板厂支持背钻,对DDR3关键信号过孔做背钻处理,把残桩打掉,信号质量还能再上一个台阶。
走线间距方面,同层相邻信号线间距保持3W原则是底线,数据线和数据线之间如果密度实在不够,2W也勉强能接受,但DQS这类差分对两侧的间距必须给足,至少3W以上。地址线这种多负载总线,间距不够容易产生耦合串扰,串扰出来的噪声会叠加在振铃上,问题很难排查。
5. 板子回来后:仿真验证、实测波形和训练失败排查
5.1 打样前先用HyperLynx把端接方案扫一遍
很多硬件工程师习惯板子画完直接发出去,等板子回来再调,这是最浪费时间的做法。DDR3的端接参数完全可以在打样前用仿真扫一遍,成本很低,收益极高。
我常用的流程是:从DDR3颗粒厂商官网下载IBIS模型,Zynq这边从官网下载PS DDR引脚的IBIS模型,导入HyperLynx的LineSim环境。把叠层参数、走线长度、拓扑结构搭好,选好驱动强度和ODT配置,然后用Terminator Wizard对端接电阻的阻值做参数扫描。扫描目标是让接收端波形过冲小于VDD+0.3V,振铃幅度小于信号的20%,眼图的建立时间和保持时间都留出足够的余量。
这样做一遍,至少能避免两类低级错误:一类是端接方式选错,比如该用VTT上拉的结果用了下拉;另一类是端接阻值偏差太大,比如地址线需要47Ω结果放了33Ω。仿真结果和实测通常有出入,但大方向基本一致,仿真通过的设计再打样,回来直接进入调试环节,而不是反复烧钱改版。
5.2 实测第一步不是跑系统,而是测阻抗和看波形
板子贴片回来,先别急着烧写FSBL启动Linux。先用万用表确认ZQ电阻、VTT电源、VREF电压都正常,再用示波器看DDR3的供电纹波,波形上电时序是否正确。确认电源没问题后,用TDR模式测关键走线的阻抗,看看第一批板子的阻抗是否在生产公差内。
TDR测试要选择DDR3颗粒引脚附近的测试点,或者BGA背面过孔。如果测出来单端阻抗只有30Ω,说明叠层或者线宽设计出了问题,后面再怎么调端接都没用,必须改版。如果阻抗在37~43Ω范围内,接下来测时钟波形和数据波形才有意义。
示波器带宽至少要1.5GHz,最好2.5GHz以上,配差分有源探头测DQS和差分时钟。这里有一个探头阻抗匹配的坑:普通无源探头输入阻抗10MΩ,但地线夹子很长,在1.5GHz频段寄生电感很大,测出来的波形全是假的振铃。我见过有人拿无源探头测DDR3时钟,测出来上升沿全是台阶,误判成阻抗不匹配,折腾了好几天,换差分探头之后波形干干净净。测DDR3信号,必须用差分有源探头或者专门的SMA测试夹具,探头焊在测试点上,不要用探针手持去戳。
5.3 初始化训练失败的排查顺序,按链路从后往前查
如果Zynq在FSBL阶段打印DDR training失败,或者训练通过但运行不稳定,别一上来就怀疑芯片或者软件,按这个顺序排查:
先看ZQ电阻。ZQ电阻没焊、虚焊、贴错阻值,DDR3颗粒的校准基准就错,所有ODT和驱动强度配置全部作废。用万用表量一下240Ω是否准确,这是我认为优先级最高的检查项。
再看VREF和VTT电压。VREF应该是0.75V左右,VTT也是0.75V左右。VTT如果偏高或者偏低,端接点的直流工作点就偏移,信号的高电平和低电平阈值都会受影响。
然后查差分时钟的极性和等长。CK和CK#如果反相,DDR3颗粒直接罢工;DQS差分对内两根线如果不等长,采样点就会偏移。示波器确认时钟频率和幅度,再确认DQS和DQ之间的相对相位。
如果这些都正常,就要考虑地址线和数据线的等长问题了,尤其是用两片颗粒的时候,第一片颗粒和第二片颗粒的地址到达时间差是否过大。DDR3的write leveling可以补偿一部分,但如果走线差异超过500mil,训练算法经常会失败。最后才去怀疑驱动强度配置和ODT的软件参数,因为软件参数可以通过调整来临时缓解,但硬件层面的问题改软件是解决不了的。
5.4 实测中的常见波形问题和对应解法
我实测DDR3波形时总结过一张对照表,遇到问题按波形形态分类处理会快很多:
| 波形现象 | 可能原因 | 处理方向 |
|---|---|---|
| 过冲超过VDD+0.4V | 端接电阻缺失或阻值偏大 | 减小VTT端接电阻,或打开颗粒ODT |
| 振铃持续时间长 | 走线阻抗偏高,源端反射未吸收 | 检查阻抗是否在公差内,考虑加源端串阻 |
| 眼图幅度偏低 | 串阻过大或ODT过小 | 去掉串阻,调大ODT阻值 |
| 上升沿出现台阶 | 探头地线过长或过孔stub谐振 | 换差分探头,考虑背钻 |
| 训练时好时坏 | ZQ电阻漂移或VTT噪声大 | 检查ZQ电阻精度,优化VTT电源去耦 |
这里有个经验之谈:DDR3的地址线过冲问题,很多时候不是靠加更强的端接解决的,而是靠降低驱动强度。Zynq PS端DDR控制器的地址线驱动强度可以配置,改小一档,过冲和振铃都会有改善。但驱动强度太低,信号幅度又不够,所以这个参数要配合端接电阻一起调,不能单方面追求信号干净。
6. 几块板子踩出来的端接与阻抗自检清单
做过的Zynq7 DDR3板子多了,后来我形成了一套固定的自检流程,每次发板前过一遍,能挡掉大部分低级错误。这里直接分享出来,供大家参考。
第一,电源网络检查。VDD、VDDQ、VTT、VREF这四路电源各自的电压、纹波、去耦电容是否满足要求。VTT电源必须有拉灌双向能力,不能拿普通LDO代替。VREF如果是电阻分压,分压电阻精度不低于1%,分压点必须加去耦电容。
第二,ZQ电阻检查。每个DDR3颗粒的ZQ引脚都有独立的240Ω±1%电阻到地,阻值、封装、位置都要确认。ZQ电阻不能共用,也不能用排阻替代,这是DDR3的硬性要求。
第三,端接方案确认。数据线依赖ODT,不搞外部端接;地址线末端VTT上拉电阻预留到位,阻值根据仿真结果确定;差分时钟端接预留;所有端接电阻的摆放位置都在信号链路末端,stub最短。
第四,阻抗设计确认。叠层和目标阻抗已发给板厂确认,线宽、线距和参考平面完整。所有的DDR3信号是否都在参考平面连续的区域内走线,有没有跨越电源分割。如果发现跨分割,要么换层,要么把这个区域的地平面合并成完整的一块。
第五,等长规则确认。每个字节通道的DQ/DM相对DQS控制在±20mil以内,DQS差分对内±5mil,地址线组内±150~200mil,DDR3信号整体换层次数不超过两次。
第六,测量条件确认。板子上有没有预留DDR3测试点,测试点位置是否方便差分探头焊接,TDR测试的过孔是否引出。这一步很多人嫌麻烦省略了,等到板子调试时才发现没地方下探头,临时飞线又破坏了信号完整性,非常被动。
再分享一个实际体会。我前几块板子习惯模仿开发板的参考设计,看到ZedBoard的DDR3电路没加VTT端接,也照样跑得好好的,就以为可以照搬。后来才想明白,参考设计之所以能省掉这些端接,是因为它的布局极度紧凑、走线极短、层叠极干净。你的板子如果空间没那么宽裕,颗粒位置没那么理想,就必须老老实实按信号完整性的逻辑去加端接。参考设计是起点,不是终点。
还有一个小技巧:DDR3的故障复现往往需要时间,单纯跑一个Linux启动看不出来,我会在调试阶段用特定的内存压力测试工具做全地址空间的读写校验,连续跑4小时以上,同时监控板载温度传感器。如果这个测试能过,说明时序裕量基本充足;如果跑到某个温度阈值附近开始报错,大概率是过冲、振铃这类和温度强相关的信号完整性问题,优先回头检查端接和阻抗。这个方法帮我定位过至少两块板子的偶发性死机问题。
Zynq7系列DDR3 PCB设计的核心说到底就两条:让走线的特征阻抗稳定在目标值附近,把该端接的信号在正确的位置端接掉。这两件事做扎实了,DDR3的training和压力测试基本就是一次过的事。如果还在画板阶段,希望这篇总结能帮你少走几趟改版的冤枉路。