1. 为什么Zynq-7010的电源设计不能照搬普通FPGA
很多人第一次画Zynq-7010核心板的时候,脑子里想的还是传统FPGA那套供电逻辑——一个3.3V、一个1.2V,顶多再加个1.8V,LDO一排就完事了。但Zynq-7010跟纯FPGA芯片有一个本质区别:它内部集成了ARM Cortex-A9双核处理器(PS端)和可编程逻辑(PL端)两套独立又耦合的系统。这两套系统的上电时序、电压精度、纹波要求、电流需求都不一样,如果按普通FPGA的思路去设计,最典型的结果就是板子能下载程序但PS端跑不起来,或者跑起来了但DDR初始化随机失败。
我见过不少初学者在这块栽跟头,现象千奇百怪:有的板子JTAG能识别芯片但SD卡启动永远卡在FSBL阶段;有的板子PL端逻辑跑得好好的,一开PS端就复位;还有的板子常温能用,一上高温就死机。这些问题追到根上,十有八九是电源设计或者启动配置出了问题。Zynq-7010虽然是个"小芯片",但它的电源轨数量一点都不少,核心电压的精度要求也比普通FPGA严格得多。
这篇文章面向的是正在做Zynq-7010最小系统板(核心板或开发板)的硬件工程师和FPGA开发者,不管你是第一次画Zynq板子,还是之前画过但启动老出问题,这里的内容都能帮你把电源设计和启动配置这两块硬骨头啃下来。我会从电源轨的分配逻辑讲起,把每一路电压为什么需要、需要多少电流、上电顺序怎么定讲清楚,然后再把启动模式的选择和配置引脚的接法一步步拆开。中间会穿插我在实际项目中踩过的坑和验证过的方案,尽量让你少走弯路。
2. Zynq-7010电源轨的完整拆解与电流估算
2.1 PS端和PL端的供电需求差异
Zynq-7010的电源引脚在数据手册里分得很清楚,但很多人看手册的时候容易忽略一个关键点:PS端和PL端的供电是分开的,而且PS端的供电要求比PL端严格得多。PS端负责ARM核、DDR控制器、外设接口这些"必须稳定运行"的部分,PL端则是可编程逻辑阵列,相对"皮实"一些。
具体来说,Zynq-7010的电源轨大致可以分成以下几类:
| 电源轨 | 典型电压 | 主要供电对象 | 精度要求 | 典型电流(7010) |
|---|---|---|---|---|
| VCCPINT | 1.0V | PS端内部逻辑核心 | ±3% | 0.8~1.2A |
| VCCPAUX | 1.8V | PS端辅助电路、PLL | ±5% | 0.3~0.5A |
| VCCPLL | 1.8V | PS端PLL专用 | ±5%(低噪声) | 50~100mA |
| VCCO_DDR | 1.5V | DDR3接口IO | ±5% | 0.5~1.0A |
| VCCINT | 1.0V | PL端内部逻辑核心 | ±5% | 0.3~0.8A |
| VCCAUX | 1.8V | PL端辅助电路 | ±5% | 0.2~0.4A |
| VCCO_MIO | 3.3V/1.8V | MIO Bank IO | ±5% | 0.1~0.3A |
| VCCO_HR | 3.3V/2.5V/1.8V | PL端HR Bank IO | ±5% | 视外设而定 |
这张表里的电流值是针对7010这个级别芯片的典型估算,实际值取决于你的PS端外设开了多少、PL端逻辑资源用了多少、DDR频率跑多高。但有一个原则是不变的:VCCPINT的电流需求最大,而且对精度要求最高,这一路的设计质量直接决定PS端能不能稳定跑起来。
2.2 电流估算的实操方法
很多人问电流怎么估,其实Xilinx提供了两个工具:一个是XPE(Xilinx Power Estimator),一个是Vivado里的Report Power。XPE适合在画原理图之前做粗略估算,Vivado的Report Power适合在逻辑设计完成后做精确分析。我的习惯是先用XPE把最坏情况估出来,然后电源芯片选型时留30%以上的余量。
以Zynq-7010跑DDR3-1066、PS端开UART和SD卡、PL端用30%逻辑资源为例,XPE估出来的结果大概是:VCCPINT约1.0A,VCCPAUX约0.4A,VCCO_DDR约0.7A,VCCINT约0.5A,VCCAUX约0.3A。这些数字看起来不大,但你要注意,这是典型值,不是峰值。DDR在频繁读写的时候,VCCO_DDR的瞬态电流可能冲到1.5A以上,所以去耦电容的配置非常关键。
提示:XPE里有一个"Thermal"选项卡,可以设置环境温度和散热条件,估出来的电流会更接近实际。很多人忽略这一步,结果电源选型偏小,板子跑起来就烫得不行。
2.3 电源芯片选型的几个关键考量
Zynq-7010的电源方案通常有两种思路:一种是全部用LDO,另一种是DCDC加LDO混合。全LDO的方案简单、噪声低,但效率差、发热大,适合输入电压不高、电流需求小的场景。混合方案效率高,但DCDC的开关噪声可能影响PS端的PLL和DDR性能,需要仔细布局和滤波。
我个人的经验是:VCCPINT和VCCINT这两路1.0V大电流用DCDC,VCCPAUX、VCCPLL、VCCAUX这几路小电流用LDO,VCCO_DDR用DCDC(因为电流可能比较大),VCCO_MIO和VCCO_HR根据外设情况灵活选择。这样既保证了效率,又保证了关键电源轨的噪声性能。
具体芯片选型上,TI的TPS62130、TPS54332这些DCDC芯片在Zynq板子上很常见,LDO可以用TPS7A7001、TPS7A8101这些低噪声型号。如果你不想自己搭电源树,也可以用现成的PMIC,比如TI的TPS650250或者Maxim的MAX8660,这些芯片专门为Zynq系列设计,集成了多路DCDC和LDO,还支持上电时序控制,省事不少。
3. 上电时序与复位电路的配合逻辑
3.1 Zynq-7010的上电时序要求
Zynq-7010的数据手册里明确规定了上电顺序:VCCPINT先上,然后是VCCPAUX和VCCPLL,最后是VCCO_DDR和VCCO_MIO。这个顺序不是随便定的,而是因为PS端的内部逻辑核心需要先建立稳定的1.0V电源,PLL和辅助电路才能正常工作,最后IO电源上电后才能与外部DDR和 peripherals通信。
如果上电顺序反了,比如VCCO_DDR先上而VCCPINT还没稳,DDR控制器可能会进入一个不确定的状态,导致FSBL阶段DDR初始化失败。这种问题有时候不是必现的,可能十次里失败一次,调试起来非常头疼。
实现上电时序的方法有几种:最简单的是用PMIC自带的时序控制功能,比如TPS650250就有专门的SEQ引脚,通过外接电容或电阻设置各路输出的上电顺序和延迟。另一种是用分立方案,用DCDC的Power Good信号级联控制下一路电源的Enable引脚。还有一种是用CPLD或小MCU做时序控制,灵活但成本高。
3.2 复位信号的正确处理
Zynq-7010的复位信号有两类:PS端的POR(Power-On Reset)和SRST(System Reset),以及PL端的复位。POR信号在电源稳定后需要保持一定时间的低电平,确保内部电路完成初始化。数据手册里建议POR低电平保持时间至少1ms,实际设计中我一般留10ms以上,用RC延时或者专用的复位芯片(如TPS3808)来实现。
这里有一个容易踩的坑:很多人把POR引脚直接接一个10k上拉电阻加100nF电容,觉得这样就能产生复位脉冲。但Zynq的POR引脚内部有施密特触发器,阈值电压和普通CMOS不一样,RC参数选不好可能导致复位脉冲宽度不够或者被噪声误触发。我的建议是用专用的复位芯片,比如TPS3808G01,它可以精确设置复位延时,而且输出是开漏的,可以直接拉到POR引脚。
注意:POR引脚不能悬空,也不能只靠外部RC,一定要保证在电源稳定后有一个干净的低电平脉冲。我见过一个案例,板子偶尔启动失败,最后查出来是POR引脚的RC时间常数太小,复位脉冲只有几百微秒,换成专用复位芯片后问题消失。
3.3 复位与启动模式的配合
Zynq-7010的启动模式由MIO[8:7]等引脚在POR复位释放时的电平决定。这意味着复位信号和启动模式配置是紧密耦合的:如果复位信号不干净,芯片可能在复位释放时采到错误的启动模式,导致从错误的设备启动。比如你配置的是SD卡启动,但因为复位抖动,芯片采到了JTAG模式,结果就是板子"没反应"。
解决这个问题的办法有两个:一是保证复位信号的干净,用专用复位芯片;二是启动模式配置引脚加上拉或下拉电阻,确保在复位期间电平稳定。MIO[8:7]这些引脚在复位期间是输入状态,内部有弱上拉,但为了可靠,外部还是要加4.7k~10k的上下拉电阻。
4. 启动模式配置与QSPI/SD卡启动实战
4.1 启动模式的选择逻辑
Zynq-7010支持几种启动模式:JTAG、QSPI Flash、SD卡、NAND Flash。对于最小系统板来说,最常用的是QSPI和SD卡两种。QSPI适合量产,程序固化在板子上,上电就跑;SD卡适合开发和调试,换程序方便,把BOOT.bin拷到SD卡里就行。
启动模式由MIO[8:7]和MIO[5:3]等引脚决定,具体配置如下:
| 启动模式 | MIO[8:7] | MIO[5:3] | 说明 |
|---|---|---|---|
| JTAG | 00 | xxx | 调试用,不固化程序 |
| QSPI | 01 | xxx | 从QSPI Flash启动 |
| SD卡 | 10 | xxx | 从SD卡启动 |
| NAND | 11 | xxx | 从NAND Flash启动 |
实际设计中,我通常会把MIO[8:7]做成跳线帽或者拨码开关,方便切换启动模式。如果板子空间紧张,也可以只留QSPI和SD卡两种模式,用0欧电阻选择。
4.2 QSPI Flash的电路设计要点
QSPI Flash的电路看起来简单,就是几根SPI信号线加电源和地,但有几个细节容易出问题。首先是Flash的电源,通常用3.3V,但有些Flash支持1.8V,要跟VCCO_MIO的电压匹配。如果VCCO_MIO是1.8V而Flash是3.3V,就需要电平转换,否则可能通信失败。
其次是QSPI的片选信号(CS),Zynq的QSPI控制器支持单Flash和双Flash并行模式。如果只用一片Flash,CS要接到Flash的片选引脚,同时Zynq的QSPI_CS引脚要配置正确。我见过有人把CS接错了,结果Flash识别不到,启动失败。
还有一点是QSPI的时钟频率,Zynq的QSPI控制器最高支持100MHz左右,但实际能跑多高取决于Flash芯片和PCB布线。如果布线太长或者阻抗不匹配,高速下可能读写错误。我的经验是,如果板子不大,QSPI走线控制在5cm以内,一般跑50MHz没问题。
4.3 SD卡启动的配置细节
SD卡启动比QSPI简单一些,因为SD卡座子通常直接焊在板子上,信号线也不多。但有一个关键点:SD卡的检测引脚(CD)和写保护引脚(WP)如果不用,要正确处理,否则可能影响启动。CD引脚一般接地或接GPIO,WP引脚可以悬空或接上拉。
SD卡的电源也要注意,Zynq的SD控制器支持3.3V和1.8V两种电压,如果SD卡是3.3V的,VCCO_MIO对应的Bank要设成3.3V。另外,SD卡的时钟线要加串联电阻(通常22~33欧姆)做阻抗匹配,数据线也可以加,但要看布线长度。
提示:SD卡启动时,BOOT.bin文件要放在SD卡的第一个分区(FAT32格式),文件名必须是BOOT.bin,大小写敏感。很多人把文件放错分区或者文件名不对,结果启动失败,查半天以为是硬件问题。
4.4 启动失败的排查链路
Zynq-7010启动失败的原因很多,我一般按以下顺序排查:
- 电源是否正常:用示波器测每一路电源的电压和纹波,特别是VCCPINT和VCCO_DDR。如果纹波超过50mV,就要检查去耦电容和DCDC布局。
- 复位信号是否干净:测POR引脚的波形,看低电平脉冲宽度是否足够,上升沿是否干净。
- 启动模式是否正确:测MIO[8:7]在复位释放时的电平,确认跟设计一致。
- QSPI/SD卡通信是否正常:用示波器或逻辑分析仪抓SPI或SD信号,看有没有波形,时序对不对。
- FSBL是否跑起来:如果JTAG能连上,可以用Vivado的XSCT工具加载FSBL,看串口有没有输出。如果有输出但卡在某一步,根据输出信息定位问题。
这个排查链路看起来简单,但每一步都有细节。比如测电源纹波的时候,示波器探头的地线要尽量短,用弹簧地针,否则测出来的纹波大部分是探头引入的噪声。再比如测MIO电平的时候,要注意复位释放的瞬间,因为MIO在复位期间是输入,释放后才变成输出或保持输入。
5. 去耦电容配置与PCB布局的实战经验
5.1 去耦电容的容值选择和摆放
Zynq-7010的电源引脚很多,每个引脚旁边都要放去耦电容。但放什么容值、放多少、怎么摆,这里面有讲究。我的经验是:每个电源引脚放一个0.1uF的陶瓷电容,靠近引脚放置;每路电源再放几个1uF和10uF的电容做中频去耦;整板再放一两个100uF以上的电解或钽电容做低频储能。
容值的选择不是越大越好,因为大电容的等效串联电感(ESL)也大,高频响应差。所以通常是小电容(0.1uF)负责高频,中电容(1uF~10uF)负责中频,大电容(100uF+)负责低频。摆放的时候,小电容最靠近芯片引脚,大电容可以远一点。
注意:去耦电容的接地回路要短,最好直接打到地平面,不要用长走线。我见过有人把电容放在芯片背面,通过过孔连接,这样也可以,但过孔要足够多,一般每个电容至少两个过孔。
5.2 PCB叠层与电源平面设计
Zynq-7010的PCB至少要用4层板:顶层信号、内层地、内层电源、底层信号。如果条件允许,用6层或8层更好,可以有独立的电源平面和地平面,电源完整性更好。4层板的话,电源平面要做分割,不同电压的区域分开,避免相互干扰。
电源平面的分割要注意:VCCPINT和VCCINT都是1.0V,但一个是PS端一个是PL端,最好分开走线,最后在一点连接。VCCO_DDR是1.5V,要单独一个区域。3.3V和1.8V也要分开。分割的时候,不同电源区域之间的间距至少20mil,避免爬电和耦合。
5.3 DDR布线的特殊要求
DDR3的布线是Zynq板子设计的难点之一,因为DDR的时钟频率高(1066Mbps以上),对走线长度、阻抗、匹配要求严格。我的经验是:DDR的数据线要等长,误差控制在±50mil以内;地址和控制线也要等长,可以放宽到±100mil;时钟线要差分走线,阻抗100欧姆,长度尽量短。
DDR的电源去耦也很关键,VCCO_DDR的电容要靠近DDR芯片的电源引脚,0.1uF和1uF搭配使用。VREF电压(通常是VCCO_DDR的一半)要用分压电阻产生,并加电容滤波,VREF的精度直接影响DDR的读写可靠性。
6. 常见问题与调试技巧
6.1 板子能下载但PS端不跑
这是最常见的问题之一。JTAG能识别芯片,说明PL端的电源和JTAG电路没问题,但PS端不跑,通常是VCCPINT或VCCPAUX的问题。先测这两路电源的电压和纹波,如果电压对但纹波大,检查去耦电容;如果电压不对,检查DCDC或LDO的反馈电阻。
还有一种可能是FSBL的问题。如果FSBL没有正确加载,PS端也不会跑。可以用Vivado的XSCT工具手动加载FSBL,看串口有没有输出。如果有输出但卡住,根据输出信息定位。
6.2 SD卡启动偶尔失败
SD卡启动偶尔失败,通常是复位信号或启动模式配置的问题。先测POR引脚的波形,看复位脉冲是否干净。然后测MIO[8:7]在复位释放时的电平,确认启动模式正确。如果都没问题,可能是SD卡的兼容性问题,换一张卡试试。
另外,SD卡的时钟频率也可以降低试试。Zynq的SD控制器默认频率可能比较高,如果SD卡质量一般,可能高速下通信失败。可以在FSBL里降低SD时钟频率,看是否改善。
6.3 QSPI Flash烧写后不启动
QSPI Flash烧写后不启动,先确认BOOT.bin是否正确烧写到Flash的起始地址。Zynq的QSPI启动是从Flash的0地址开始读,如果烧写地址不对,肯定启动不了。然后确认QSPI的片选和时钟信号是否正常,用示波器抓波形看。
还有一个容易忽略的点:QSPI Flash的写保护引脚(WP)和保持引脚(HOLD)如果不用,要接上拉电阻,否则Flash可能处于写保护状态,烧写不进去。
6.4 温度升高后不稳定
板子常温能用,高温死机,通常是电源芯片或DDR的问题。先测高温下各路电源的电压和纹波,看是否超标。DCDC芯片在高温下效率下降,输出纹波可能增大,如果余量不够就会出问题。DDR在高温下刷新率需要提高,如果FSBL里没有正确配置DDR参数,也可能不稳定。
我的经验是,电源芯片的余量至少留30%,DDR的参数要用Xilinx的DDR配置工具生成,不要手动改。散热方面,如果板子空间允许,加散热片或者用导热垫把热量导到外壳上。
7. 个人实操体会与几个实用建议
做了这么多Zynq-7010的板子,我最大的体会是:电源设计和启动配置这两块,看起来是硬件的事,但实际上跟软件配置紧密相关。电源的余量、复位的时间、启动模式的选择,每一个参数都会影响FSBL能不能跑起来、DDR能不能初始化成功。所以硬件工程师和FPGA开发者一定要多沟通,不要各做各的。
另外,调试工具很重要。一台好的示波器(带宽至少500MHz)、一个逻辑分析仪、一个稳定的JTAG下载器,能帮你省很多时间。我刚开始做Zynq的时候,用的是一个便宜的示波器,测电源纹波的时候总是测不准,后来换了好设备才发现问题所在。
最后分享一个小技巧:如果你不确定电源设计有没有问题,可以先做一个最小系统板,只焊电源、Zynq芯片、JTAG和串口,不焊DDR和Flash,先验证PS端能不能通过JTAG加载程序并跑起来。如果能跑,再逐步加外设,这样排查问题会容易很多。这个办法我用了很多次,每次都能快速定位问题是在电源还是在其他部分。