很多新手第一次碰 XC7Z020,不是被 Verilog 折腾疯的,而是被原理图上那一堆 VCCPINT、VCCPAUX、BOOT_MODE 直接整懵的。我当年对着 ZedBoard 原理图愣是看了好几天,才终于搞明白“最小系统”这三个字,和单片机那套“晶振 + 复位 + 电源”完全不是一个量级。这篇文章把我的实际踩坑和画板经验整理出来,从芯片架构、电源树、时钟复位、启动模式到 PCB 布线,一路拆到原理图级别,给准备用 XC7Z020 做 FPGA 入门或者小项目开发的朋友一个可以照着抄的参考。
1. 为什么是 XC7Z020:最小系统到底“最小”在哪
1.1 Zynq 不是普通 FPGA:PS 与 PL 的双芯架构
先解决一个最关键的概念问题:XC7Z020 不是一片传统意义上的 FPGA,它是 Xilinx Zynq-7000 系列里的 SoC,内部实际上装了两个“人”。
- PS(Processing System):双核 ARM Cortex-A9 处理器,主频根据速度等级能到 667MHz 甚至 866MHz,自带 DDR 控制器、DMA、以太网、USB、UART、SPI、I2C、SDIO 等一大票外设。
- PL(Programmable Logic):一片 Artix-7 级别的 FPGA,约 85K 逻辑单元、220 个 DSP48E1、140 块 BRAM,也就是约 4.9Mbit 的片上存储。
这两个部分不是各干各的,而是通过 AXI 总线高速互联。你可以把 PS 理解为“大脑”,PL 理解为“可以随时改电路图的手”。这也是为什么 XC7Z020 很适合做图像处理、软件无线电、工业控制这类既需要通用计算,又需要高速并行逻辑的项目。
为什么新手入门我会推荐它,而不是更便宜的 Spartan-7 或者纯逻辑的 Artix-7?因为 Zynq 让你在学 FPGA 的同时,还能接触到完整的嵌入式 Linux 启动流程、软硬件协同设计、AXI 总线协议这些实际工程里绕不开的东西。就算你只打算用 PL 部分写逻辑,PS 也可以顺手帮你做配置、做通信、做调试,比外挂一颗单片机舒服太多。
1.2 最小系统的边界:哪些必须,哪些可以砍
所谓“最小系统”,我的定义是:让 XC7Z020 能够上电、能够被配置、能够运行最基本程序的最少外围电路集合。按必要性排个优先级:
| 模块 | 必要性 | 说明 |
|---|---|---|
| 电源系统 | 必须 | 多路电源,且有上电时序要求,是最小系统成败的关键 |
| PS_CLK 时钟 | 必须 | PS 启动必须要有时钟,常用 33.333MHz |
| PS_POR_B 复位 | 必须 | 上电复位,不然芯片状态不可控 |
| JTAG 接口 | 必须 | 下载 bitstream / 调试程序都靠它 |
| BOOT_MODE 引脚 | 必须 | 决定从 JTAG / QSPI / SD 哪种方式启动 |
| QSPI Flash | 强烈建议 | 不然每次断电程序就丢了,只能 JTAG 临时加载 |
| DDR3 内存 | 看需求 | 跑 Linux、做图像缓存必须;纯 PL 和裸机可以不加 |
| SD 卡接口 | 可选 | 跑 Linux 最方便的启动介质,也可以用 QSPI 启动 Linux(稍慢) |
| 以太网 / USB / HDMI | 可选 | 项目需要时才加,不影响“最小”这回事 |
很多人第一次画板子,恨不得把 ZedBoard 上所有外设都堆上去,最后板子比脸还大,布线乱成一团。我的建议是:第一版尽量做减法。只要芯片能通电、能下载、能跑 hello world,这个最小系统就算成了。
1.3 和 STM32 最小系统的差别:别照搬单片机思路
聊到最小系统,很多人会想起 STM32F103C8T6 那种经典单片机最小系统板:一颗芯片、一个 8M 晶振、一个复位按键、几颗去耦电容,没了。
FPGA 这边完全不是同一个玩法。原因很直接:
- FPGA 没有内部非易失配置存储器,掉电即失忆,需要额外的配置芯片或者由处理器主动加载。
- 芯片电压域极多,XC7Z020 至少需要 1.0V、1.5V、1.8V、3.3V 几组电压,而且上电顺序有严格要求。
- 引脚密度高、速率高,PCB 层数、阻抗控制、等长设计都不能省。
所以如果你拿画 STM32 最小系统的思路来画 Zynq,大概率会在电源上翻车。下面几章我把每个模块的细节拆开讲,你照着做基本不会跑偏。
2. 电源树设计:7 组电源的上电顺序与选型
2.1 XC7Z020 都有哪些电源轨
XC7Z020 的电源引脚分布在 PS 和 PL 两侧,名字长得像双胞胎,但电压和用途完全不同。我第一次看到原理图里 VCCPINT 和 VCCINT 同时出现时,差点以为是封装引脚标错了,其实它们一个是 PS 内核电源,一个是 PL 内核电源。
常用来设计最小系统的电源轨大致如下:
| 电源轨 | 典型电压 | 干什么用的 | 最低配建议 |
|---|---|---|---|
| VCCPINT | 1.0V | PS 处理器内核 | 必须有,电流需求随跑 Linux 负载升高 |
| VCCPINT_IO | 1.0V | PS I/O 逻辑内核 | 与 VCCPINT 同步供电 |
| VCCPAUX | 1.8V | PS 辅助逻辑 | 必须有 |
| VCCPLL | 1.8V | PS 内部 PLL 供电 | 必须有,纹波要低 |
| VCCINT | 1.0V | PL 可编程逻辑内核 | 必须有,逻辑规模大时电流很大 |
| VCCBRAM | 1.0V | PL BRAM 供电 | 必须有,与 VCCINT 同电压 |
| VCCAUX | 1.8V | PL 辅助逻辑 | 必须有 |
| VCCO_MIO0 | 3.3V 或 1.8V | MIO bank 0 和 JTAG 电平 | 必须有,决定 JTAG 电平 |
| VCCO_DDR | 1.5V / 1.35V | DDR3/DDR3L PHY 供电 | 加 DDR 时必须,不加先不焊 |
| VCCO_PL bank | 按接的外设定 | PL 各 bank 的 IO 电平 | 有 IO 引出时按需提供 |
这里有个很容易忽略的点:VCCPLL 别看它电流小,它对纹波要求很敏感。PLL 供电不干净,PS 时钟容易抖动,严重的时候程序跑着跑着就挂。PLL 电源建议从 1.8V 主电源上单独加一级 π 型滤波或者小电流 LDO,不要直接用 DC-DC 带。
2.2 上电时序要求与违反后果
Zynq-7000 对电源上电是有顺序要求的,不是随便一起通电就能稳定工作。简单归纳为:
- PS 域:VCCPINT 先上,然后 VCCPINT_IO / VCCPAUX,最后 VCCPLL。
- PL 域:VCCINT 基本同时与 VCCPINT 上电,然后 VCCBRAM,再 VCCAUX,最后 VCCO。
- 换句话说,核心电压先于辅助电压,辅助电压先于 IO 电压,PLL 电压相对靠后。
违反上电时序会有什么后果?轻则芯片进入不定态、JTAG 连不上,重则可能损伤器件内部结构。我在调第一版板子时就干过这种事:为了省事把五路电源全部接到同一个电源模块的两个输出上,结果 PS_POR_B 已经拉高了,VCCPINT 还在爬坡,芯片就是不启动。后来才老老实实按顺序设计。
实现上电时序现在并不难。最简单的方案是选用带时序控制的电源芯片,或者用复位监控芯片(比如 TPS3808、MAX16025 这类)来做“前一级电源 OK 了再使能下一级”的逻辑。新手不建议把这种时序逻辑放在 CPLD/FPGA 里处理,因为芯片没启动之前只能靠外部电路,兜不住底。
2.3 新手电源方案:分立 DCDC + 复位监控 IC
具体电源芯片怎么选,很多教程一上来就推 TI 的专用 PMIC。专用 PMIC 确实省心,但货源和价格对新手不太友好,而且一烧就是一大片,排查起来很痛苦。
我更推荐新手用分立的 DCDC/LDO 组合:
- VCCPINT / VCCINT / VCCBRAM:这三路都是 1.0V,可以考虑用同一片多路输出 DCDC,或者两片 3A 级 DCDC 分别带 PS 和 PL 内核,VCCBRAM 从其中一路分出来加磁珠隔离。1.0V 电流需求大,LDO 不要考虑,效率太低发热太严重。
- VCCPAUX / VCCAUX / VCCPLL:1.8V 这一组,用一片 1A 左右 DCDC 输出 1.8V 主轨,然后 VCCPLL 经过一个小的 π 型滤波单独引出去。
- VCCO_MIO0 / VCCO_PL bank:3.3V 或 1.8V,看你的外设电平决定。如果只是接 JTAG 和简单外设,3.3V 最普适。
- VCCO_DDR:如果加了 DDR3,1.5V 需要单独的 DCDC,电流至少 2A,DDR3L 可以设 1.35V。
每路电源都要配足输出去耦电容,建议 10uF + 0.1uF 组合,靠近对应电源网络。上电顺序这一块,用带“电源正常输出”标志的 DCDC 串联使能即可。第一版原理图阶段就把每个电源轨的状态灯、测试点都留出来,不然后期调试连示波器探头都没地方夹。
3. 时钟、复位与 JTAG:最小系统三大基础外设
3.1 PS_CLK 和 RTC 时钟怎么接
Zynq 的 PS 启动时钟 PS_CLK 用的是 33.333MHz,这个频率不是随便选的,PS 内部很多外设时钟都是从这个基准时钟 PLL 分频倍频出来的。你当然可以给 50MHz,但要用 33.333MHz 才是常规操作,参考资料和 BootROM 都是基于这个频率来设计的。
PS_CLK 常见接法有两种:
- 无源晶振 + 两颗负载电容,这是最省成本的方案。电容值参考晶振 datasheet,一般 10pF 到 22pF 之间,走线上要尽量短、靠近 PS_CLK 引脚,并且包地处理。
- 有源晶振输出直接接到 PS_CLK,信号质量更好,但多一个器件。
如果追求稳妥,我倾向有源晶振。PS_CLK 这个引脚的电平阈值和普通 GPIO 不一样,务必确认所选晶振的输出电平可以满足芯片要求。很多新手在这里翻车:用了 3.3V 有源晶振,结果芯片要求 PS_CLK 高电平不能超过 1.8V,轻则识别异常,重则长期过压。
另外,XC7Z020 有个可选的 RTC 模块,需要 32.768kHz 低速时钟。如果你不需要 RTC 功能,这部分完全可以不接,不影响最小系统运行。
3.2 PS_POR_B 和 PS_SRST_B 复位电路设计
PS_POR_B 是上电复位信号,低电平有效。它和单片机的 NRST 不太一样,要求低电平持续到所有电源稳定、时钟稳定之后,再释放拉高,芯片才会开始执行启动流程。
很多人偷懒直接用阻容复位:一个 10k 电阻上拉到 3.3V、一个 1uF 电容接地,然后接复位按键。这种方法在电源爬坡很慢或有剧烈抖动时不可靠,因为 RC 延时跟电源上电速度之间没有明确关联。我的建议是上一颗复位监控芯片,比如常见的 TPS3808G33,专门在 3.3V 电源稳定后再延时几百毫秒释放复位。成本就几块钱,但能省掉大量莫名其妙的不启动排查。
PS_SRST_B 是软复位信号,可以接到一个按键上,方便程序跑飞或者需要手动软复位时使用。注意,这个按键不需要长按消抖电路,因为 PS_SRST_B 在芯片内部有处理,外部只需要一个简单的上拉和按键即可。
3.3 JTAG 电平归属与下载器连接
JTAG 是必须有的,FPGA 掉电不记事,全靠 JTAG 或者配置芯片加载逻辑。XC7Z020 的 JTAG 引脚虽然看起来是独立的 TCK/TMS/TDI/TDO,但它们和 MIO bank 0 共用一组 IO 电源,也就是说JTAG 的电平取决于 VCCO_MIO0 设置的是 1.8V 还是 3.3V。
这一点特别容易踩坑。比如你的下载器是 3.3V 电平,但 VCCO_MIO0 焊了 1.8V,双方电平不匹配,下载器会识别不到芯片,或者识别到了但下载过程中频繁出错。反过来,VCCO_MIO0 接 3.3V,JTAG 就是 3.3V,绝大多数 USB-JTAG 下载器都能直接兼容,这也是 3.3V 成为最常用选择的原因。
连接器方面,10 针 JTAG 是 Xilinx 平台的常规接法,正常接 TCK/TMS/TDI/TDO/VCC/GND 即可。我建议在 JTAG 信号线上加 33 欧姆串联电阻,有利于抑制反射;如果板子可能带电插拔,最好加一点 ESD 保护器件,飘了或插反了还能救一回。
4. 启动模式与 QSPI Flash:让 Zynq“记住”你的代码
4.1 BOOT_MODE[3:0] 引脚映射与拨码电路
Zynq 启动模式由 BOOT_MODE[3:0] 四个引脚的电平组合决定。常见组合如下:
| BOOT_MODE[3:0] | 启动模式 | 适用场景 |
|---|---|---|
| 0000 | JTAG | 调试阶段,直接通过 JTAG 加载程序和 bitstream |
| 0001 | QSPI | 从 QSPI Flash 启动,适合量产和单机运行 |
| 0010 | NAND | 从 NAND Flash 启动,较少见 |
| 0101 | SD | 从 SD 卡启动,适合跑 Linux 快速开发 |
| 1010 | NOR | 从 NOR Flash 启动,少用到 |
注意:不同器件版本或者参考手册里,个别组合的定义可能略有调整,画板之前务必去查对应版本的 UG821 或者官方 datasheet 里的 Boot Mode 章节确认,不要只凭网上的一张表拍脑袋。
BOOT_MODE 引脚不要在板上硬接成固定电平,至少留一个四位拨码开关,或者标准 2.54mm 跳线帽端子。原因很简单:调试时用 JTAG 模式,正常启动要切到 QSPI 或 SD,你总不能在板子上飞线吧。我见过一些人图省事把 BOOT_MODE 直接拉死成 JTAG,结果烧完 QSPI 后反复断电上电,芯片还是进 JTAG 模式,问题排查了半天才发现是这里锁死了。
引脚上建议加 10k 左右的上拉/下拉电阻,避免浮空导致启动模式不确定。拨码开关引线尽量短,如果板子工作环境有干扰,可以加 100nF 电容滤波,保证启动瞬间读取的是稳定电平。
4.2 从 JTAG 到 QSPI 再到 SD 卡的启动链路
理解启动模式,其实是在理解 Zynq 芯片内部启动流程:
- 上电,复位释放。
- PS 内部的 BootROM 开始执行,它是一段固化在芯片里的只读代码。
- BootROM 根据 BOOT_MODE[3:0] 决定去哪个外设找 FSBL(First Stage Boot Loader)。
- FSBL 被加载到 PS 内部的 OCM 中执行,FSBL 负责初始化 DDR、配置 PL(加载 bitstream)、跳转到用户程序或者 U-Boot。
这就解释了很多新手常问的问题:为什么我往 QSPI Flash 里烧了一个几十MB的 Linux 镜像,上电还是起不来?因为 BootROM 只会去找 FSBL,FSBL 再负责去加载后面的大镜像。FSBL 是你在 Vitis 里创建的,不是随便一个 bin 文件都能当启动文件用。
调试阶段的路径通常是:BOOT_MODE 拨到 JTAG,打开 Vivado Hardware Manager 下载 bitstream,再用 Vitis 通过 JTAG 下载 elf 到 PS 上运行。这种方式断点调试方便,适合开发逻辑和裸机程序。
程序调好之后要脱离电脑运行,就需要把启动镜像(BIF 打包的 BOOT.bin)烧进 QSPI Flash,或者拷到 SD 卡里,BOOT_MODE 拨到对应位置,重新上电。整个流程跑通之后,你才会真正理解为什么最小系统硬件上要留 QSPI 和 SD 的位置。
4.3 配置 Flash 选型与 MIO 连接
QSPI Flash 不要选那种几块钱的玩具 SPI Flash,Zynq 要求的 QSPI 最好支持 Dual/Quad SPI 模式,常见型号有 Winbond W25Q256JV、Spansion S25FL256S 等,容量 256Mbit 起步。XC7Z020 的 bitstream 通常几 MB 到十几 MB,256Mbit(32MB)足够装下 FSBL + bitstream + 小型 Linux 内核。
QSPI 在 Zynq 里通常占用 PS 的 MIO[1:6] 这组引脚,具体哪个引脚接 CS_B、SCK、D0-D3,要对照 UG821 的 MIO 复用表。这里我不建议你靠记忆画图,最稳的办法是直接在 Vivado 的 Zynq PS 配置界面里,把 QSPI 勾选上,它会自动展示各个 MIO 引脚的分配结果,然后再对照着画原理图。
QSPI Flash 的工作电压通常选 3.3V,所以对应的 MIO bank 供电要配置为 3.3V,不要配成 1.8V,否则访问 Flash 会失败。
5. 要不要 DDR3:按学习目标选择内存方案
5.1 PS 端 DDR3 和 “PL 加 DDR” 是两码事
Zynq 有两个完全不同的 DDR 使用路径:
- PS 端的 DDR 控制器:这是硬核控制器,连接 PS 专用的 DDR 引脚(通常是独立的 DDR 引脚区域),专门给 ARM 系统做内存。跑 Linux、图像帧缓存、共享内存通信都靠它。
- PL 端通过 MIG IP 控制外部 DDR3:PL 里有软核 DDR 控制器,需要在 FPGA 逻辑里例化 MIG,占用自己的 IO bank。
这两个路径的引脚和电源需求完全不同。新手最容易搞混的是:在 PL 里做图像处理,以为加一颗 PS 的 DDR3 就够了,结果发现 PL 逻辑访问不到 PS 的 DDR,其实要通过 AXI 总线才能访问 PS DDR,速度受总线影响很大。如果对带宽要求极高的数据流,往往需要在 PL 侧单独扩展 DDR,也就是用 MIG 方案。
对最小系统来说,第一版建议先不碰 PL 侧 DDR,因为 MIG 本身的时序约束、校准逻辑就够你喝一壶。先把 PS 侧 DDR 跑通了,后面再加 PL 侧会容易很多。
5.2 纯 PL 学习和裸机开发的最小内存选择
如果你是 FPGA 入门,主要写 Verilog 点亮 LED、写 UART、跑个软核之类,DDR3 真不是必需品。XC7Z020 的 PL 内部有约 4.9Mbit BRAM,PS 内部有 256KB OCM,这些足够跑很多裸机实验了。
有一个必须注意的坑:如果你板子上没有焊 DDR3,那么在使用 Vivado 配置 Zynq PS 的时候,一定要在 Zynq Processing System IP 里把 DDR 相关的配置禁用掉,否则生成的 FSBL 会去尝试初始化 DDR,初始化失败整个启动流程卡死,JTAG 加载也会显得特别“迟钝”。
所以我的建议很明确:
- 只玩 PL 逻辑:不加 DDR,省钱省面积,板子好画很多。
- 玩 PS 裸机 UART / GPIO / SPI:不加 DDR 也够,OCM 跑简单程序够了。
- 跑 Linux:必须加 DDR3,至少 256MB,推荐 512MB 或 1GB。
- 做图像处理或高速数据缓冲:需要认真评估带宽,我建议老老实实上 PS DDR,并且预留 PL 侧 MIG DDR 扩展位。
5.3 如果加 DDR3,原理图和布线注意什么
DDR3 是 XC7Z020 最小系统里布线难度最高的部分。PS 端 DDR 引脚都是 BGA 底下引出来的,布线必须做等长、阻抗控制、参考平面完整性,不是随便拉通就能用。
几个关键经验:
- 层叠建议:最少 4 层,强烈建议 6 层甚至 8 层。4 层板跑 DDR3 也可以工作,但信号完整性余量很小,一旦频率拉高或者温度变化,极易出现随机死机。
- 阻抗控制:单端 50Ω,差分 100Ω,DDR3 差分时钟和 DQS 必须做差分对。
- 等长:地址、命令、控制线与时钟之间尽量做等长,组内误差不超过 ±20mil;DQ 与 DQS 同组内部误差更严格,一般 ±10mil 到 ±20mil。具体数值跟着内存颗粒的 datasheet 和所选控制器的要求来,不要我写多少就抄多少。
- 去耦电容:DDR 电源引脚附近多放 0.1uF 和 0.01uF 电容,BGA 背面尽量放满,减少电源噪声。
- 端接:数据线、地址线是否加端接电阻,取决于你 DQ 布局和走线长度。有些设计走线短可以不加,但预留端接电阻位总归不会错。
第一次画板不建议挑战 4 层板跑 DDR3 高频。先抄一个成熟开发板的 DDR 部分布局,或者直接用模块化 DDR3 贴片模组,把复杂度隔离掉。别觉得这是偷懒,工程上这叫“降低风险”。
6. 从原理图到 PCB:新手 layout 避坑指南
6.1 FFG484/CLG484 封装扇出与过孔选择
XC7Z020 常见封装是 CLG484 或 FFG484,引脚间距 0.8mm,属于中密度 BGA,通孔工艺就能做,不需要盲埋孔,这对新手是重大利好消息。
0.8mm pitch 的 BGA,焊盘直径一般在 0.35mm 左右,扇出通常采用过孔打在焊盘旁边的“狗骨头”形式。过孔建议用 8mil 钻孔 + 16mil 焊盘,这属于国内板厂常规工艺,价格友好。如果过孔直接打在焊盘上,需要盘中孔树脂塞孔工艺,成本就上去了,非必要不用。
扇出的时候优先把电源引脚和地引脚先引到内层,再处理高速信号。BGA 中间区域通常布满地焊盘,扇出完成后要检查有没有引脚漏出,不然等板子回来了才发现某个信号根本走不出去,后期飞线会非常痛苦。
6.2 电源、地平面与去耦电容摆放
FPGA 这种器件对电源完整性非常敏感。BGA 底部的电源引脚密密麻麻,如果电源网络没有完整的参考平面,去耦电容放得再漂亮也白搭。
我个人的习惯是:
- 第二层完整地平面,不动它。
- 第三层或第四层做电源分割,1.0V 内核电源区域尽量大,1.8V、3.3V 各自划分独立区域。
- 去耦电容优先放在 BGA 背面,正对着对应的电源引脚过孔,越近越好。电容不是装饰品,放远了等效串联电感变大,高频去耦效果急剧下降。
- 在空间允许的情况下,每个 bank 的 VCCO 附近都要放 0.1uF 和 0.01uF 电容,大容量的 10uF 电容可以稍微远一点。
布局阶段就考虑电容位置,不要布完线再想着怎么塞电容,那个时候已经晚了。我可以负责任地说,一大半 FPGA 板子的偶发故障,最后都能追溯到电源去耦不足上。
6.3 晶振、DDR、JTAG 走线要点
- PS_CLK 晶振走线:尽量短,段内不要打过孔,周围包地。晶振底下铺地铜,不要走其它信号线。
- DDR 走线:数据线组内等长、组间分离,DQS 差分对保持紧耦合;地址控制线相对时钟做等长;所有 DDR 信号尽量走在同一层,换层时要保证回流路径连续,即过孔旁边要加地过孔。
- JTAG 走线:线不长的话不用太严格,但尽量不要和电源噪声走在一起。下载线是重点防护对象,如果可以,加一个 ESD 器件。
还有一个新手常犯的错误:把 BOOT_MODE 拨码开关放在 PCB 边缘,结果调试时手一抖碰到了,上电启动模式变了,半天查不出来为什么程序没跑起来。建议拨码开关离复位按键远一点,而且靠近板边做好标识。
6.4 拿到板子后的上电调试顺序
画完板子送出去打样,不代表就完了。拿到板子第一件事绝不是插 JTAG 下程序,而是按顺序排查:
- 目检:用放大镜或者显微镜把 BGA 焊点、电源芯片、晶振全部看一遍,有没有桥接、虚焊、极性装反。
- 对地阻抗测试:用万用表测所有电源轨对地阻抗,确认没有短路。1.0V 内核网络对地阻抗如果接近 0,先别上电。
- 空载上电:先不焊核心板或者只焊电源部分,上电看各电源电压是否正常,电流是否异常。
- 全板上电:焊上 FPGA 后再次上电,观察电流,听有没有异常声音,摸电源芯片有没有局部过热。
- 量时钟:示波器确认 PS_CLK 有 33.333MHz 波形。
- 量复位:确认 PS_POR_B 在电源稳定后会拉高。
- 接 JTAG:打开 Vivado Hardware Manager,看能不能识别到 XC7Z020 的 IDCODE。
这一套流程走完,大概能筛掉 90% 的硬件低级问题。剩下的问题再结合示波器、逻辑分析仪一个一个抓。我记得第一次给 Zynq 板子上电,就是因为电源时序里 VCCPLL 上电太快,导致 JTAG 识别不稳定,排查了一个晚上,后来加了一级 RC 延时才解决,这种问题靠软件是定位不到的。
7. 关于参考设计、FPGA 学习路径和最后的建议
如果你不是想挑战极限,第一版 XC7Z020 最小系统完全没必要从零开始画。建议直接找一块成熟的开发板(ZedBoard、黑金、正点原子这类)的原理图作为底子,把电源部分、启动部分、JTAG 部分复制过来,然后去掉你不需要的外设。这不叫抄袭,叫工程复用。每个人都是从参考设计开始的,硬着头皮自己拍脑袋画,反而容易漏掉上电时序、MIO 复用这些细节。
学 FPGA 和学单片机不一样,单片机强调“跑起来就行”,FPGA 强调“可综合、可收敛、可复现”。很多时候你在软件里写了功能正常的逻辑,上板子之后由于时序约束不合格、引脚分配冲突、复位不稳定导致完全不工作,这种问题对新手来说是最打击信心的。所以从最小系统开始,一步一步来,先把 LED 点亮、把 UART 打通,再碰 DDR、跑 Linux,路径会顺很多。
最后分享一个小经验:我画 FPGA 板子习惯把调试用的测试点做得很“奢侈”,每个电源轨、每个关键时钟、每路复位都留了丝印标识清晰的测试点,而且间距标准,方便夹示波器探头。很多时候排查问题快不快,就取决于你调试引脚留得够不够全。希望这一篇能帮你少走点弯路,祝你的第一块 XC7Z020 板子一上电就稳定跑起来。