
画过几块Zynq板卡之后我愈发觉得XC7Z010是一颗被低估的芯片。在很多项目里双核ARM Cortex-A9虽然跑不了桌面级复杂任务但做协议网关、运动控制、图像采集端预处理完全够用28K逻辑资源看着不算多可一旦把PS侧丰富的外设硬核用起来FPGA资源反而能省下来去做真正需要并行处理的部分。这篇文章是我把XC7Z010核心板从原理图画到PCB、再调通启动的完整复盘重点掰扯电源、DDR3、启动配置、时钟复位和调试验证这些绕不开的环节顺便把我在实际工程里踩过的坑一并交代。无论你是第一次接触Zynq硬件设计还是已经在用7020想回头评估7010这篇都能给你一份可以直接抄作业的参考。1. 选型思考XC7Z010到底适合做什么1.1 一颗“够用就好”的Zynq-7000型号Zynq-7000家族里XC7Z010并不是最抢眼的。往上走有XC7Z020逻辑单元多出三倍DSP和Block RAM也翻倍都不止往下走还有单核的Z-7007S。但我在多个项目里最终都选了XC7Z010原因很简单很多应用卡在“需要跑Linux 需要一些可编程逻辑做接口预处理”这个交叉点而XC7Z010正好卡在这个甜点区。它的核心参数如下PS端双核ARM Cortex-A9最高主频766MHz-1速度等级支持Linux、裸机或RTOSPL端约28K逻辑单元、80个DSP48E1 slice、约2.1Mb Block RAMPS外设2路UART、2路SPI、2路I2C、2路CAN、2路USB 2.0 OTG、2路千兆以太网控制器、2路SDIO、54个MIO GPIO加上PL侧扩展的64个EMIO GPIO片内集成XADC可直接监测芯片温度和电源电压。这套组合特别适合做“带操作系统的智能控制器”ARM核跑协议栈、文件系统、网络服务PL核做高速数据采集、自定义IO时序、电机编码器接口或者图像Sensor数据整理。很多工业控制板、边缘采集终端、机器视觉预处理板本质上就是这样一个架构。相比之下XC7Z020的优势主要体现在PL资源量上。如果你的项目PL用量已经超过60%又考虑后续升级那直接上7020更省心如果PL只做2000行以内的逻辑、几十个DSP运算选7010能把成本、功耗和布局面积都压下来。1.2 选7010之前要想清楚的问题这里我不劝退但有几个问题建议在原理图开画之前先回答你的DDR带宽需求是多少XC7Z010常见封装下PS DDR接口以16bit位宽为主跑DDR3L 1066Mbps时理论带宽约2.1GB/s对Linux系统、图像缓存来说基本够用但如果你要做高分辨率视频多路缓存16bit带宽就很紧张了。你的PL逻辑是“控制型”还是“数据型”控制型逻辑比如接口转换、状态机、低速协议解码28K逻辑单元很宽裕数据型逻辑比如大量并行乘法、大块FIFO、DMA搬运引擎Block RAM和DSP可能两下就吃完了。要不要用PL侧的MIG软核DDR控制器如果使用了PL软核DDR会占用不少PL资源这个场景不如直接用PS硬核DDR控制器来得划算。我做过对比验证同样一个Modbus网关加4路串口扩展加电机脉冲输出任务在XC7Z010上PL占用只有35%左右BRAM用了将近一半DSP几乎没怎么动运行非常从容。如果你的需求也在这个量级7010比7020省下的成本不是一点半点。2. 上电之前先算清楚XC7Z010核心板的电源架构2.1 Zynq的电源域比普通FPGA更复杂Zynq-7000是SoCPS和PL在同一个芯片里但供电要求得分开按域来设计。粗略看有这么几组电源轨电源轨电压主要作用典型电流估算VCCPINT1.0VPS内核逻辑供电0.5A ~ 1AVCCPAUX1.8VPS辅助逻辑、PLL等0.2A ~ 0.4AVCCPLL1.8VPS内部PLL模拟供电几十mA需滤波VCCINT1.0VPL内核逻辑供电0.8A ~ 1.5A看资源占用VCCAUX1.8VPL辅助逻辑0.3A ~ 0.5AVCCBRAM1.0VBlock RAM供电0.2A ~ 0.5AVCCO_MIO0/1/21.5V/1.8V/3.3VMIO/DDR接口电平依外设而定VCCO_PL1.2V~3.3VPL IO Bank供电依IO数量与翻转率而定你仔细看会发现VCCPINT和VCCINT电压相同VCCPAUX和VCCAUX电压也相同。很多成熟核心板为了简化电源树会把PS和PL相同电压轨直接合并供。这个做法我是认可的但前提是纹波和动态响应必须满足要求。如果项目对电源噪声特别敏感比如PL要做高速ADC接口、SerDes类应用那就应该把PS和PL的1.0V轨分开走中间用磁珠或者LC连接避免PS侧大电流跳变干扰PL内部逻辑。2.2 电流估算与DCDC选型很多人做核心板喜欢直接抄参考设计但参考设计通常给出的是最大配置照抄成本高、面积大。我更习惯先按自己的资源占用做粗估。以XC7Z010跑Linux、PL做中等规模逻辑为例1.0V轨VCCINT VCCPINT合并总电流取1.5A ~ 2A1.8V轨VCCAUX VCCPAUX合并总电流取0.6A ~ 0.8A3.3V或按需的VCCO轨取0.5A ~ 1ADDR3L的VDD若单独设计典型1.35V 下约0.5A。这里我一般会留出30%~50%裕量。实际选型时1.0V大电流轨我常用TPS546206A同步降压带Power Good和使能脚拿来做电源时序级联非常方便。1.8V用TPS62130这类3A级的Buck就能轻松覆盖。DDR的VTT终端电源如果颗粒多、走线长用TPS51200这类专用终端稳压器会更省心。也有人直接用集成PMIC比如TI的TPS65023或者一些国产多路PMIC好处是外围简单、时序配置灵活坏处是布局不自由、散热带不走、失效定位麻烦。核心板这种对体积和可靠性都敏感的产品我更倾向用分立DCDC加PG级联每个电源轨都独立可控调试时哪一路出问题一眼就能看出来。2.3 上电时序新手最容易忽略的翻车点Zynq的上电时序有硬性要求不是随便上电就能跑。官方UG585里明确推荐的基本顺序是先上VCCPINT / VCCINT再上VCCPAUX / VCCAUX最后上各种VCCO。如果顺序反了轻则启动异常重则可能通过IO引脚倒灌电流长期可靠性也受影响。实现时序的方式我在核心板上用的最土也最稳的一招DCDC的PG级联。1.0V轨DCDC的Power Good输出接到1.8V轨DCDC的EN引脚1.8V轨的PG再接到3.3V/VCCO轨的EN。这样一级一级“解锁”天然满足先内核后IO的上电要求不需要额外的时序控制芯片。首版调试时我建议用示波器同时抓两到三路电源的上电波形确认没有出现“1.8V反超1.0V”的情况。我见过一块板子时序波形看起来斜率都对但1.8V比1.0V早到了几十毫秒结果Zynq有时能启动有时不能排查了好几天才找到是电源时序余量不足。3. DDR3存储子系统最容易返工的硬件设计3.1 用PS硬核DDR控制器别把资源浪费在MIG上XC7Z010自带的PS DDR控制器是硬核支持DDR3/DDR3L/DDR2带ECC可选具体看配置这个控制器直接挂在ARM内存映射里跑Linux、跑DMA都走它。另一个选择是用PL侧MIG软核生成DDR控制器但那样要占用大量PL引脚和Block RAM还多一层布线负担。我的原则是XC7Z010核心板一律用PS硬核DDR控制器把PL资源留给真正的逻辑。位宽方面XC7Z010常见封装下PS DDR以16bit为主。16bit DDR3L 跑1066Mbps对大多数Linux应用完全够用。如果你需要更高带宽选封装时就要留意支持32bit DDR的引脚方案同时颗粒数量和走线难度都会明显上升。3.2 DDR3L颗粒选型与原理图连接细节DDR3L是1.35V低电压版本相比传统DDR3的1.5V功耗更低这对核心板这种小体积、散热受限的场景很重要。颗粒我常用单颗16bit的512Mbit或1Gbit DDR3L比如MT41K256M16系列或IS43TR16512B这类单颗就能组成512MB或1GB容量BOM简单、布线也友好。原理图连接有几个细节要特别留意数据线DQ和DQS、DM是一组必须严格按控制器引脚定义连接不能因为“看着像”就乱接地址线、Bank地址、控制线CS、CKE、ODT、RAS、CAS、WE要按颗粒容量和控制器映射核对贴片时方向接反了DDR training是过不了的ZQ引脚必须接240Ω 1%精度电阻到地这个电阻直接影响输出驱动强度用5%电阻容易让信号质量变差VREF去耦电容要靠近颗粒的VREF引脚放置通常0.1uF别省ODT电阻配置一般由软件训练决定硬件上按参考设计接就行但ODT引脚不要悬空。我画DDR部分吃过最大的亏是数据线PCB上DQ映射搞错。原理图里每个字节通道都核对好了但PCB布线时为图方便把某一组DQ的DQS和DM位置对调最后DDR training经常失败勉强通过后Linux起来跑一会儿就随机崩溃。从那以后我养成了一个习惯原理图完成后用网表对比工具把PS DDR引脚名和颗粒引脚名逐位打印出来人工核对一遍再投板。3.3 布线规则等长、阻抗、参考平面一个都不能少DDR3布线是整个核心板硬件设计里技术要求最高的部分。XC7Z010 PS DDR跑1066Mbps时信号完整性问题会非常直接地暴露出来。我一般直接按DDR3的通用规则来信号组阻抗目标组内等长组间关系数据线DQ/DQS/DM单端40~50Ω±10mil每个字节通道内对齐地址/控制/命令线单端40~50Ω±20mil相对CLK对齐时钟CLK差分对差分80~100Ω差分对内等长地址组参考点具体数字会因为颗粒型号和控制器驱动强度不同有差异但按这个量级去做基本能保证第一版DDR跑起来。拓扑上数据线是点到点结构颗粒少走线短相对好处理地址和控制线是fly-by结构如果只有一颗DDR3L颗粒走线长度很短可以不做末端端接但我会在原理图里预留端接电阻位置方便后面调试时按需补焊。很多量产核心板省掉地址端接也能跑省的是成本和面积但前提是你对信号完整性有把握别盲目学。参考平面方面DDR走线下方必须是完整的地平面不要在DDR区域开槽或穿过其他电源走线。我在一块板子上曾经因为DDR时钟穿过了一个电源平面分割缝隙结果DDR能初始化但持续高负载时会偶发数据错误折腾到最后用探针测发现是参考平面断裂导致的阻抗突变。4. 启动与配置Boot Mode引脚布局和镜像规划4.1 Boot ModeMIO[6:2]的每一个电平都值钱Zynq-7000的启动方式由MIO[6:2]这5个引脚的电平组合决定常见的有JTAG、QSPI、SD卡、NAND等。具体编码表在UG585里有明确的表格我没有必要在这里逐位抄一遍但设计上有一条原则是通用的:MIO[6:2]不要焊死成一种模式一定要做成排针、跳线或者拨码开关。首版调板时先把Boot Mode设成JTAG模式这样无论QSPI和SD卡上有没有镜像Vivado Hardware Manager都能识别到器件你可以先验证电源、时钟、JTAG链路等这些都正常了再把模式切到QSPI或SD去验证启动介质。如果你一开始就把模式焊死在QSPI万一Flash里镜像不完整或者引脚接错你连一个“最小可用”的调试入口都没有。我见过一个粗暴但很有效的做法把MIO[6:2]引到一个2.54mm 5位排针旁边标注“BOOT_MODE”底板用跳线帽选择高/低。调试的时候换模式只需要拔插跳线帽完全不改动核心板。4.2 QSPI Flash和SD卡接口的设计取舍QSPI Flash是Zynq最常用的启动介质XC7Z010的QSPI控制器支持单/双/四线模式也支持多片级联。常见颗粒有N25Q128、S25FL256、MT25QU256这些容量128Mbit到256Mbit都有。启动镜像包含FSBL、bitstream和应用程序一般几十MB足够所以我建议至少选128Mbit给后续固件升级留空间。QSPI原理图连接上注意HOLD和WP引脚默认要拉高防止上电瞬间Flash误进入写保护或保持状态。时钟线CLK建议串一个22Ω左右的电阻靠近FPGA端放置这个电阻能有效抑制振铃。DQ线如果有空间也可以串10Ω~22Ω没有空间至少保证走线等长。SD卡接口走的是SDIO可以用PS的SDIO控制器直接驱动。注意SD卡卡座和Zynq MIO的电平匹配如果MIO bank电压是3.3VSD卡直连没问题如果bank电压设计成1.8V就需要加电平转换芯片。我建议核心板预留一个标准SD卡座或TF卡座毕竟Linux启动时经常需要从SD卡读根文件系统调试阶段比QSPI灵活得多。4.3 启动镜像分区与JTAG调试链路Zynq的启动流程是BootROM从启动介质里读取FSBLFSBL再负责初始化DDR、加载bitstream和应用程序。QSPI里的常见分区布局大致是这样0x000000FSBL0x100000附近PL bitstream0x200000之后裸机App或者U-Boot、设备树、内核和根文件系统。具体偏移地址取决于你用Xilinx SDK/PetaLinux生成的BSP脚本不同版本会有差异但“FSBL在前、bitstream其次、应用在后”这个顺序是固定的。做硬件设计时不用太关心地址但要在QSPI容量上留足余量。JTAG调试链路方面Zynq的JTAG接口整合了PS和PL的扫描链外面看就是一个标准的Xilinx JTAG排针四根信号TMS、TCK、TDI、TDO接上Xilinx下载器就能在Vivado里识别。核心板上我会把JTAG放在板边方便调试时插拔同时加一个ESD保护器件毕竟调试线经常热插拔。5. 时钟与复位别让最小系统在细节上翻车5.1 PS_CLK和PL时钟的规划Zynq的PS端外部时钟PS_CLK典型值是33.33MHz单端有源晶振直接接在PS_CLK引脚上。这个时钟经过PS内部PLL倍频后产生CPU、DDR、外设所需的各路时钟精度和抖动会直接影响系统稳定性。晶振我建议选50ppm以内的有源晶振起振电容、电源去耦按器件手册来铺地包一圈更好。PL端时钟有几种来源最常用的是PS的FCLK_CLK0/1/2/3它们由PS时钟域同步输出软件可配频率用起来特别灵活。如果PL里有对时钟质量要求高的逻辑比如以太网RGMII接口、高速ADC采样、DDR PHY测试那就在PL端单独加一个低抖动有源晶振或者时钟芯片不要全都依赖FCLK。一块核心板上我通常这样分配PS_CLK负责系统主时钟PL一个Bank放一个可选的25MHz晶振给以太网PHY用另外留一个可焊接的1210封装空位做备用PL时钟调试时万一板载时钟有问题可以手工飞线替代。5.2 复位设计从POR到底板复位输入Zynq的复位体系分几个层级最常打交道的两个POWERON_RESET冷复位上电复位必须在电源稳定后释放SRST系统复位可以手动按键或外部设备触发。核心板上我会放一个专用复位芯片比如TPS3808或MAX809用电压监控来产生POWERON_RESET保证电源稳定后才释放。同时板边留一个复位按键接SRST调试时按一下重启系统比每次都重新上电效率高。如果你做核心板还要给底板用一定记得把复位设计成“双向”的核心板能复位底板底板也能复位核心板。最简单实现是把SRST引到连接器上通过一个二极管隔离外部的复位信号能拉低SRST核心板的复位按键也能拉低底板设备。别直接把两个复位输出并联会打架。5.3 调试接口UART是保命的JTAG不是万能的很多跑系统的问题没法用JTAG稳定跟踪这时候串口就是最重要的调试通道。XC7Z010的UART0和UART1都可以直接走MIO我强烈建议首版核心板无论如何都要把UART0引出来板上放一个USB转串口芯片比如CP2102或CH340用MicroUSB座或者排针引出调试时插一根USB线就能看打印。配套的UART引脚电平要和MIO bank电压匹配。如果MIO bank是3.3VUSB转串口芯片也用3.3V供电的版本别直接接5V TTL电平会毁掉MIO引脚。调试串口参数固定用115200、8N1就够Linux的早期打印都能从这里看到。6. 接口规划与PCB Layout从MIO到DDR等长的完整链路6.1 MIO与EMIO的分配策略Zynq的54个MIO引脚是连接PS外设的“高速公路”很多外设硬核控制器只能通过MIO访问比如QSPI和SDIO。设计核心板的第一步就是把这54个MIO按照项目外设需求分配清楚并确定每个MIO所在的bank电压。我的分配优先级是这样的固定功能外设优先QSPI、SDIO、USB ULPI、以太网RGMII、UART调试口这些都必须在MIO上解决低速控制接口其次I2C、SPI、CAN、GPIO能放MIO就放MIOEMIO最后兜底当MIO不够用或者某个信号需要和PL逻辑直接互动时才用EMIO。需要特别注意的是USB ULPI接口Zynq的PS USB控制器是ULPI接口必须外接USB3300或USB3320这类ULPI PHY连接一组12根左右的信号线包含60MHz时钟。这组线尽量布置在靠近PHY的位置走线等长做好别拉太远。以太网方面Zynq的GEM控制器通过RGMII连接外部PHY推荐用成熟PHY芯片比如88E1512或RTL8211FMDIO管理和中断都走MIO。这里最大的坑是RGMII的时钟相对延迟TX clock delay和RX clock delay有些PHY通过引脚配置内部延时有些要靠PCB走线补偿。芯片选型时直接选“内置可配RGMII延时”的PHY能省掉很多信号完整性调试的麻烦。6.2 核心板的层叠与电源平面分割XC7Z010核心板我推荐至少做8层层叠如下L1顶层信号 表贴器件L2完整地平面L3高速信号层DDR数据、地址L4电源平面1.0V、1.8V分割L5地平面L6信号层低速接口、JTAG、UARTL7电源平面3.3V、VCCO、DDR VDD分割L8底层信号 去耦电容。这样的层叠能保证每一层高速信号都有相邻完整参考平面电源平面也能同时覆盖1.0V、1.8V、3.3V和DDR电压。电源平面分割时要注意分割线不要穿过高速信号的正下方尤其DDR走线区域要保持平面完整。1.0V和1.8V平面分割即使中间有缝隙也尽量让缝隙落在器件少、走线稀疏的区域。6.3 旁路电容与电源完整性去耦电容这个事很多人觉得“多放几个0.1uF就行了”但Zynq这种PS加PL的大规模芯片电源引脚非常多去耦不足会在高负载时出现莫名其妙的时序异常。我的核心板布线习惯是每种电源轨在BGA背面均匀布置0.1uF电容数量不少于电源引脚数的70%每4~6个0.1uF搭配一个1uF或2.2uF覆盖中频段板级再放几颗10uF~22uF的大电容放在电源入口处电容到BGA焊盘的过孔尽量短用0.3mm小过孔靠近焊盘打别贪图省事共享过孔。电源完整性的目标不是“看起来干净”而是让芯片在瞬间电流变化时电压跌落不超过一定范围。1.0V轨如果跌落超过50mVDDR或PLL就可能出问题。你可以在仿真阶段用PDN工具看目标阻抗工程上更实用的做法是板子回来先满载跑一次压力测试用示波器近端测1.0V纹波看动态跌落能不能控制在范围以内。6.4 核心板与底板的连接器规划核心板与底板之间用什么连接决定了整个硬件系统的形态。常见三种方案板对板连接器B2B比如Hirose DF40系列或Samtec BTH系列引脚密、高度低、可靠性好适合量产邮票孔半孔成本低、不需要连接器、高度更低但焊接和维修难度高金手指插卡式适合标准化模块。引脚分配上我的原则是电源和地要占足够比例一般至少三分之一高速信号成对安排在连接器两侧靠近地引脚MIO信号和PL IO不要混在一起排列避免跨bank时绕线JTAG和UART一定要放到最外侧调试时容易夹探针。有些做核心板的朋友喜欢把连接器引脚按照“底板设计方便”来排结果核心板内部绕线绕到爆。正确顺序是先把核心板自身布局最顺的引脚顺序定下来再让底板去适配毕竟核心板才是“插件”底板是“插座”。7. 硬件调试三板斧电源、时钟、启动7.1 上电先测什么时序与纹波新板子回来第一件事不是插JTAG而是检查电源。我的流程是这样目视检查所有电源轨对地阻值先排除短路不焊主控芯片的情况下给电源部分上电测量每路电压是否正确焊上Zynq后再次上电用示波器测上电时序确认1.0V → 1.8V → VCCO的顺序跑15分钟压力测试观察1.0V纹波和芯片表面温度。如果上电时序不对不要心存侥幸。Zynq内部PLL、IO结构对电源顺序非常敏感也许十次里能启动九次但剩下的那一次会让你在系统跑起来之后花几倍时间去定位。测量的时候示波器探头要用短地弹别用长鳄鱼夹否则测出来的纹波全是探头自己感应到的噪声。1.0V轨的纹波如果超过30mV左右先去查DCDC反馈电阻和电感选型不要急着动电路结构。7.2 DDR训练与读写验证DDR的验证是Zynq硬件调试里技术含量最高的一环也是最折磨人的。在Vivado SDK或Vitis里最简单的方法是先用DDR training功能初始化DDR3L看控制器的校准结果是否全部Pass。DDR培训常见的失败现象有全部字节通道失败大概率是VREF、ZQ电阻、或者DQS端接问题某一个字节通道失败查这一组DQ/DQS的PCB连接和等长地址/控制命令失败查地址线映射和片选、CKE能training过但低概率写读错误检查电源纹波、参考平面完整性和走线串扰。Training通过之后还要用软件做内存读写测试比如填0x55/0xAA反转、随机数据循环读写连续跑几轮。我一般测试时让DMA同时搬数模拟真实负载下的DDR压力很多问题在空闲状态下发现不了。7.3 启动失败的排查链路如果电源正常、JTAG能识别、DDR也training过了但系统还是起不来按下面这个链路排查能省很多时间现象优先检查项VCCPINT上电但VCCPAUX迟迟不拉高检查PG级联是否正常EN引脚是否被下拉JTAG扫描找不到器件检查PS_CLK有没有起振JTAG引脚电平、下载器连接JTAG能识别但DDR training失败检查DDR电源、VREF、ZQ、DQ映射DDR正常但QSPI启动无打印检查Boot Mode MIO电平确认QSPI镜像是否烧录、Flash是否正常SD启动失败检查SD卡座接触、SDIO电平匹配、卡内镜像分区Linux起来后随机崩溃检查DDR信号完整性、电源纹波、时钟抖动排查启动问题时UART打印是定位故障的关键。如果完全没打印用JTAG去看PC停在哪里停在BootROM说明启动介质读取失败停在FSBL说明DDR初始化或bitstream加载有问题这能帮你快速缩小范围。最后分享一个我个人的调试习惯新板子回来先拿一颗已经验证过的Zynq最小系统镜像只跑UART打印不跑DDR、不加载bitstream确认PS本身活着然后再逐步加载DDR、bitstream和Linux。每一步都验证过再往下一层走。这样即使出问题也能很清楚地知道是哪一层引入的。硬件设计没有捷径但保持这种“逐层点亮”的耐心能把返工的痛苦降到最低。