K7 FPGA板级原理图设计实战:电源树、配置链路与DDR3避坑

📅 发布时间:2026/10/7 20:54:04
K7 FPGA板级原理图设计实战:电源树、配置链路与DDR3避坑
板子回来的第三天DONE灯还是黑的。电源灯全亮JTAG能扫到器件Vivado里也能识别出XC7K325T可就是不下配置。那一次我在实验室守到凌晨两点把S4-FPGA-K7这块板子的原理图从头翻到尾最后发现问题出在一颗4.7k的上拉电阻上——不是焊错是设计时漏了。这件事之后我对板级原理图这四个字的敬畏程度比写任何一段Verilog都要高。FPGA的代码写错了改一行重新综合就行K7的板级原理图画错了等板子回来再发现动辄就是几周时间和一笔不小的打样费。这篇内容就是围绕这块K7板子的硬件实战展开的从电源树、配置链路、时钟、IO Bank到DDR3把原理图阶段能想清楚、也必须在原理图阶段想清楚的东西挨个捋一遍。适合已经能跑通简单FPGA工程、准备自己画一块K7板子的朋友也适合手上有一块现成开发板、想搞明白它为什么这么设计的人。1. 一块K7板子的原理图到底在设计什么1.1 S4这个版本要解决的核心问题很多人第一次画FPGA板子思路是照着开发板抄一遍。抄本身没问题问题是抄完之后你不知道哪些线是能改的、哪些线是碰都不能碰的。S4-FPGA-K7这个版本我给它定的目标很明确一块能长期跑高速串行接口和多路外部器件的通用平台而不是一块只为了点灯的验证板。具体来说它要满足几个硬指标K7的16路GTX里至少引出4路到板边或者光模块座DDR3要跑到1600Mbps并且能稳稳通过读写测试外部要留出足够的HR Bank给3.3V电平的外设配置方式以Master SPI为主同时保留JTAG和SelectMAP的调试口。这几个目标一旦定下来原理图的大半骨架其实就已经确定了——因为16路GTX意味着Bank 115到118全部要引出来一旦动MGT电源树里就必然多出MGTAVCC和MGTAVTT两组低噪声电源时钟部分也必须上专用差分参考时钟。我习惯在动手画第一根线之前先用Vivado的I/O Planning把引脚分配做一遍。这个顺序很关键先规划引脚再画原理图最后用CSV和网表互相对。反过来做——先画原理图、再回头分配引脚——基本上一定会遇到这个信号只能走HR Bank但HR Bank的管脚已经被占了这种死循环。1.2 原理图阶段最容易埋下的三类雷从我自己和身边朋友翻车的情况看K7板级设计出的问题集中在三类。第一类是电源域漏项。K7的电源域数量比很多人想象的多VCCINT、VCCBRAM、VCCAUX、VCCAUX_IO、VCCO每个Bank一组、MGTAVCC、MGTAVTT、VCCADC、VCCBATT、MGTVCCAUX。少接一个VCCAUX_IO板子可能照样能配置但某个Bank的IO就是不动排查起来极其费劲因为看起来电源都正常。第二类是配置引脚的上下拉和滤波。PROGRAM_B、INIT_B、DONE这三根线每一根的上下拉方向和阻值都有讲究再加一个CFGBVS接错直接导致配置模式识别失败。这类问题最阴险的地方在于它平时不发作等你在实验室按复位键、或者插拔一次电源的时候才随机出现。第三类是Bank电压规划冲突。K7的Bank分HRHigh Range和HPHigh Performance两类HR的VCCO最高能到3.3VHP只到1.8V。你要是没注意把一路3.3V外设接到了HP Bank上板子做出来要么不工作要么工作一段时间后IO损坏。1.3 我习惯的交付物与检查节点原理图画完之后我一般会产出四样东西完整原理图、BOM、引脚分配表和Vivado里的CSV一致、以及一份关键网络清单。最后这份清单是我自己的土办法格式很简单就是列出所有电源网络、配置网络、参考时钟网络标上它们的电压、上下拉情况、以及这根线在PCB上有什么特殊要求。比如网络名类型电压/阻值PCB要求VCCINT电源1.0V铜皮尽量宽去耦电容贴背面MGTAVTT电源1.2V单独铺铜远离DDR区域PROGRAM_B配置4.7k上拉至VCCO_0走线短可加100pF到地MGTREFCLK0时钟差分100Ω严格等长包地DONE状态330Ω上拉至VCCO_0接LED时注意不要加重负载这份表在PCB布局阶段价值极高因为板厂和同事不需要理解整个FPGA系统只要照着这张表处理关键网络就行。做了几版之后我发现原理图质量的高低很多时候不体现在图好不好看而体现在别人拿到你的图能不能在没有你的情况下把它画成板。2. K7的电源树十几路电压怎么排才不出错2.1 先把电压域列全再谈选型K7的电压域我建议一开始就画一张表列出来不要边画边想。核心的几组是VCCINT1.0V-1L低功耗版本是0.9V或0.95V、VCCBRAM1.0V、VCCAUX1.8V、VCCAUX_IO1.8V或2.0V、VCCO_0到VCCO_x每个Bank独立、MGTAVCC1.0V、MGTAVTT1.2V、MGTVCCAUX1.8V、VCCADC1.8V、VCCBATT1.5V仅在用BBRAM时。列表的目的是看电流。XC7K325T在满负载、高翻转率的情况下VCCINT的电流轻松上到十几安培这是整个电源树里最大的一路也是决定你DC-DC选型和叠层设计的一路。VCCAUX通常是几百毫安VCCO取决于外设接了多少MGTAVCC和MGTAVTT单路在几百毫安量级VCCADC只有几毫安但要求最干净。实际选型的时候我一般是这样分配的VCCINT用一颗多相或者大电流的单相DC-DC比如20A以上的模块VCCAUX/VCCAUX_IO合用一路1.8VVCCO按Bank的电压分组同电压的Bank可以共用一路MGTAVCC和MGTAVTT各自独立一路LDO或低噪声DC-DCVCCADC用LDO并且加磁珠隔离。这个分配方式不是唯一解但它的好处是每一路电流都不紧张噪声也容易控制。2.2 上电顺序与单调上升为什么它不是玄学Xilinx的7系列数据手册里给了推荐的上电顺序大方向是VCCINT先起然后VCCBRAM再VCCAUX和VCCAUX_IO最后VCCOMGT部分则是VCCINT先于MGTAVCCMGTAVCC先于MGTAVTT。很多人觉得这个顺序是厂家随便写的其实它有物理原因FPGA内部有大量ESD保护二极管和寄生PN结如果某个高压轨先于低压轨建立电流会通过寄生通路倒灌轻则增加漏电重则直接损坏IO。比顺序更容易被忽略的是上升时间。手册通常要求每路电源从10%到90%的爬升时间落在一个窗口内常见的是0.2ms到50ms而且要求单调上升、不能有明显的台阶或者回落。我在一块老板子上就遇到过一次用了一颗带软启动的DC-DC启动过程中输出电压先冲到1.15V再回落到1.0V结果FPGA偶尔能配置成功、偶尔不行。后来把软启动电容调小让爬升变快且单调问题就消失了。做法上有两条路一是用带PGOOD的电源芯片级联前一级的PGOOD去使能后一级简单便宜但每一级都要确保自己的输出在合理时间内稳定二是用专用的时序控制器好处是可以精确设定每一路的延时和监控阈值还支持PMBus上报代价是成本增加。S4这块板子我用的是第一种因为电源路数不多级联链路上再加一颗复位监控芯片就能保证所有电源都稳定之后再释放FPGA的复位。提示不管用哪种方案一定要在原理图上把每颗电源芯片的EN、PGOOD、PGND都画清楚并且给PGOOD加上拉。我见过有人把PGOOD悬空结果时序完全是随机状态。2.3 VCCINT大电流路径从电感选型到纹波预算VCCINT这一路是整块板子的重心。十几安培的电流意味着几个事情必须提前算清楚。先说纹波预算。FPGA对VCCINT的容差通常在±3%左右这个容差里要同时容纳DC精度、负载瞬态跌落、以及输出纹波。如果按18A的最大负载、1.0V输出算允许的总偏差大约30mV。那么开关纹波通常要控制在10mV以内剩下的留给瞬态。这个预算一旦定下来输出电感和输出电容的组合基本就确定了电感值不能太大否则瞬态响应慢也不能太小否则纹波大、峰值电流高。我一般会先用大概1μH到1.5μH起步然后根据实际开关频率和电容ESR去核算。再说去耦。DC-DC的输出电容和FPGA引脚旁边的去耦电容是两套体系不能互相替代。前者负责低频和瞬态能量储备后者负责高频回流路径。UG483里给7系列各类电源都列了推荐的去耦组合我的做法是按引脚密度铺小容值再在每个电源区域补中容值和bulkVCCINT每个引脚附近放一颗0.47μF或者1μF每组引脚大约十几个配一颗4.7μF到10μFBGA背面整体再铺几颗100μF以上的钽电容或者聚合物电容最后电源芯片输出端放一颗220μF到470μF的bulk。这个层次不是拍脑袋是因为不同容值的电容在不同的频率段起作用缺哪一层哪个频段就会出问题。注意具体容值和数量要以所用型号对应的PCB设计指南为准不同器件、不同封装给出的建议值会有差异别直接套用别人板子上的数值。2.4 MGTAVCC/MGTAVTT与XADC这些小电源为什么必须单独处理MGT的电源噪声容忍度比普通数字电源低一个数量级。GTX收发器的输出抖动直接受电源纹波影响如果MGTAVTT上叠了几十毫伏的开关噪声眼图会明显闭合。所以这两路我一般不用开关电源直接供而是用低噪声LDO或者用DC-DC预降压再LDO。输入端的滤波也不能省磁珠加大小电容的组合能把从上游数字电源串过来的高频噪声压下去。还有一个容易漏的点是MGTRREF。这是一个精密参考电阻引脚需要一颗100Ω、精度1%的电阻直接拉到地而且这颗电阻要靠近引脚、走线要短、周围不要有其他高速信号穿越。它的作用是给MGT内部的端接和驱动电流提供基准阻值偏了收发器的驱动强度就偏了。XADC这边是VCCADC和VREFP/VREFN。VCCADC是1.8V供电电流很小但要求干净通常从VCCAUX经磁珠隔离后供电旁边放0.1μF和1μF。VREFP/VREFN的接法和你是用内部基准还是外部基准有关两种情况电路完全不同如果你打算用XADC采集板上的电压或者测温度这一段一定要对着手册确认清楚别照着别人的图直接抄。另外7系列有专门的DXP/DXN引脚用于外接温度二极管如果不需要按手册处理即可不要悬空。3. 配置链路从PROGRAM_B到DONE的每一根线3.1 配置模式引脚与SPI Flash的接线细节7系列的配置模式由M[2:0]三个引脚在上电采样时决定。常用的几种是Master SPI对应001Master BPI对应010x8和011x16Master SelectMAP对应100和101Slave SelectMAP是110Slave Serial是111。JTAG不受M[2:0]影响任何时候都能用这也是为什么板子调试阶段JTAG一定不能省。S4这块板子主用Master SPI所以M[2:0]按001处理用4.7k电阻上拉到VCCO_0或者直接拉到对应电平。这里有个细节采样时刻是在INIT_B上升沿也就是说M[2:0]必须在INIT_B释放之前就已经稳定。如果你给M[2:0]加了RC滤波滤波的时间常数不能太大否则采样时刻电平还没建立配置模式就识别错了。SPI Flash这边接线本身不复杂时钟、片选、数据输入输出四根线但有几个细节值得说。一是CCLK在Master SPI模式下是FPGA输出给Flash的所以Flash的时钟输入是FPGA驱动二是Flash的片选和地址线通常需要加上拉防止上电过程中误触发三是如果Flash和FPGA的供电不同步中间可能需要电平转换尤其当Flash是1.8V而VCCO_0是3.3V的时候。这里就要说到CFGBVS——它决定了配置Bank的电压标准当VCCO_0是2.5V或者3.3V时接VCCO_0当VCCO_0是1.8V或更低时接地。这颗引脚接错配置大概率直接失败。3.2 PROGRAM_B、INIT_B、DONE的上下拉与滤波这三根线是配置链路的手、脚和眼睛每一根都有明确的设计要求。PROGRAM_B是输入低电平有效用于复位配置逻辑。它需要一个上拉到VCCO_0的电阻典型值4.7k。如果你在板子上加了复位按键按键按下时把它拉低松手后由电阻拉高。这里要注意的是按键旁边最好并一颗小电容比如100pF到1nF做去抖同时按键到引脚的走线要短避免引入噪声导致误触发。INIT_B是双向的配置开始后被FPGA拉低表示正在初始化初始化完成后释放。它需要上拉典型也是4.7k。很多人会把它当输出直接串电阻去驱动LED这是可以做的但要算清楚驱动能力别因为多接了一个负载影响上升沿。DONE是开漏输出配置成功后释放为高。它需要上拉Xilinx的参考图里典型是330Ω因为要驱动LED。如果你不需要LED指示用4.7k到10k也可以上升沿会缓一些。我个人的习惯是DONE和INIT_B各留一个测试点调试的时候示波器直接勾上去比看LED高效得多。3.3 JTAG与菊花链几块板子串起来时要注意什么JTAG的TCK建议加下拉电阻典型4.7kTMS和TDI建议加上拉TDO不需要。这不是随便定的TCK加下拉是为了在悬空时保持时钟为低电平避免浮空时钟导致状态机乱跳TMS和TDI上拉是为了让悬空输入处于空闲状态不会误进某个状态。如果系统里有多个可编程器件比如FPGA加CPLD或者多块板子级联JATG链的顺序要在原理图上标清楚。原则是TDO接下一级的TDI末级的TDO回到调试器的TDI输入。链路上每个器件的TDI到TDO之间不能有分支否则反射会严重影响高速TCK下的可靠性。还有一点如果链路上有些器件经常不焊最好留一个短接跳线把它们旁路掉否则扫描链会断在缺失的那一级。3.4 配置失败时我的排查顺序配置失败分两种情况一种是JTAG能扫到器件但下不了配置另一种是JTAG都扫不到。前者一般是配置模式或者Flash的问题后者一般是电源、时钟或者JTAG链路的问题。我的排查顺序是这样的第一步量所有电源尤其VCCINT、VCCAUX、VCCO_0确认都在规格范围内且纹波正常第二步量配置模式引脚电平确认上电稳定后的状态和设计一致第三步确认CCLK有没有输出如果没有说明FPGA根本没进入配置流程问题在PROGRAM_B或者INIT_B上第四步用示波器看INIT_B和DONE的时序正常流程是PROGRAM_B释放后INIT_B先低后高然后CCLK开始输出最后DONE拉高。任何一步对不上就往回查。有一次我遇到的现象是CCLK完全没输出折腾了很久才发现是INIT_B上的上拉电阻被误删了导致这跟线一直处于不定状态。整个排查过程其实只花了十几分钟但前面在代码和约束上浪费了一整天。这也说明一个道理配置链路的问题十有八九在硬件上遇到配置失败先量硬件再怀疑代码。4. 时钟与高速串行差分对在原理图阶段就要想清楚的事4.1 参考时钟源选型抖动比频率更值得纠结MGT的参考时钟是整个高速链路的心跳它的抖动会直接传递到输出。选型的时候频率当然是第一个要确定的常见的是125MHz、156.25MHz、100MHz但真正区分好坏的是相位抖动指标。对大多数应用来说RMS抖动在几百飞秒这个量级的晶振就够用了如果你要跑更高速率或者对误码率要求苛刻就需要更低抖动的方案。原理图阶段要处理好的是参考时钟的接法。多数K7板子用差分晶振输出经过AC耦合电容典型0.1μF接到FPGA的专用MGTREFCLK差分对上。耦合电容要靠近FPGA放置两颗电容尽量对称走线在PCB上要严格等长、阻抗控制到100Ω差分。这些要求在原理图上就要以注释的形式写清楚否则PCB工程师很可能按普通信号处理。参考时钟的来源也要留余地。我习惯在原理图上留一个可选的第二时钟源比如从SMA或者板边接进来的差分时钟用0Ω电阻做选择。这样万一板上的晶振频点不合适还有救。这个改动成本几乎为零但省下来的可能是一次改版。4.2 GTX的AC耦合、端接与MGTRREFGTX的收发对在原理图上主要处理三件事AC耦合、端接、以及参考电阻。AC耦合电容通常放在发送端附近容值0.1μF或者0.22μF具体协议有规定时按协议来比如某些高速协议明确要求0.1μF。这个电容的作用是隔断收发两端的直流共模差异。放的位置很关键——放在靠近发送端的地方这样电容之后的长走线是干净的差分对如果放在接收端长走线上就会带着两端的共模差异容易出问题。端接方面7系列的GTX内部一般已经包含了差分端接不需要外部再并电阻。真正需要外部电阻的是MGTRREF前面提过的100Ω精密电阻。有些设计会忽略它觉得内部有自动校准这是不对的——没有这个基准电阻内部的驱动和端接校准就没有参考性能会打折。另外值得一提的是GTX的收发对在原理图上要不要做换极性。7系列支持极性反转所以在PCB布线的时候如果为了绕线方便把P/N调换了是可以在配置里纠正的。但我的建议是原理图上不要主动做这种预留除非PCB确实绕不开。因为一旦允许换极性排查问题时你就多了一个需要确认的变量。4.3 时钟分配网络里的扇出与去抖FPGA内部的MMCM和PLL从参考时钟产生各种工作时钟但板级层面也有时钟分配的问题。如果一颗晶振要同时给FPGA、PHY芯片、ADC等多个器件供时钟就需要一个时钟缓冲器或者扇出芯片。选这类芯片的时候要注意两点一是输出之间的偏斜skew要小否则多个器件之间的采样窗口对不上二是未使用的输出要端接或者关闭悬空的差分输出会反射。去抖或去耦方面时钟芯片的电源脚旁边一定要放小容值电容而且时钟芯片的电源最好和数字电源分开用磁珠或者LDO隔离。这不是过度设计我在一块板子上就见过因为时钟芯片和DDR共用一路电源导致时钟上叠加了DDR的开关噪声最终表现为误码率随内存访问负载变化而变化非常难查。5. IO Bank规划VCCO分组决定你后面能不能少改一次板5.1 HR与HP Bank的电压边界K7的IO Bank分成两类HR Bank支持的最高VCCO可以到3.3V适合接各种传统外设HP Bank的VCCO上限是1.8V但支持更高的翻转速率和更灵活的端接方式。这个边界是硬性的不能靠应该没事来赌。在S4这块板子上我把接3.3V外设比如UART、SPI Flash、部分低速总线的接口全部放在HR Bank上把DDR3和对速度敏感的信号放在HP Bank上。这个分配在原理图阶段就要定死因为一旦定型PCB的层叠和走线规划都要跟着走。还有一个经常被忽略的细节同一Bank内所有IO的VCCO必须相同。也就是说如果你把一个Bank分给两个不同电压的外设就必须在这个Bank内加电平转换或者在引脚规划阶段就把它们拆到不同Bank。我见过有人在同一个Bank上接了1.8V的SPI和3.3V的LED结果是LED一亮SPI就通信异常——因为VCCO被拉到了某个中间值两边的电平标准都不满足。5.2 VCCO分组与电平冲突的常见场景VCCO分组的思路很简单同电压、同电源域的外设尽量放在同一个Bank不同电压的分到不同Bank。但实际操作中会有几个常见冲突场景。第一个是剩余引脚不够。比如你规划好了Bank 12给1.8V但1.8V的外设只需要5个引脚Bank 12剩下的20个引脚就浪费了。这时候可以考虑在同一个Bank里混用——前提是电压一致。如果电压不同就必须在原理图上加电平转换芯片把成本和面积算进去。第二个是上电时序冲突。有些外设在FPGA之前上电如果它们的IO直接接到FPGA的IO上FPGA还没上电时会有电流从外设灌进FPGA的IO。这种情况需要在原理图上串限流电阻或者用带双向电平转换的芯片。7系列的部分IO支持热插拔保护但具体哪些引脚支持要以手册为准。第三个是参考电压与DCI的使用边界。7系列的HP Bank支持DCIDigitally Controlled Impedance可以用内部端接替代外部电阻省掉一堆外部电阻。但DCI需要在Bank内使用专用的VRP/VRN引脚和精密参考电阻而且使用了DCI之后这个Bank的引脚分配会受限。所以如果不是很在意BOM成本用外部端接反而更灵活。5.3 去耦电容的容值组合与摆放逻辑去耦电容这块我踩过的坑比想象中多。最典型的一次是在一块板子上VCCAUX去耦按部就班做了但VCCAUX_IO只放了两颗0.1μF。结果板子跑起来没问题一做EMC测试某个频段辐射超标。后来补上中容值电容就压下去了。原理上不同容值的电容对应不同的谐振频率。小容值0.1μF、0.47μF在几十兆到几百兆的频率上阻抗最低负责高频回流中容值4.7μF、10μF覆盖中间频段大容值47μF以上负责低频和瞬态能量。如果某一层缺失对应的频段就会呈现高阻抗电源噪声就压不住。摆放的逻辑比容值更重要。小容值电容要尽量靠近引脚因为它们的有效半径小走线长了电感就把效果吃掉了。大容值电容可以离得远一些。BGA封装的话常规做法是小电容放在焊盘背面中容值放在BGA外围bulk电容放在电源芯片附近。这个层次关系在原理图上就应该用分区标注体现出来不要只画一个大电容阵列那样PCB工程师只能自己猜。提示去耦电容的容值组合和数量务必要参考所用型号的PCB设计指南。Xilinx的UG483把各类电源的推荐方案列得很细按表格来比凭经验拍脑袋可靠得多。6. DDR3接口在原理图上要交代清楚的事6.1 VDDQ/VTT/VREF三个电压的关系DDR3有三个容易被混为一谈的电压VDD/VDDQ通常是1.5V或者1.35V的低压版VTT是VDDQ的一半0.75VVREF也是VDDQ的一半但要求更干净。这三个电压的关系必须理解清楚否则原理图会画歪。VDDQ是主供电电流大用开关电源。VTT是地址命令总线的端接电源关键点是它必须能灌也能拉——因为端接电阻上的电流方向会随总线电平变化一会儿从VTT流出一会儿流回VTT。所以VTT不能用普通的LDO或者开关电源直接供必须用专门的DDR端接电源芯片这类芯片内部是能双向工作的。VREF是参考电平电流极小但要求极高。它通常由VDDQ经两颗1%精度的等值电阻分压得到旁边并0.1μF和1μF去耦而且VREF的走线要远离高速信号最好单独走一层或者包地。有些人图省事把VREF直接接到VTT上这是不行的——VTT上有大量端接电流引起的波动会直接污染VREF。6.2 地址命令的fly-by与端接DDR3的地址、命令、控制总线在PCB上采用fly-by拓扑也就是从FPGA出发依次串接到每一颗内存颗粒上末端用一个电阻端接到VTT。这个拓扑在原理图上要体现出来的是每一段的连接顺序和末端端接电阻的位置。为什么要用fly-by而不是星形因为在DDR3的速率下信号的建立保持窗口非常窄fly-by能让每一颗颗粒看到的信号沿足够陡、反射足够小。代价是每颗颗粒接收信号的时间有先后差异这个差异要靠FPGA端的写平衡write leveling去补偿。原理图上要注意的是数据线DQ/DQS不走fly-by而是点对点每8位一组配一对差分DQS组内严格等长。地址命令是fly-by加端接。这两类线在原理图上最好用不同颜色或者不同分页标注清楚方便PCB工程师区分处理。6.3 从原理图到约束文件的一致性检查DDR3这块还有一个坑原理图上的引脚连接和Vivado里的引脚约束必须完全一致而且DQS的P/N极性、字节组的划分都要对上。我一般会做一次机械的交叉核对把原理图导出的网表里所有DDR相关引脚按Bank和Byte分组和Vivado的XDC逐条比对。比对的内容包括引脚位置、IO标准SSTL15还是SSTL135、以及是否使用了内部端接。这里有个细节DDR3的DQS差分对在某些Bank上需要特定的引脚位置不能随便放因为DQS要接到FPGA内部的专用时钟资源上。原理图阶段如果没查这个PCB画完才发现要改代价就大了。另外VREF的引脚在7系列里通常是专用的不能当普通IO用。原理图上给VREF供电的那一路要单独标注PCB上也要单独处理。7. 板子回板之后的点亮流程与那个让我熬到两点的坑7.1 上电前的静态检查板子拿到手我不会立刻上电。第一步是用万用表把所有电源网络对地测一遍阻值确认没有短路。正常的阻值不会是零也不应该很小——如果某一路只有几欧姆基本可以确定有短路先别上电。第二步是目视检查BGA区域和电源芯片周围看有没有明显的锡珠、虚焊、立碑。第三步是对着原理图确认几颗关键的上下拉电阻、0Ω选择电阻是不是按设计焊接的。我有一次就是在这步发现一颗0Ω电阻没焊省下了后面几个小时的困惑。7.2 分级上电与关键点测量上电的时候我习惯用可调电源限制电流从低压开始边升边看电流。如果电流异常立刻断电。电源正常之后按顺序量VCCINT、VCCAUX、VCCO_0、MGTAVCC、MGTAVTT确认电压值和纹波。纹波用示波器配合弹簧地线测不要用长地线否则测出来的全是环路耦合的噪声。这一步里我还会量一遍配置模式引脚的电平确认M[2:0]的状态和设计一致。如果是Master SPI模式还要看CCLK有没有输出。CCLK有输出说明FPGA已经进入配置流程问题就缩小到Flash和配置数据上CCLK没输出问题就在电源、复位或者配置模式上。7.3 DONE不亮的一次完整排查链路回到开头那次熬到凌晨两点的经历。现象是所有电源正常JTAG能识别器件用Vivado直接下载bit文件有时成功有时失败从Flash启动基本不成功DONE灯偶尔亮一下又灭。我的排查过程是这样的。第一步量电源全部正常排除电源问题。第二步看CCLKJTAG下载的时候有输出说明配置流程能走。第三步用示波器同时抓PROGRAM_B、INIT_B、DONE三根线发现INIT_B在JTAG下载结束后没有立刻回到高电平而是缓慢地往上爬爬了几百微秒才到位。这个现象说明这根线上的等效负载太大或者上拉太弱。顺着这条线查发现INIT_B除了上拉电阻还接到了一个测试点和一颗指示用的MOS管栅极MOS管的输入电容加上测试点的寄生电容把上升沿拖慢了。更麻烦的是那颗上拉电阻的实际阻值不是设计的4.7k而是10k——因为BOM里写的是4.7k到10k优先这样的模糊描述采购选了10k。两个因素叠加就出现了偶发失败。改法很简单上拉改回4.7kMOS管换成高阻输入的类型测试点保留但走线改短。改完之后JTAG和Flash启动都稳了。这件事之后我给自己定了个规矩原理图BOM里不允许出现范围值所有关键上拉下拉都必须给单一阻值并且标注精度。7.4 几个我后来固定下来的习惯做了几版K7板子之后有些习惯基本固定下来了。第一所有配置相关的关键网络在原理图上单独用一页画不和其他逻辑混在一起。这样这一页可以整体review也方便后续改版对比。第二关键测试点一定留。PROGRAM_B、INIT_B、DONE、CCLK、每一路电源全部留测试点或者测试焊盘。这些测试点占不了多少面积但没有它们调试时间会成倍增加。第三参考时钟和MGT的收发对原理图上要写清楚PCB要求差分100Ω、等长、包地并且单独列一张表交给PCB工程师。第四DDR3的VREF、VTT、VDDQ三路电源在原理图上分组画避免PCB布局时被混在一起。第五任何从手册里抄来的电路都要在原理图上标注来源哪份文档、哪一页。这个习惯看起来多余但等你要改版的时候你会感谢当时的自己——因为你能立刻知道某个电路的约束条件是什么而不是对着一堆没有出处的电路瞎猜。最后再分享一个小技巧如果你在原理图阶段拿不准某个引脚该怎么处理先别急着按自己的理解画。把这块引脚在器件手册里的描述找出来看它是必须接、可选还是不用时如何处理这三类处理方式完全不同。我在一块板子上因为把一个不用时应接地的引脚悬空了导致XADC读数一直不稳定找了很久才定位到。硬件这东西原理图阶段多花一天回板之后可能少花一周。