ARTICLE DETAIL

资讯详情

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

基于XC7Z100的Zynq-7000板级系统设计:从原理图到DDR3L布线与调试

基于XC7Z100的Zynq-7000板级系统设计:从原理图到DDR3L布线与调试 做Xilinx Zynq-7000系列板子之前我想先泼一盆冷水别一上来就盯着DDR那一坨走线那是整块板子流程里最后才轮到的地方。真正决定一块XC7Z100板卡能不能跑起来的是原理图阶段的电源树、时钟和复位这三样缺一样板子到手基本就是废铁后面画得再漂亮都得推倒重来。XC7Z100在硬件设计圈里一直被当作Zynq-7000家族的高性能代表一颗芯片内部同时躺着双核ARM Cortex-A9和一大片可编程逻辑阵列。通俗点说它把一颗能跑Linux的应用处理器和一块规模不小的FPGA糊进了同一个封装里。所以画原理图的时候你既要照顾应用处理器的“电脑思维”还要照顾FPGA的“逻辑思维”这是它和51单片机、STM32最小系统板那些经典入门项目的本质区别。这篇文章就完整复盘一次从原理图到板级系统搭建的实战过程。内容按我实际项目里的推进顺序来写先是选型与架构拆解然后是原理图各关键模块的设计点再是PCB层叠、阻抗和DDR布线最后是通电调试和踩坑记录。适合正在画Zynq板子的人也适合从MCU往复杂SoC平台跳的硬件工程师越往后读越能感受到“为什么这么设计”而不是“照着连就完了”。1. 动手前先把芯片和板级架构想清楚1.1 XC7Z100是谁和MCU设计有什么不同很多从STM32转过来的朋友第一反应是拿看MCU的方式看Zynq结果看数据手册的时候直接懵掉电源引脚几十个配置引脚一堆Bank这个概念反复出现DDR、QSPI、USB、以太网这些外设引脚还不固定要由MIO复用配置决定。这确实比单片机复杂但复杂不等于难关键是把它的架构理清楚。XC7Z100本质上是一个异构SoC分PS和PL两大部分。PS是Processing System包含双核ARM Cortex-A9、L2 Cache、DDR控制器以及各种硬核外设PL是Programmable Logic就是传统的FPGA可编程逻辑资源。两者之间通过AXI总线高速互联性能强的地方在于“ARM管流程、FPGA管数据搬运和处理”这种分工非常适配视频采集、软件无线电、工业控制、边缘计算这类既有复杂协议栈又有大量并行计算的任务。从硬件设计角度看PS部分是“数字应用处理器”的设计思路DDR走线、启动配置、时钟复位、外设电平匹配都得严格按照SoC的设计规范来PL部分则是“FPGA板卡”的设计思路要考虑配置电压、IO Bank电压、高速串行收发器、电源去耦这些传统FPGA设计内容。所以一块板子相当于同时做了一块ARM核心板和一块FPGA板工作量自然不是画个最小系统那么轻。另外要提醒选型阶段的一个坑网上搜Zynq硬件设计经常会看到一些老牌板卡把DDR3L做成标配很多新人就疑惑为什么不上DDR4。Zynq-7000的PS端DDR控制器只支持DDR3/DDR3LPL侧的MIG也不支持DDR4直连想用DDR4得选UltraScale以后的平台。所以千万别拿着项目标题里带“DDR4原理图”的资源硬套在ZC7Z100上套了也白套这是芯片硬限制。1.2 板级系统先搭哪条链路我的搭建顺序拿到一颗新芯片我不会先从某个具体外设开始画。我的习惯是先按“电源—时钟—复位—下载调试—大容量存储—通信接口—PL外设”这个顺序把整块板子的链路搭出来。电源是第一个要解决的因为Zynq的电源轨非常多PS有VCCPINT、VCCPAUX、VCCPLLPL有VCCINT、VCCBRAM、VCCAUX各Bank还有VCCO而且上电顺序有讲究。很多人觉得电源不就走个DCDC实际上一颗Zynq规划完电源树基本就决定了板子用几层、热不热、能不能过EMC测试。时钟是第二个PS需要一个PS_CLK参考时钟PL侧需要给各Bank提供IO时钟GTX高速收发器还需要单独的高质量参考时钟。没有时钟其他都是空谈调试的时候连JTAG都可能认不到设备。再往后才是复位、JTAG、启动模式这些“让芯片先活过来”的东西。这也是我反复强调的完整的板级系统不是把原理图所有网络画通就行而是要让系统按照一个明确的顺序“活”起来。先有电再有时钟然后复位释放CPU取指FSBL加载DDR初始化最后引导Linux或裸机程序。你原理图设计时就把这个链条规划好调试阶段会省掉大量时间。2. 原理图设计的关键点电源树、最小系统与接口2.1 电源树一颗Zynq为什么需要七八路电源XC7Z100的电源系统是我每次画原理图最谨慎的部分。简单列一下常见板卡的电源轨就明白了PS的VCCPINT一般1.0VVCCPAUX和VCCPLL一般1.8VPL的VCCINT 1.0VVCCBRAM 1.0VVCCAUX 1.8V然后每个IO Bank根据接的外设不同可能是1.8V、2.5V或3.3VDDR部分还需要VDDQ和VTT。这还没算给LDO和DCDC供电的输入电源、系统5V或12V。说实话光把这些电压摆出来就容易让人打退堂鼓但实际设计是有规律的。第一步把所有电源轨按“核心逻辑、辅助逻辑、IO电平、接口专用”分成四类第二步确定每一类的电压值以官方数据手册和参考板为基准别自己拍脑袋第三步按最大功耗估算每路电流。XC7Z100这种级别的芯片VCCINT那路电流轻松上好几安如果选错DCDC纹波一大FPGA内部时序就乱跑着跑着报bit翻转错误那种问题最头疼。电源的另一个大头是上电顺序。Zynq数据手册里对电源轨的斜坡顺序有明确要求PS和PL各有各的顺序不能乱。一个常见做法是用带使能脚的DCDC把前一级电源的PG输出接到后一级的EN输入一级推一级形成固定顺序讲究一点可以上电源时序控制器比如TI的UCD90160这类。我这里还是建议在原理图阶段就把顺序想好画一个含“输入电压-各路DCDC-PG连线”的电源树框图哪怕不画在图纸里也要在文档里给出来后面焊接、调试、技术评审都用得上。去耦电容也别省。Zynq封装的电源引脚密密麻麻分布BGA背面焊盘扇出后要就近放0.1uF和1uF的高频去耦电容底层再放10uF、22uF甚至100uF的bulk电容。很多板子是DDR跑不稳或PL逻辑偶发错误查到最后是去耦电容太少。这属于原理图阶段就要规划好的因为PCB布局布线是否有可能嵌进去在原理图阶段就能决定。千万别为省事把不同电压的电源引脚合并。每个电源网络该建就建该用磁珠隔就隔。尤其是VCCAUX和VCCPLL这种对噪声敏感的引脚很多参考设计都会加磁珠或π型滤波。你如果和普通数字电源并在一起短期可能没反应但只要项目跑到高速接口或长时间运行噪声问题就会频繁冒出来。2.2 启动、时钟和复位最小系统真正的三根支柱网上搜“原理图”“最小系统”这类词很大比例是在搜STM32最小系统板怎么画。MCU最小系统三板斧是电源、时钟、复位这个思路在Zynq上同样成立只是颗粒度完全不一样。先看启动。Zynq没有传统ARM那种单纯靠BOOT引脚选SPI或SD的方式它是通过MIO的复用配置来实现。具体来说上电时PS会采样启动模式引脚选择从JTAG、QSPI、SD卡、NAND等介质启动。这个模式下电阻的处理很关键不同的启动模式对应MIO上不同的上下拉组合画原理图的时候最好把常用的JTAG、QSPI、SD三种模式都做成可配置电阻位方便调试阶段灵活切换。再看时钟。PS_CLK是给PS系统提供参考时钟的引脚一般用33.333MHz或50MHz有源晶振实际以数据手册给定的频率范围和参考设计为准。时钟源质量很重要别拿便宜的陶瓷谐振器或随便一个有源晶振糊弄抖动太大会导致系统跑飞。PL侧的时钟则要按Bank规划需要给PL提供差分或单端参考时钟时尽量靠近BGA放置保证走线短而顺。GTX高速收发器需要独立的高质量参考时钟通常用可编程的差分振荡器方便通过I2C改频率适配不同速率协议。复位也一样Zynq有PS_POR_B和PS_SRST_B两个关键复位信号。POR上电复位用来做整机冷启动SRST软件复位给外部复位看门狗或者按键使用。很多人就接一个RC复位电路这在MCU项目里能用在Zynq上容易出问题。推荐加复位监控芯片实现上电复位、电压跌落复位、手动复位三合一。原理图上还要仔细看与此相关的Bank电压确保复位引脚的电平逻辑和MIO Bank电压匹配。烧录调试这一环不能漏。标准14脚JTAG接口、TCK/TMS/TDI/TDO四条线必须拉出来加ESD防护和上拉电阻。Zynq的PL配置和传统FPGA不太一样它通常是由PS通过内部配置接口PCAP来加载bitstream启动包顺序是FSBLbitstream应用。这也是为什么很多人第一次玩Zynq板子时明明写好了FPGA逻辑上电却没反应因为根本没做启动镜像或启动介质不对。2.3 DDR3L怎么接以及为什么别碰DDR4DDR部分往往是新手最紧张的地方因为走线密、信号多、等长要求高。但从原理图角度来说DDR3L并不比STM32外接SRAM难多少只要抓住几类信号数据线DQ、数据选通DQS差分对、地址线、控制线、时钟差分对、以及电源VDDQ和参考电压VTT。以常见方案为例PS端DDR控制器支持16bit或32bit数据位宽我的项目用的是一片DDR3L x16颗粒做16bit单通道容量选2Gb或4Gb如果带宽不够就上两片x16拼成32bit。原理图阶段最需要注意的是把DDR颗粒的地址线、Bank地址线、数据线按功能分组整理好别画得乱七八糟否则后面PCB布线时很难做等长。DDR3L的电源要单独理清楚。VDDQ是DDR的主电源电压1.35V需要单独的DCDC或LDO不能用其他IO电源替代VTT是终结电压为VDDQ的一半电流能力要求不高但噪声要低VREF参考电压对噪声敏感最好用电阻分压加滤波电容单独产生不要直接从DCDC引。这些电源在原理图里就要画得清清楚楚等长布线是PCB阶段的事电源没设计好布线再漂亮DDR也跑不稳。顺便说一句现在网上能搜到很多“DDR4原理图”的资源但Zynq-7000平台的PS控制器和7系列PL端内存控制器都不支持DDR4只有UltraScale/UltraScale这类新平台才设计DDR4接口。我见过有人把PC内存条DDR4 SODIMM焊到Zynq板子上结果初始化失败一查手册才发现控制器根本没有DDR4模式只能重新改版。这个坑希望大家绕过去。2.4 常用外设接口的原理图处理细节Zynq的PS端外设很多但和传统单片机不同它的外设引脚大多通过MIO复用输出同一个功能可以映射到不同的MIO引脚原理图设计时需要在Vivado里做引脚分配。这里我只挑几个几乎所有板子都会用到的接口说。UART串口是调试的基本出口通过MIO配置到UART0或UART1再外接一颗USB转串口芯片比如CP2102或FT232。注意MIO Bank的电压如果MIO是1.8V而USB转串口芯片是3.3V就需要加电平转换或选择支持1.8V电平的芯片。这类电平匹配问题是新手最容易犯的原理图画得漂亮结果引脚电压不匹配通信全是乱码。USB 2.0 Host也是一样Zynq PS的USB控制器输出的是ULPI接口不是USB差分信号本身所以必须外接ULPI PHY芯片比如USB3320、USB3300再接USB连接器和ESD防护。原理图里要特别关注PHY的时钟来源、复位脚、中断脚和ULPI接口的电平域。很多人以为Zynq自带USB画个D/D-就完事结果板子回来USB完全无法识别其实就是少了PHY这一层。千兆以太网在Zynq上很常用PS端集成了MAC对外是RGMII接口所以同样需要外接一颗物理层PHY芯片比如88E1518、RTL8211F或KSZ9031。RGMII接口的时钟相位要求比较严现在很多PHY支持内部的TX/RX Delay配置原理图设计时要通过配置电阻把模式设为RGMII-ID否则数据采样会不稳定。MDI差分线对要接网络变压器再到RJ45座变压器选带中心抽头配置的型号即可。QSPI Flash用于存放启动镜像通过PS的QSPI控制器接一颗1.8V的Nor Flash比如S25FL256S。封装小、管脚少原理图不复杂但要注意WP#和HOLD#引脚不能悬空这导致擦写失败或误写保护。SD卡接口也差不多Zynq的SDIO控制器可以和TF卡直连但需要接上拉电阻和ESD保护如果卡座是推拉式还要注意检测脚的接法。PL侧的扩展接口就要根据实际项目需求来设计了。比如视频处理项目可能会从PL引出并行RGB或MIPI接口通信项目会接GTX高速收发器。PL部分每个Bank的VCCO电压要单独规划使用的引脚标准要匹配外设电平。原理图阶段至少预留一个扩展FMC或排针方便后续调试逻辑哪怕产品最终用不到调试阶段也特别管用。3. PCB板级系统搭建层叠、阻抗与DDR布线3.1 层叠设计与阻抗控制10层板怎么排原理图画完后板级系统搭建的下一道工序就是PCB。到了这个阶段核心话题就变成层叠、阻抗、BGA扇出和DDR布线。老实讲Zynq这种芯片不是不能做四层板但性能、EMC和布线可行性都很难保证所以我做XC7Z100基本从10层板起步。10层板的一种常见配置是第一层信号第二层地第三层信号第四层电源第五层地第六层信号第七层信号第八层电源第九层地第十层信号。顶层和底层放器件和主要走线内层承担DDR等密集信号的布线和完整电源平面。电源层不能只画一个shape要把不同的电压平面在物理上分割开分割线要避开关键信号走线区域否则信号会跨分割导致阻抗突变。阻抗控制在层叠阶段就要定好目标值。Zynq单端信号一般按50欧姆控制USB差分对按90欧姆以太网差分对按100欧姆PCIe等高速串行按85欧姆。这里说一个非常实际的经验不要把阻抗控制的期望寄托在PCB加工厂的“帮忙调整”上。你在设计文件中要标明叠层信息、介质厚度、铜厚和阻抗目标值工厂才能帮你调线宽和间距。如果你的板厂只能控制±10%的阻抗那高速信号的裕量就要在设计时留足。很多刚从MCU项目过来的人容易忽略叠层安排的对称性。10层板尽量做到结构对称避免板材翘曲。在层叠方案确定后先做叠层阻抗计算再开始扇出和布线不然画到一半发现某些层没法走线返工量很大。这个顺序别反过来。3.2 BGA扇出和DDR3走线等长XC7Z100用的封装是BGA引脚间距常见0.8mm。第一次画BGA的人会感受到什么叫“寸土寸金”。0.8mm间距的焊盘之间很难穿过普通过孔通常要采用盘中孔或HDI盲埋孔工艺。如果不做盘中孔就把过孔打在四个焊盘的交叉区域让不同层的走线从BGA内部往外扇出一层一层“逃逸”。对于BGA扇出我的建议是先用Cadence Allegro或Altium Designer的自动扇出功能生成初步结果然后手工调整关键信号。DDR信号必须优先扇出因为它们网络多、等长要求高。扇出完成后检查有没有走线瓶颈很多板子是在BGA内部走线太挤被迫换层结果DDR走线阻抗断裂调试时就出现偶发跑飞。DDR3L布线是Zynq板卡上最考验功夫的部分。先把信号分组DQ0~DQ7和DQS0、DQ8~DQ15和DQS1这类数据组还有地址、Bank地址、控制信号和时钟差分对。数据线每组内部做等长常见要求是控制在20mil以内DQS差分对要匹配地址和控制信号相对于时钟做等长容差可以放宽一些比如50mil到100mil具体以芯片手册和MIG参考设计为准。这里还要特别注意参考平面。DDR信号必须有连续的地平面作为回流路径绝对不能跨越电源平面的分割槽。如果某些信号不得不换层旁边要有相邻地平面必要时还要加地过孔。“等长好了但参考平面断了”是很多DDR跑不稳定的隐形杀手。电容摆放也不要忘每个DDR电源引脚附近都要有去耦电容DDR颗粒背面尽量铺完整地平面。我见过有人把所有去耦电容放在板子边缘的“电容阵”里结果纹波依旧大因为电容离引脚太远高频去耦等于白放。正确的姿势是电容跟着引脚走扇出时就占好位置。3.3 高速串行接口和电源平面处理XC7Z100这类中高端的Zynq型号带有高速串行收发器GTX可以用来接PCIe、SFP光模块或者串行ADC/DAC。这部分布线和普通GPIO完全不是一个量级。高速差分对要按差分阻抗控制走线对内等长对间也要尽量等长走线要短而直参考平面完整过孔越少越好。在需要AC耦合电容时比如PCIe发送和接收信号上通常串联0.1uF电容。电容要放在信号路径中最好靠近连接器侧放置同时保证电容两端的阻抗连续不要在这个位置突然收窄线宽。另外高速收发器的参考时钟也必须精心布置它们通常是一组差分对要远离其他数字信号避免串扰。电源平面在这里的作用也很大。GTX的供电引脚一般标识为MGTAVCC等对电源纹波比普通逻辑敏感得多。原理图阶段我已经用磁珠隔离了GTX电源到了PCB阶段就要保证这些电源经过磁珠以后进入收发器引脚之前不要再和其他大动态电流网络混流。否则DDR读写时的大电流跳变会通过电源平面耦合到GTX上导致光模块或PCIe链路误码率飙升。EOS/ESD防护也不能省。USB连接器、RJ45、SD卡座这些直接暴露到外部的接口都要加TVS管或ESD保护器件摆放位置要尽量靠近连接器ESD泄放路径才短。这是一个很容易被忽视但在产品化阶段非常关键的部分实验室环境可能没感觉一到现场就频繁出现接口损坏。3.4 电源平面与去耦电容回到PCB阶段再强调一次电源BGA背面的去耦电容位置是从原理图设计开始就要反复斟酌的。有人把BGA封装的背面整个铺成地平面电容反而没地方放这是不对的。Zynq这类大封装芯片背面通常就是天然的“去耦电容位”设计时要给每个电源引脚预留via到内层电源平面在背面就近摆放高频电容。电源平面分割之前先统计电压域。Zynq板子可能有1.0V、1.35V、1.8V、3.3V等多个电源平面电压域之间要留出足够的隔离间距同时确保每块电源区域的过流面积足够宽。面积不够载流能力不足局部电压跌落就会触发芯片复位或DDR读写出错。一个偷懒但有效的检查方法是在PCB完成后用IR Drop分析工具检查一下核心电源网络看最远端的电压跌落是否超过允许范围比如一般要求3%额定值。去耦电容的容值组合也要结合实际。Zynq这类高功耗芯片通常在BGA下方以0.1uF和0.01uF为主高频抑制效果好BGA外围和板边放10uF到100uF的bulk电容应对瞬态电流。MLCC的直流偏压特性很多人没注意一颗10uF的0402电容在1.0V电压下实际容量可能只剩6到7uF如果是1.8V、2.5V等更高电压的电源轨衰减更明显。选型时要用耐压等级更高的电容来补偿否则电源的瞬态响应会偏弱。4. 通电调试与踩坑实录4.1 上电前要做的事别急着烧程序板子贴片回来第一件事不是插电更不是烧程序。我的习惯是先用万用表量一遍电源对地阻抗重点查VCCINT、VCCAUX、VCCPINT、DDR VDDQ这些大网络有没有短路。这一步能排查出焊接桥连、电容装反等低级但致命的错误。接下来是限流上电。直流电源设到板子额定输入电压先把电流限制调到几百毫安上电后观察有没有异常的电流飙升。如果电流明显偏大马上断电排查。如果电流正常再用万用表逐路量电压确认每路DCDC输出是否正确。这里有件事一定别偷懒测试点已经在原理图设计阶段预留好了那就逐个量过去从输入电源到每路DCDC输出再到芯片端。很多所谓“板卡不上电”最后查出来就是某路电源没起来或者被后级拉死。电压确认之后用示波器看关键电源轨的纹波。纹波超标会导致芯片行为十分诡异比如偶尔启动失败、跑一段时间死机。示波器带宽限制开到20MHz用弹簧地线尽量减少测量噪声量到的纹波才靠谱。量完电源再量时钟用示波器确认PS_CLK有没有信号幅度和频率对不对。没有正常时钟后面一切都白搭。4.2 调试顺序从时钟到DDR再到外设上电稳定后第一个目标是让JTAG识别到芯片。在Vivado Hardware Manager里打开目标连接如果能列出XC7Z100的device说明PS的时钟、复位、JTAG链路和核心供电基本正常了。如果识别不到先把JTAG四根线重新量一遍确认TCK/TMS有没有上拉检查JTAG链上其它芯片是否影响。JTAG识别成功后建立FSBL工程先把DDR初始化跑通。FSBL会自动执行DDR Training如果终端打印DDR初始化失败大概率是DDR布线等长、参考平面或电源问题。这一步我会把常见可疑点列一个checklist逐个排除先量DDR VDDQ和VTT电压再用示波器看DQS/DQ信号有没有明显畸变最后检查地址线、控制线是否交换错位。DDR通过后启动镜像从SD卡或QSPI引导串口打印出Boot日志说明PS侧基本活了。接下来调试外设先验证UART回环再测USB枚举、网口连通然后是PL侧的bitstream加载。PL bitstream加载失败时回看启动顺序和DevC配置确认镜像打包顺序是否正确。我这里特别想强调调试阶段不要跳步先把基础链路跑通再去做复杂功能否则故障叠加在一起定位成本会成倍上升。4.3 常见问题速查JTAG、DDR、USB、网口最后整理一个我实际项目中反复出现的故障速查表。第一次接触Zynq板卡调试的人可以按这张表来快速缩小问题范围。故障现象可能原因排查与解决JTAG识别不到芯片JTAG引脚上拉不对、VCCO电压没给、PS_CLK无输出先量电压时钟再查JTAG四线连接和ESD器件FSBL卡在DDR TrainingDDR电源异常、走线等长差太大、参考平面不连续量VDDQ/VTT电压检查DQS和时钟信号背板确认焊点Linux启动无串口输出UART MIO配置不对、波特率不匹配、启动介质镜像错误检查MIO复用配置确认串口工具参数重写启动镜像USB无法枚举缺少ULPI PHY或PHY模式配置错误、PHY时钟异常查PHY的电源复位、时钟输入确认配置引脚拉法网口ping不通PHY地址配置不对、RGMII时钟延迟未开启检查PHY模式电阻配置RGMII-ID量MDI差分波形PL bitstream不加载启动镜像顺序错误、PL电源或Bank电压异常检查Boot Image分区确认VCCINT和VCCO正常这张表不能说覆盖所有情况但它覆盖了我这几年做Zynq板卡时相当高比例的问题。硬件调试本质是一个“控制变量”的过程一次只改一个点别同时动电源、时钟和软件配置不然出了问题你根本分不清是谁传染的。另外我还想说一个被很多人忽视的调试依赖项——可靠的参考板或官方开发板。手里有一块官方的Zynq开发板和自研板卡做信号对比很多疑难问题能很快定位。比如你怀疑SD卡启动有问题官方板上把同一个镜像跑一遍直接排除镜像本身的问题。硬件工程师千万别嫌参考板贵它省下来的时间成本远超板价。从原理图到板级系统搭建XC7Z100这块芯片确实是个很好的磨刀石。它逼着你把电源设计、高速布线、启动配置、DDR调试这些基本功全部过一遍。我自己的一个固执习惯是原理图里每一个电源轨都加一个测试点并且把电压值和允许纹波标注清楚。调试时拿着万用表一路量过去很多“玄学”问题其实就是某一路电压没起来。做硬件就是这样没有太多捷径但每一步踩过的坑都是后面的经验。希望这篇实战记录能给正在画板子的人一点参考也祝大家的板卡第一次上电就能跑起来。
返回列表