如果你跟我一样,第一次打开 XC7Z020 的引脚图时差点被满屏的电源引脚劝退,那这篇笔记就是写给你的。FPGA 入门本身就不算轻松,Zynq 这种“ARM + FPGA”的 SoC 更是把硬件复杂度拉高了一个档次。但真正把 XC7Z020 最小系统搭起来之后,你会发现它其实是有规律可循的——电源、时钟、复位、配置、下载,就这五件事,每一件都有明确的设计套路。这篇文章我会从原理图层面一层层拆解,把我踩过的坑、验证过的做法、还有那些官方文档里没写透的细节全翻出来,给准备做 XC7Z020 核心板或评估板的同学一个可以直接照抄的参考。
这套最小系统解决的核心问题很朴素:让 PS(双核 ARM Cortex-A9)能启动、让 PL(可编程逻辑)能加载、让 JTAG 能连上、让串口能打印。适合正在学习 FPGA 的入门者、准备自己画 Zynq 板卡的硬件工程师,也适合想搞明白“为什么别人画的板子一次就能跑起来”的软件开发者。不管你是刚摸到 FPGA 边缘的新手,还是已经做过几块 STM32 板子想升级到 SoC 硬件设计的老手,这篇文章都能帮你把最关键的几道坎提前趟过去。
1. 动手前先搞懂:XC7Z020 到底需要哪些“最小”资源
1.1 Zynq 不是“FPGA 加 ARM”,而是“一块完整的微型电脑”
很多人第一次接触 XC7Z020,以为它就是“普通 FPGA + 一个 A9 硬核处理器”这么简单。实际用起来你会发现,它更接近一台微型电脑:PS 端集成了双核 ARM Cortex-A9、DDR 控制器、DMA 控制器、各种外设控制器(UART、SPI、I2C、USB、SD、以太网 MAC 等),PL 端才是真正的 Artix-7 架构可编程逻辑。
为什么这个区别很重要?因为“最小系统”的设计范围被彻底改变了。
纯 FPGA 的最小系统,比如大家熟悉的 Spartan-6、Artix-7 最小板,核心就三块:配置电路、时钟、电源。但 Zynq 的最小系统多了一整个 PS 域,它的启动依赖 BootROM、依赖 MIO 引脚电平配置、依赖 PS_CLK 时钟、依赖 PS_POR_B 复位。你如果把 Zynq 当成普通 FPGA 去玩,只接了配置电路和 PL 侧 IO,那这块芯片大概率是“活”不起来的,JTAG 能识别到,但 PS 完全不工作,你连个串口打印都看不到。
所以搭建最小系统之前,心里要先有一个明确概念:你是在设计一台“还没装壳子的迷你电脑”,而不是一块“能跑逻辑的 FPGA 开发板”。
1.2 最小系统的功能边界:先跑起来,再谈扩展
我见过很多新手做第一版 Zynq 板子,恨不得把所有外设全都焊上去:HDMI、千兆网口、USB Host、SD 卡座、DDR3、甚至还有几个高速 ADC 接口。结果板子画了一个月,打样回来发现连 JTAG 都连不上,最后只能一个一个拆电容找短路。
做最小系统,请严格守住这条功能边界:必须有的东西一样都不能少,可以后加的东西一律先不加。
必须有的:
- 完整的电源树,包括 VCCINT、VCCBRAM、VCCAUX、VCCPLL、VCCO_MIO、VCCO_DDR(如果接 DDR)以及所有 PL Bank 的 VCCO;
- PS_CLK 时钟,通常用 33.33MHz 有源晶振;
- PS_POR_B 复位电路;
- Boot Mode 配置电路,也就是 MIO[5:2] 的电平设置;
- JTAG 下载链路;
- 至少一个可以验证 PS 启动的串口,也就是 MIO 48/49 引出到 USB 转串口。
可后加的:DDR3、以太网、USB、HDMI、SD 卡座、各种扩展 IO、PL 侧的 SPI Flash(如果准备从 QSPI 启动,那 Flash 必须加,但也可以先用 JTAG 模式玩着,后面再补)。
我在自己项目中采用的原则很简单:第一版只保留 JTAG + 串口 + QSPI Flash + DDR3。DDR3 我还是建议第一版就焊上去,因为 Zynq 的 PS 侧 DDR 控制器本身是验证高速接口稳定性的核心,如果第一版不焊,后面跑 Linux 或者大数据量图像处理时会非常难受。但如果你只是点灯、跑跑 PL 逻辑,可以先不上 DDR,把 VCCO_DDR 电源和引脚预留好就行。
1.3 你最终会得到怎样的一个系统
当这块最小系统真正跑起来时,你的体验应该是这样的:上电,电流表显示几百毫安的稳定电流;Vivado Hardware Manager 里能正常识别出 XC7Z020 的 IDCODE;用 JTAG 可以直接下载 bitstream 点亮 PL 侧 LED;把 Boot Mode 拨到 QSPI 或 SD,串口上能看到 BootROM 打印的启动信息,或者直接进入 U-Boot 命令行。
能做到这三件事,这块最小系统就算合格了。后面不管你往上面挂 DSP 算法、图像处理、MIPI 采集还是软核扩展,都有一个扎实的底座。
2. 原理图第一关:电源树设计,决定了这块板子能不能点亮
2.1 XC7Z020 的电源域拆分
Zynq 的电源引脚非常密集,第一次画原理图时很容易眼花缭乱。但只要你把电源域拆开看,就会发现逻辑很清晰。以 XC7Z020 为例,主要电源轨如下:
| 电源轨 | 典型电压 | 主要用途 | 设计参考电流 |
|---|---|---|---|
| VCCINT | 1.0V | PL 逻辑内核供电 | 500mA ~ 2A,取决于逻辑资源占用 |
| VCCBRAM | 1.0V | Block RAM 供电 | 与 VCCINT 同电压,可合并供电 |
| VCCAUX | 1.8V | PL 辅助电路、部分配置逻辑 | 100mA 左右 |
| VCCPLL | 1.8V | PS 内部 PLL 供电 | 几十 mA |
| VCCO_MIO0 | 1.8V 或 3.3V | MIO Bank 0/500 供电,包含 Boot Mode 引脚 | 几十 mA |
| VCCO_MIO1 | 1.8V 或 3.3V | MIO Bank 1/501 供电,包含串口引脚 | 几十 mA |
| VCCO_DDR | 1.5V | DDR3 接口供电 | 视 DDR 负载而定 |
| VCCO_PL Bank x | 3.3V / 2.5V / 1.8V | 各 PL IO Bank 供电 | 视外设而定 |
这里有一个新手最容易忽略的点:VCCAUX 和 VCCPLL 虽然通常都接 1.8V,但它们在封装内部是独立的电源域,原理图上要分网络名、分电容去耦,不能图省事共用一个磁珠就直接并过去。我见过有人把 VCCPLL 和 VCCAUX 共用一路还省了滤波电容,结果 PS 内部 PLL 抖动大,串口偶尔乱码。
VCCBRAM 虽然可以和 VCCINT 短接,但建议在电源输出端做一个磁珠隔离或者至少用单独的网络名,方便后期调试时分开测量 Block RAM 和逻辑内核的功耗分布。
2.2 上电顺序:为什么顺序不对会出大问题
Zynq 的上电顺序要求很明确:VCCINT 和 VCCBRAM 要先上电,然后是 VCCAUX,最后才是各路 VCCO。简单记就是“先核心、后辅助、再 IO”。VCCPLL 要求不晚于 VCCAUX。
为什么这么严格?因为 Zynq 内部有很多 ESD 保护二极管和上电钳位电路。如果 VCCO 先于 VCCINT 上电,IO 引脚上的电压会通过内部二极管倒灌到 VCCINT 网络,导致内核电源被“抬高”到莫名其妙的电平。轻则芯片启动异常,重则直接损坏 BGA 内部结构。这不是危言耸听,Zynq 数据手册里明确标注了上电时序要求,而且违反了之后的现象非常诡异——有时候能启动,有时候不能,极其难查。
最稳妥的实现方案是用带 Power Good 输出的电源芯片做级联控制,或者直接用 Zynq 配套的 PMIC,比如 TI 的 TPS65218。如果只是做最小系统,不想引入复杂 PMIC,那至少要选择带 EN 和 PG 引脚的 DC-DC,把前一级的 PG 接到后一级的 EN,形成链式上电。千万不能用“同时上电”来赌运气,也别用 RC 延时去控制,RC 延时在温度变化和负载变化时完全不靠谱。
我第一版板子就是图省事,把 3.3V 和 1.0V 都从一个 5V 适配器经两个独立 DCDC 供电,没做任何顺序控制。结果 10 块板子里有 3 块 JTAG 连不上,另外几块偶尔能连上但跑不稳定,排查了整整一周才发现是上电顺序的问题。
2.3 电源选型与电流估算:DCDC 还是 LDO,怎么选
XC7Z020 的 VCCINT 电流取决于 PL 逻辑资源使用率。在 Xilinx 的功耗估计工具里可以算,但如果你还没开始写逻辑,可以参考一个粗略值:50% 左右逻辑资源占用、300MHz 左右 PL 频率时,VCCINT 电流大约在 1A 上下。为了给未来留下余量,VCCINT 这条电源轨至少要按 2A 设计。
内核电流这么大的情况下,VCCINT 千万不要用 LDO。你可能觉得 AMS1117-1.0 这种芯片便宜又简单,但算一下损耗就明白了:输入 3.3V,输出 1.0V,压差 2.3V,如果电流 1A,LDO 上要消耗 2.3W 的热量,一个小封装根本扛不住,而且热噪声还会影响内核稳定性。
VCCINT 建议直接用 DC-DC,比如 TI 的 TPS54620(6A 输出)、TPS54622,或者 MPS 的 MPM3610 这种集成电感的小模块。VCCAUX 和 VCCPLL 电流不大,用低噪声 LDO(比如 TPS7A83、LP5907)完全可以,反而比 DCDC 纹波更小,对 PLL 更友好。VCCO 就看外设需求,如果只是给 3.3V IO 和串口供电,LDO 够用;如果后面要驱动大量 LED、外设,建议也换 DCDC。
设计时可以留出调试余量:每路电源都加测试点,并在原理图上标注你估算的电流值,这样后面用热成像或者钳表排查功耗异常时会方便很多。
2.4 去耦电容与 VCCIO 电平规划:原理图上最容易忽略的细节
XC7Z020 的 BGA 封装有几百个引脚,其中相当一部分是电源和地。原理图阶段就要养成一个习惯:每个电源引脚旁边都规划去耦电容。推荐做法是“大小电容搭配”:小电容 0.1uF 负责高频去耦,大电容 1uF 或 4.7uF 负责中频去耦,电源入口再放 100uF 以上的储能电容。
去耦电容的位置比容值更重要。原则是“就近原则”,电容必须放在对应电源引脚附近,对于 BGA 封装,通常会放在 PCB 背面、对应焊盘的投影位置。如果电容摆在板子角落,再好的电容也起不到作用,因为走线电感已经把高频噪声放过去了。
VCCIO 电平规划也要在原理图阶段一次想清楚。留意:PL 的每个 Bank 电压是由外部 VCCO 引脚供电决定的,不是软件配置。如果你某个 Bank 只接了按键和 LED,就可以统一给 3.3V;如果后续要接 DDR3(通常 PL 侧接 DDR3 需要 1.5V 电平),那就要给对应 Bank 单独规划 1.5V。MIO 的 Bank 电压则决定 PS 端串口、SD 卡等引脚的电平,常用的串口电平是 3.3V,但也有人为了和某些 1.8V 传感器对接而把 VCCO_MIO1 设在 1.8V——这时候串口芯片也必须选 1.8V 电平版本,否则信号回读会把 MIO 引脚打坏。
还有一条容易被忽略的教训:没使用的 PL Bank 也要接正常的 VCCO 电压,不能悬空。因为上电检测和内部逻辑可能默认某些 Bank 为供电状态,悬空容易导致电流倒灌,虽然不一定会立刻烧芯片,但会让功耗异常、启动失败的概率大增。
3. 时钟、复位、配置与下载:最小系统的“五官”缺一不可
3.1 PS_CLK 33.33MHz:时钟不是随便接个晶振就行
PS 端的时钟输入是 PS_CLK,一般用 33.33MHz。为什么是这个频率?因为 PS 内部 PLL 需要根据这个参考时钟生成 CPU 频率、DDR 频率、外设时钟等,33.33MHz 这个值经过分频和倍频组合,最容易得到整数频率,也符合 BootROM 内部的协议时序要求。
很多开发板用的是 33.333MHz 有源晶振。我建议第一版直接用有源晶振,别折腾无源晶振的匹配电容和起振条件。有源晶振的输出驱动能力强,信号边沿干净,对 PCB 布局的要求也低一些。选型时注意精度,一般要求 ±50ppm 以内,普通的贴片有源晶振就能满足。
原理图上,PS_CLK 的走线要尽量短,远离开关电源电感和功率走线。晶振下面不要铺其他信号线,如果空间允许,在晶振旁边加一个地孔阵列做隔离。时钟引脚上可以串联一个 33 欧电阻,起到限流和减小反射的作用。
串口波特率是从 PS_CLK 推导出来的吗?实际上 Zynq 的 UART 波特率更多依赖 PS 内部 PLL 和外设时钟分频,但最终源头还是 PS_CLK。所以如果时钟精度差太多,最明显的症状就是串口乱码,而且频率偏差不是固定整数比例,软件怎么补偿都补偿不到位。
3.2 复位设计:PS_POR_B 与其他复位信号的区分
Zynq 有一个专门的 POR(Power-On Reset)引脚,叫 PS_POR_B,低电平有效。这个复位信号负责整个 PS 域的上电复位,必须在电源稳定之后释放,并且保持低电平的时间要足够长,通常要求至少 10ms 量级。
新手最容易犯的毛病是直接用一颗 10uF 电容和上拉电阻做 RC 复位。RC 复位的时序跟温度和电源上升斜率关系很大,不是一个可靠的方案。正确做法是用专用的电压监控复位芯片,比如 TI 的 TPS3808、MAX809 之类,设定好复位阈值和延时时间,确保 PS_POR_B 的释放晚于所有电源轨稳定。
另外注意 PS_SRST_B 和 PS_POR_B 不是一回事。PS_SRST_B 是系统软复位,通常接按键或者由外部控制器控制,如果不用,应该通过上拉电阻保持在高电平。有些开发板把 PS_POR_B 和 PS_SRST_B 混在一起接,平时没毛病,但 JTAG 调试时软件复位 CPU 常常会失败,就是因为把两个复位信号短路了。
3.3 启动模式:MIO[5:2] 跳线设计
Zynq 启动模式不是软件配置,而是由 MIO[5:2] 四个引脚的电平决定的。这四个引脚在 PS Bank 500 上,启动时 BootROM 会采样它们的电平,决定从哪个启动源加载镜像。
常见的几种模式:
- JTAG 模式:MIO[5:2] = 0000,所有引脚拉低;
- QSPI 模式:MIO[5:2] = 0010;
- SD 模式:MIO[5:2] = 0110。
最小系统里建议把这几个引脚通过 4 位拨码开关或者 0 欧电阻连接到电源和地,方便随时切换。千万不要让它们悬空,因为 MIO[5:2] 内部没有强的上下拉,悬空电平不确定,启动模式就会随机漂移,运气好能启动,运气不好一次一个样。
拨码开关的走线要短,而且 MIO 引脚上的并联电容不能太大,否则上电瞬间电平建立太慢,BootROM 可能采到错误值。我踩过一次坑:给 MIO 配置脚加了 100nF 去耦电容,结果上电后经常进入错误启动模式,后来把这几个电容去掉才好。
3.4 JTAG 下载链路:为什么总是识别不到芯片
JTAG 是调试 Zynq 的命脉。连接方式很简单:TCK、TMS、TDI、TDO,加上目标板电源和地。XC7Z020 的 JTAG 链路包含 PS 和 PL 两部分,在 Vivado Hardware Manager 里能同时看到两个 device。
接线时注意 JTAG 信号电平要与 VCCO_MIO0 匹配。如果你给 MIO Bank 0 供电 1.8V,JTAG 的 IO 电平就是 1.8V,这时候要选支持 1.8V 电平的下载器或转接板,否则 TDO 回读信号逻辑电平不匹配,下载器会识别不到芯片。市面上常见的 Xilinx 平台线缆 USB II 或兼容 FT2232 方案的下载器一般能自适应 1.8V 到 3.3V,但最好还是确认一下。
如果识别不到芯片,优先查这几个地方:VCCINT 有没有电、PS_POR_B 有没有正常释放、TCK 和 TMS 有没有上拉电阻(一般推荐上拉到 VCCO_MIO0)、TDO 到连接器之间的走线有没有短路。排查顺序按照“电源 → 复位 → 时钟 → JTAG 链路”来,不要一上来就怀疑芯片坏了。
4. PCB 布局布线:让原理图变成一块“能稳定运行”的板子
4.1 板层规划:4 层还是 6 层,分别怎么分配
XC7Z020 是 BGA 封装,引脚密度大,而且涉及到 DDR3、JTAG、时钟等信号,所以 PCB 层叠规划比普通 STM32 板子讲究得多。
如果你第一版不焊 DDR3、只跑 JTAG + 串口 + 点灯,其实 4 层板就够用:信号层、地层、电源层、信号层。中间的地层和电源层要保证完整,分割尽量少,BGA 扇出时不要穿过大面积缝隙。
但只要你打算焊 DDR3,我强烈建议直接上 6 层板:信号层、地层、信号层、电源层、地层、信号层。这样做的好处是 DDR 走线可以有一个干净的参考地平面,电源层也能更从容地分割,而不会像 4 层板那样,电源平面被切得支离破碎导致各路电源的回流路径混乱。
我自己的经历是:第一版用 4 层板带 DDR3,DDR 时钟和 DQS 差分对刚好跨过电源层分割区,结果 667MT/s 的传输速度下偶尔出现数据错误,跑 Linux 时磁盘校验失败。后来改版换成 6 层板,DDR 区域下方是完整连续的地平面,问题立刻消失。所以,带 DDR 就直接 6 层,省下的打样费不够你 Debug 的时间成本。
4.2 关键网络布线要点:时钟、复位、去耦、电源
PCB 布线时,把“关键网络”单独过一遍,不要全指望自动布线。我每次布完线都会开一个高亮标记,逐条检查以下网络:
时钟线:PS_CLK 和所有差分时钟线,走线尽量短,尽量直,不要跨越电源分割区。如果旁边有高速数字信号,留给它们至少 3 倍线宽的距离。时钟线下面可以铺地,但不要铺成栅格,要铺实心铜。
复位线:PS_POR_B、PS_SRST_B 这类信号,保持干净,远离 DC-DC 电感和开关节点。复位线上不要并联大电容(除了规格书明确要求的),否则复位时间会被拉得很长,甚至导致启动失败。
去耦电容:BGA 背面去耦电容的位置应该在原理图阶段就规划好。一个有效的方法是,先用 CAD 把 XC7Z020 的电源引脚打上高亮,然后在背面投影区域放电容,让每个电源引脚到电容的过孔路径尽可能短。这个过程很花时间,但值得做,因为电源噪声对 Zynq 这种高集成芯片的影响远比想象中大。
电源走线:VCCINT 这类大电流网络,尽量开铜皮或者走宽线,不要用细走线硬连。层间切换时多打几个过孔,减小寄生电感。DDR 的 VTT 和 VREF 不要直接从电源层拉很远,要在 DDR 附近的终端电阻位置单独滤波。
4.3 如果加了 DDR3:高速信号必须做的几件事
DDR3 是很多 Zynq 最小系统的“分水岭”,焊了它,系统的复杂度直接上一个台阶。先说结论:DDR3 布线不是“连对就行”,参数不满足,系统会以一种极其随机的方式出错。
几个核心约束:
- 时钟差分对和 DQS 差分对都要做 100 欧差分阻抗控制;
- DQ、DQS 和时钟之间的组内等长要控制好,一般要求 DQ 组内误差不超过 ±10mil,DQS 相对时钟也要控制在 ±20mil 以内;
- 地址、控制、命令信号相对于时钟要满足建立保持时间,通常需要等长到 ±25mil 左右;
- DDR 的 VREF 和 VTT 电源要干净,VTT 终端电阻要放在 DDR 颗粒和 FPGA 之间靠近 DDR 的位置。
如果你没有高速 PCB 设计经验,第一版可以把 DDR 频率设保守一点,比如 533MT/s,然后在 PCB 设计软件里给 DDR 网络加上等长约束,让工具自动帮你调线。不要手动一根根量,迟早会看花眼。
5. 上电实测:从空板到跑起来,完整调试流程实录
5.1 上电前检查:万用表、短路、电源电压
打样回来的板子,先别急着把 XC7Z020 焊上去。空板状态下,用万用表蜂鸣档测各路电源网络对地是否短路,尤其是 VCCINT、3.3V、1.8V。很多人会在这里发现问题:某个电容焊反了、某个电源引脚和地之间短路、某个 BGA 焊盘连锡。空板阶段排查这些问题比焊完芯片再排查容易得多。
焊完芯片后,先不要接 JTAG,直接上电,观察电流。XC7Z020 在正常待机状态下电流应该在几百毫安级别,具体数值取决于启动模式和 PL 配置。如果电流几乎为零,说明某个电源轨没起来;如果电流异常大,说明有短路或者芯片被打坏了。
此时用万用表量每一个电源轨的电压:VCCINT 是否稳定在 1.0V 附近、VCCAUX 是否 1.8V、VCCO 是否符合设计值。电源轨全部正确之后,再量 PS_CLK,用示波器看晶振波形是否正常起振。这一步通常能排除掉一半的问题。
5.2 JTAG 识别与 PL 验证
上电正常后,连接下载器,打开 Vivado Hardware Manager,点 Auto Connect。正常情况下应该能看到 XC7Z020 出现在设备列表里,IDCODE 是固定的 0x23727093 之类的内容(以实际工具显示为准)。
如果识别不到,先看下载器驱动有没有装好,再看 TCK/TMS/TDI/TDO 这几根线有没有接错方向,最后确认 JTAG 连接器的电平标准。我遇到过最简单也最隐蔽的坑:JTAG 连接器的第 1 脚和第 2 脚定义搞反了,导致目标板电源没送到下载器,下载器自然什么都识别不到。
识别成功之后,可以先用 Vivado 里的 JTAG 测试功能扫描 JTAG 链,如果能读到 idcode,说明 PS 和 PL 的扫描链基本健康。接着可以写一个最简单的点亮 LED 的 bitstream,通过 Program Device 下载,看看 PL 侧 IO 是否正常工作。这一步能验证 PL 的 VCCINT、VCCO、时钟和配置逻辑。
5.3 用串口验证 PS 启动:最小系统的“体检报告”
PS 端能不能跑起来,最直接的验证方法是看串口输出。常用的串口是 UART1,对应 MIO 48(TXD)和 MIO 49(RXD)。把这两个引脚通过 USB 转串口模块连到电脑,注意电平匹配,然后给 PS 烧一个最简单的启动镜像。
有几种做法。最简单的是用 Vivado SDK 写一个 Hello World 裸机程序,通过 JTAG 下载到 OCM 里运行,运行后串口会打印信息。这个方法不需要 DDR,也不需要对启动模式做太多配置,最适合第一版板子的快速验证。
如果 JTAG 下载后能打印,说明 PS 的时钟、复位、MIO 供电都是正常的。这时候再进一步验证 QSPI 或 SD 启动:把启动模式拨到对应位置,烧写 boot.bin,重新上电,观察串口是否在上电瞬间就输出 BootROM 的信息。如果这一步正常,那这块最小系统基本就毕业了。
有一个很容易被忽视的现象:在 QSPI/SD 启动模式下,如果 Flash 里没有合法镜像,BootROM 会等待一段时间然后进入 JTAG 模式,这是正常行为,不要误认为是故障。
6. 常见问题速查与实战避坑心得
6.1 常见故障对照表
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| 上电电流接近 0mA | 电源未使能、焊接不良、保险丝断开 | 逐路量电压,从 5V 输入开始顺着电源链路查 |
| VCCINT 电压偏低 | 短路、DC-DC 反馈电阻焊错 | 断开所有负载,单独测电源模块空载输出 |
| JTAG 识别不到芯片 | 上电时序不对、VCCO_MIO0 没电、TCK/TMS 无上拉 | 先量各路电压,再量 JTAG 信号电平 |
| 串口有输出但乱码 | PS_CLK 精度差、串口电平不匹配、波特率配置错误 | 示波器量 PS_CLK 频率,确认波特率 |
| PS 启动后无任何串口输出 | 启动模式错误、MIO 48/49 焊接不良 | 用 JTAG 模式跑裸机程序,绕开启动模式 |
| QSPI 启动失败 | MIO[5:2] 拨错、boot.bin 镜像格式不对 | 确认拨码,重新生成 BIF 文件再烧写 |
| PL 点灯不亮 | VCCO 没查到对应 Bank、引脚约束错误 | 量 VCCO 电压,检查 xdc 引脚绑定 |
6.2 几条用学费换来的经验
第一,电源电路永远是第一优先级的审查对象。我后来养成了一个习惯:开画原理图之前,先把 XC7Z020 手册里的上电时序表抄到图纸空白处;画完电源树,再对着表逐路核对。这不是流程化负担,而是真的能救命。很多级联调试的问题,根子都在电源,逻辑和软件往往只是“背锅侠”。
第二,第一版打样一定要预留调试手段。JTAG、串口、启动模式拨码、每路电源测试点,这四个东西一个都不能少。看似多花一点面积,却能在板子出了问题的时候让你多一个观察窗口。最怕的就是板子上电灯不亮,但你没留测试点,只好拿万用表探针去戳 BGA 引脚,那才是灾难现场。
第三,晶振布局要“狠心”一点。我见过很多人为了板子美观,把晶振放在 FPGA 旁边但是被 DDR 走线夹在中间,结果时钟信号被耦合干扰,系统偶发死机。后来我把晶振区域画了一个禁止走线的 Keepout,周围铺地孔,从那以后时钟相关的问题几乎没再出现过。对于 XC7Z020 这种高集成芯片,一个干净的参考时钟抵得上你后面加好几层滤波电路。
最后再分享一个我自己用着很顺的技巧:原理图完成后,花半天时间在 PDF 里把每一路电源、每个关键信号都标上电压值和预期电流,打印出来贴在工位前。调试的时候手边永远有一份带标注的图,比临时翻几十页手册高效得多。这块最小系统搭好,当你第一次看到串口里跳出那行启动信息的时候,前面熬过的夜和掉过的头发,值了。