ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zynq XC7Z020最小系统设计:从电源树到PCB的完整实践

Zynq XC7Z020最小系统设计:从电源树到PCB的完整实践 很多新手第一次碰 XC7Z020不是被 Verilog 折腾疯的而是被原理图上那一堆 VCCPINT、VCCPAUX、BOOT_MODE 直接整懵的。我当年对着 ZedBoard 原理图愣是看了好几天才终于搞明白“最小系统”这三个字和单片机那套“晶振 复位 电源”完全不是一个量级。这篇文章把我的实际踩坑和画板经验整理出来从芯片架构、电源树、时钟复位、启动模式到 PCB 布线一路拆到原理图级别给准备用 XC7Z020 做 FPGA 入门或者小项目开发的朋友一个可以照着抄的参考。1. 为什么是 XC7Z020最小系统到底“最小”在哪1.1 Zynq 不是普通 FPGAPS 与 PL 的双芯架构先解决一个最关键的概念问题XC7Z020 不是一片传统意义上的 FPGA它是 Xilinx Zynq-7000 系列里的 SoC内部实际上装了两个“人”。PSProcessing System双核 ARM Cortex-A9 处理器主频根据速度等级能到 667MHz 甚至 866MHz自带 DDR 控制器、DMA、以太网、USB、UART、SPI、I2C、SDIO 等一大票外设。PLProgrammable 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.333MHzPS_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 内核电源。常用来设计最小系统的电源轨大致如下电源轨典型电压干什么用的最低配建议VCCPINT1.0VPS 处理器内核必须有电流需求随跑 Linux 负载升高VCCPINT_IO1.0VPS I/O 逻辑内核与 VCCPINT 同步供电VCCPAUX1.8VPS 辅助逻辑必须有VCCPLL1.8VPS 内部 PLL 供电必须有纹波要低VCCINT1.0VPL 可编程逻辑内核必须有逻辑规模大时电流很大VCCBRAM1.0VPL BRAM 供电必须有与 VCCINT 同电压VCCAUX1.8VPL 辅助逻辑必须有VCCO_MIO03.3V 或 1.8VMIO bank 0 和 JTAG 电平必须有决定 JTAG 电平VCCO_DDR1.5V / 1.35VDDR3/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 / VCCPLL1.8V 这一组用一片 1A 左右 DCDC 输出 1.8V 主轨然后 VCCPLL 经过一个小的 π 型滤波单独引出去。VCCO_MIO0 / VCCO_PL bank3.3V 或 1.8V看你的外设电平决定。如果只是接 JTAG 和简单外设3.3V 最普适。VCCO_DDR如果加了 DDR31.5V 需要单独的 DCDC电流至少 2ADDR3L 可以设 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.3VJTAG 就是 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]启动模式适用场景0000JTAG调试阶段直接通过 JTAG 加载程序和 bitstream0001QSPI从 QSPI Flash 启动适合量产和单机运行0010NAND从 NAND Flash 启动较少见0101SD从 SD 卡启动适合跑 Linux 快速开发1010NOR从 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] 决定去哪个外设找 FSBLFirst Stage Boot Loader。FSBL 被加载到 PS 内部的 OCM 中执行FSBL 负责初始化 DDR、配置 PL加载 bitstream、跳转到用户程序或者 U-Boot。这就解释了很多新手常问的问题为什么我往 QSPI Flash 里烧了一个几十MB的 Linux 镜像上电还是起不来因为 BootROM 只会去找 FSBLFSBL 再负责去加载后面的大镜像。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 FlashZynq 要求的 QSPI 最好支持 Dual/Quad SPI 模式常见型号有 Winbond W25Q256JV、Spansion S25FL256S 等容量 256Mbit 起步。XC7Z020 的 bitstream 通常几 MB 到十几 MB256Mbit32MB足够装下 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 控制外部 DDR3PL 里有软核 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 BRAMPS 内部有 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 必须做差分对。等长地址、命令、控制线与时钟之间尽量做等长组内误差不超过 ±20milDQ 与 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 板子一上电就稳定跑起来。
返回列表