ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Zynq-7000核心板硬件设计全解析:电源、DDR3与调试经验

Zynq-7000核心板硬件设计全解析:电源、DDR3与调试经验 1. 项目概述与核心需求解析1.1 为什么选择XC7Z010做核心板做嵌入式产品开发这么多年Zynq-7000系列的板子我前前后后画过好几版从7010到7020再到7045都碰过。其中XC7Z010这颗料在低成本、中小规模工业控制场景里出镜率非常高我自己的几个项目也用它做了核心板。Zynq-7000本质上是一颗SoC把ARM Cortex-A9双核处理器和Xilinx 7系列FPGA逻辑放在同一颗芯片里PSProcessing System和PLProgrammable Logic之间通过AXI总线互联。这意味着你既能跑Linux系统做应用层逻辑又能用FPGA做实时性要求高的信号采集、协议解析、电机控制两边还能高速通信。XC7Z010在Zynq-7000家族里属于入门级但该有的资源一点都不少。PS侧是双核ARM Cortex-A9运行频率最高能到766MHz-1速度等级是667MHz带L1和L2 CacheDDR控制器支持DDR3/DDR3L/LPDDR2还集成了千兆以太网MAC、USB 2.0 OTG、SD/SDIO控制器、UART、SPI、I2C、CAN这些常用外设。PL侧有28K个Logic Cells240个DSP48E1 Slice80个18Kb BRAM块一共1.8Mb的Block RAM。做核心板要的就是把PS最小系统、DDR、Flash、电源、时钟、配置电路都做好用户拿过去直接通过板对板连接器引出PS和PL的IO自己扩展底板。选择XC7Z010做核心板而不是直接用7020核心逻辑是成本敏感。7010的PL资源对大多数工业控制、机器视觉预处理、数据采集场景已经够用而价格比7020便宜不少。如果你的产品需要更复杂的逻辑算法比如图像缩放、多通道FFT、高速SerDes那直接换7020核心板PCB不用改因为封装一样引脚完全兼容。这就是Zynq核心板设计的一个天然优势前期布局留好余量物料升级非常灵活。1.2 核心板架构设计与功能划分核心板的设计目标很明确把Zynq运行所需的最小且完整的硬件环境做出来包括供电、存储、时钟、配置和调试接口并通过高速连接器把PS和PL的可用IO全部引出。整体架构可以分成七个功能域电源域、时钟域、存储域、配置域、调试域、PS外设域、PL外设域。电源域是整个核心板的地基Zynq-7000的上电顺序有严格要求设计不好轻则启动异常重则烧芯片。存储域包括DDR3 SDRAM和QSPI FlashDDR3跑在PS的DDR控制器上QSPI Flash用于存放Boot Image和应用程序。时钟域包括PS参考时钟、DDR参考时钟、PL参考时钟三者频率要求各不相同。配置域负责启动模式选择和Boot Image加载通过MIO引脚的电平状态决定是从QSPI启动、SD卡启动还是JTAG启动。调试域提供JTAG接口用于下载代码和在线调试。PS外设域把Zynq PS侧的Ethernet MDIO、USB、UART、CAN、SDIO、I2C、SPI这些接口通过连接器引出同时MIO的电压域电平必须提前规划好1.8V还是3.3V直接影响外设连接方式。PL外设域则把PL侧的HP Bank和HR Bank的IO全部引出HP Bank支持1.2V-1.5V电平适合高速信号采集HR Bank支持1.2V-3.3V电平适合连接通用外设。每个Bank的VCCO独立供电通过连接器上的电源引脚和底板电源模块配合实现电平匹配。1.3 关键器件选型逻辑核心板器件选型我踩过不少坑这里说几个关键经验。DDR3颗粒我选了Micron的MT41K256M16HA-125单颗512MB容量16bit位宽两颗拼成32bit位宽、1GB总容量。Zynq-7010的DDR控制器支持16bit或32bit总线宽度32bit的带宽比16bit翻倍在PS和PL之间搬运大块数据时差别很明显。选-125速度等级DDR3-1600实际跑1333MT/s留有余量。QSPI Flash选了Spansion现在是Cypress的S25FL128S128Mbit容量。Zynq BootROM最多支持从Quad-SPI加载256MB的镜像128Mbit对大多数应用够了。如果Linux的rootfs放在SD卡或eMMC里QSPI里只需要放U-Boot和内核64Mbit都够用。选S25FL128S的原因之一是这个型号在Vivado的QSPI支持列表里BootROM直接认几乎不折腾。电源芯片选型是整个BOM里面最需要花时间的。核心板有多个电压轨但功耗总体不算大PSPL满载大概2-3W所以用DC-DC加LDO的组合就够了。主电源用一颗TPS650250这是TI专门为Zynq-7000设计的PMIC集成了三路DC-DC和两路LDO输入5V输出VCCPINT 1.0V、VCCPAUX 1.8V、VCCDDR 1.5V、还有PL的VCCINT 1.0V和VCCBRAM 1.0V电源时序由PMIC内部硬件控制默认就满足Zynq的要求省心很多。电平转换和接口保护方面核心板上我要留几个测试点方便调试。每路电源都加一个0欧电阻或者磁珠作为分割点调试时能单点测量各轨电流。MIO、PL IO的连接器引脚旁边预留ESD保护器件位置虽然裸板调试时一般不贴但量产版本必须补上。2. 电源系统设计详解2.1 电源轨需求分析与拓扑选择Zynq-7000的上电要求比普通单片机严格得多。XC7Z010需要供电的引脚分成两大类PS侧和PL侧。PS侧包括VCCPINT1.0VPS内核、VCCPAUX1.8VPS辅助、VCCPLL1.8VPLL电源。PL侧包括VCCINT1.0VPL内核、VCCBRAM1.0VBRAM、VCCAUX1.8VPL辅助。此外每个IO Bank的VCCO必须单独供电PS侧MIO Bank分为MIO 0/1500/501和MIO 2/3502/503其中MIO 0/1和3.3V或1.8VMIO 2/3可以接1.8V或2.5V或3.3V。PL侧的HR Bank VCCO范围是1.2V到3.3VHP Bank是1.2V到1.5V。上电时序方面Zynq的要求是VCCPINT和VCCINT先上电然后VCCPAUX、VCCAUX、VCCBRAM最后是VCCO和VCCPLL各轨之间的延迟没有硬性规定但必须保证后者不早于前者。最稳妥的做法就是用支持时序控制的PMIC或者用电源监控芯片加外部逻辑控制使能顺序。TPS650250的默认配置就是按这个顺序来的所以选它省了不少事。电源拓扑选择上核心板输入一般是5V从底板提供。VCCPINT电流最大峰值可能到1A多必须用DC-DC。VCCPAUX和VCCPLL电流不大LDO就够但噪声要求高因为PLL电源直接影响时钟抖动。PL侧VCCINT电流看逻辑复杂度7010一般不会超过1.5ADC-DC保险。VCCAUX也要注意7系列有个要求是VCCAUX先于VCCINT上电会导致FGPA配置异常处理方法是加一个MOS管电路控制VCCAUX的使能等VCCINT稳定后再打开。2.2 电源时序与监控电路实现TPS650250虽然是专用PMIC但我不建议直接按照数据手册默认设计完事。实际项目里我会加一个独立的电源监控芯片比如TI的TPS386040或者ADM1184监控VCCPINT、VCCINT、VCCPAUX、VCCAUX这四路电压是否达到阈值。为什么要额外加监控因为PMIC虽然输出正确但PCB走线阻抗、负载突变引起的压降可能导致芯片引脚处的实际电压低于规格。监控芯片的作用是输出一个Power Good信号接到PS的MR引脚POR如果任何一路电压异常强制Zynq复位防止在不确定状态下运行。电源时序的具体实现我用了TPS650250的默认时序然后用RC延时电路做软启动控制让VCCPINT先到VCCPAUX随后VCCIO最后。实测上电波形从VCCPINT开始到VCCO 3.3V稳定整个过程约10ms满足Zynq的上电要求。需要注意的是VCCPLL的供电我独立用一颗超低噪声LDOLP5907-1.8给VCCPLL供电而不是直接接VCCPAUX。因为VCCPLL给ARM PLL和DDR PLL供电噪声大会导致时钟抖动增大轻则DDR偶发错误重则系统不稳定。虽然这样多花几毛钱但值得。电源的去耦电容摆放也是一门学问。VCCPINT引脚密集每个引脚旁边都放一个0.1uF的MLCC0805还是0402取决于PCB密度然后芯片背面放几个10uF大电容共同组成低阻抗供电网络。特别提醒Zynq芯片底部有一个很大的散热焊盘是GND必须确保焊接时焊盘充分接地不然地回路阻抗高会导致电源噪声大幅上升。2.3 电源完整性与实测验证电源设计是否合格不能只看电压准不准还得看纹波和动态响应。纹波测试要用示波器弹簧地线不能用地线夹子否则会拾取噪声测出来数据失真。Zynq的内核电压纹波建议控制在±30mV以内DDR3的VCCDDR纹波控制在±25mV以内。我遇到过一个典型的电源问题DDR3跑到666MHz时偶尔报ECC错排查了很久最后发现是VCCDDR纹波到了70mV超出了DDR3颗粒的允许范围。原因是我在VCCDDR的反馈回路走线上出了岔子——反馈采样点放在了DC-DC输出端的电容前面导致负载端的压降没有被补偿到。把反馈走线改到DDR颗粒旁边的0.1uF电容处后纹波降到20mV以内问题消失。所以经验是电源反馈采样点必须放在负载最远端而不是电源输出端。另一个经验是地平面的完整性——DDR3走线下方必须有连续的地平面参考不能有切割。如果地平面断了信号回流路径变长不仅影响DDR时序还会增大EMI辐射。3. DDR3存储器系统设计3.1 DDR3容量与速率选型XC7Z010的PS内部集成了DDR2/DDR3/LPDDR2控制器这个控制器支持16bit或32bit数据总线宽度最高速率DDR3-1066-1速度等级。很多人以为7010只能跑1066其实用-2速度等级可以跑到DDR3-1600但PCB布线难度会上升。我这次选的是DDR3-1600颗粒MT41K256M16HA-125实际配置跑1333MT/s留了频率余量时序收敛更容易。容量选择上两颗512MB的DDR3组成1GB。如果你跑裸机程序512MB就绰绰有余如果跑Linux1GB比较舒服不然编译内核和加载驱动时经常内存紧张。位宽方面32bit比16bit在带宽上有质的差别特别是在PL和PS之间通过AXI总线搬运视频数据时DDR带宽往往是瓶颈32bit能缓解这个问题。DDR3布线是核心板设计的重头戏。Zynq的DDR控制器对PCB走线有明确的长度匹配要求地址线、控制线、时钟线按T型或Fly-by拓扑连接需要做等长处理。数据线按组做等长每组DQS和对应的8根DQ数据线长度差控制在±20mil以内DQS到CLK的长度差控制在±50mil以内。这些数字是经验值实际以Xilinx的UG586文档为准。我建议纯数据线等长尽量做到±10mil虽然布线难度增加一点但时序裕量会明显改善。3.2 DDR3布局布线关键点DDR3部分我习惯单独规划一个布局区域。两个DDR3颗粒放在Zynq芯片同一侧尽量靠近PS的DDR引脚减少过孔数量。数据线走在表层或第二层地址线走在内层起到一定屏蔽作用。阻抗控制上用单端40欧、差分80欧1.6mm板厚、8层板的叠层设计下线宽线距都能满足。地址线采用Fly-by拓扑两颗DDR3之间用菊花链连接末端放置ODT电阻。这里有个细节Zynq DDR控制器的地址线可以配置为Write Leveling和Read Leveling模式如果是T型拓扑写均衡训练会比较麻烦。Fly-by拓扑对信号完整性更友好虽然Read Leveling需要支持但Zynq的DDR控制器本身就是这么设计的配合Micron颗粒没有问题。终端匹配方面DDR3使用On-Die TerminationODT不需要外接终结电阻到VTT。但是VTT电源需要用LDO或小电流DC-DC产生规格是VCCDDR的一半。VTT的走线宽度要足够因为DDR3在读写切换时VTT上会有较大电流瞬变窄走线会导致VTT波动。我实际用了0.5mm宽的走线实测VTT波动小于30mV。DDR3布线完成之后仿真验证不能省。至少做一次时序仿真用HyperLynx或者免费的SI工具跑一下地址线和数据线的飞行时间。如果你没有仿真环境那就严格按照Xilinx的参考设计来抄不要随意改动DDR部分的拓扑和等长规则这是无数前辈用生产事故换来的血泪教训。3.3 DDR3调试与TrainingDDR3调试是这个项目里最让人掉头发的一环。上电后PS的DDR控制器会执行Training流程包括写均衡、读均衡、MPR、写DQS门限校准等训练失败就说明硬件链路上肯定有地方不对。我在调试过程中遇到过几个典型问题这里列一个排查顺序供参考第一步查供电。VCCDDR必须是1.5V正负3%以内VTT必须接近0.75VVREF必须稳定在0.75V附近且纹波低。VREF是用电阻分压产生的两个1%精度电阻分压VCCDDR得到0.75V必须加0.1uF和1uF两级去耦电容不然Training时偶发失败。第二步查时钟。Zynq的DDR控制器需要PS_CLK输入频率33.33MHz。DDR的时钟信号是控制器内部产生的不存在外部DDR时钟但如果PS_CLK抖动太大也会传递到DDR时钟上。第三步查等长。把等长规则再核对一遍特别是数据线组的等长我见过有人把DQ0到DQ7做等长了但是DQS反而没跟上Training当然过不了。第四步查ODT和阻抗。ODT配置是由软件寄存器控制的但硬件上如果DDR3颗粒的ODT引脚悬空或者接错也会出问题。如果Training能过但跑压力测试时报错那大概率是时序裕量不足。这时可以试着降速运行如果降速后稳定说明是信号完整性或时序裕量的硬件问题如果降速还是报错可能是地址线或控制线的问题甚至可能是DDR颗粒的问题。我调试时最常用的工具是Vivado的DDR调试向导和ISE的ChipScope通过读取DDR控制器的校准寄存器能看到每个字节通道的裕量非常有用。4. 配置与启动电路设计4.1 启动模式配置与引脚处理Zynq的启动模式由MIO[6:2]五个引脚的电平状态决定。BootROM在复位释放后会采样这些引脚判断从哪个设备启动。模式包括JTAG、QSPI、SD卡、NOR Flash、NAND Flash以及级联模式比如QSPI启动失败后转SD卡。这五个引脚必须用电阻硬拉到确定电平不能在调试时悬空。我一般用4.7k的排阻把MIO[6:2]配置成00101QSPI优先SD备份这样量产时固件放QSPI里调试时也能通过SD卡更新程序比较灵活。需要注意的是MIO[6:2]同时也是PS的通用GPIO如果用到了这些引脚必须确认启动模式配置和功能复用不冲突。还有一个细节Zynq的MIO引脚内部有上拉和下拉BootROM采样时读取的是引脚上的逻辑电平。如果配置启动模式的电阻值选得太大比如10k以上引脚漏电流可能导致电平不确定。实际用4.7k比较稳妥既不影响正常信号电平又能保证确定的上拉/下拉。4.2 QSPI Flash电路细节QSPI Flash连接在PS的Quad-SPI控制器上使用MIO[1:0]和MIO[8:15]这10个引脚。MIO[1:0]用于CS和CLKMIO[8:15]用于数据线。S25FL128S支持四线模式数据线同时用于命令、地址、数据电路连接比较简单每个MIO引脚连到Flash对应引脚即可。这里有个坑Zynq的QSPI控制器有两种工作模式Single和Dual。Dual模式下MIO[8:15]的八个引脚全部连到Flash上数据位宽是8bitSingle模式只用MIO[8:11]四个引脚这样MIO[12:15]可以释放出来做通用GPIO。我的做法是全部连上用Dual模式这样可以发挥QSPI的带宽优势特别是从QSPI启动Linux内核时加载速度能快一倍。QSPI Flash的供电是3.3V由VCCO_MIO1供电。如果VCCO_MIO1设置成1.8V那么QSPI Flash也得换1.8V的型号或者加电平转换。这个必须提前规划因为MIO电压域一旦定下来底板上的外设电平都要配套。4.3 JTAG调试接口与下载链设计JTAG接口是调试Zynq的生命线。Zynq的JTAG通过专用引脚访问不是MIO复用的。7系列FPGA的JTAG引脚TDI、TDO、TMS、TCK是专用的连接器采用标准14针或10针JTAG头。我习惯用10针JTAG引脚间距2.54mm通用性最好兼容Xilinx Platform Cable USB II和Digilent JTAG-HS2。JTAG链路设计上还有一个需要注意的如果你的JTAG链上挂了多个设备比如FPGA和CPLD串联那么每个设备的TCK、TMS、TDI、TDO必须串联起来而且空闲设备的TDI必须连接到前一个设备的TDO整个链路封成环。如果是单设备设计TDI和TDO可以直接连接器。另外TCK信号上不要加太大负载电容因为JTAG的频率可以跑到30MHz大电容会导致信号边沿变缓下载失败。我试过在TCK上加了100pF滤波电容结果下载时经常报错误去掉后正常。5. 时钟系统与关键外设接口设计5.1 时钟树规划Zynq-7000的时钟系统分两块PS侧和PL侧。PS侧必须有PS_CLK输入时钟频率33.33MHz精度要求100ppm以内。这个时钟由一颗有源晶振提供我选了SiTime的SiT8008系列工业级温漂-40到85度稳定性不错。PS_CLK经过PS内部的PLL后产生ARM、DDR、外设各自的工作时钟。PL侧需要一个参考时钟频率可以自定义常见的100MHz、125MHz、200MHz都有。PL时钟通过专用全局时钟引脚MRCC或SRCC输入这两个引脚位于FPGA的特定Bank上不能随便用普通IO接时钟信号。我在核心板上放了一个可编程振荡器SI514频率可通过I2C配置这样同一块板子既能出100MHz给逻辑用也能改到125MHz给以太网非常灵活。DDR3的时钟比较特殊Zynq内部有独立的DDR PLL外部不需要提供DDR时钟但PS_CLK的质量直接影响DDR PLL的输出抖动所以PS_CLK的电源和布线要特别用心晶振下面铺地引脚走线尽量短远离开关电源的电感附近。5.2 PS侧外设接口设计要点PS侧外设接口的电压都来自VCCO_MIO所以首先要确定MIO电压域。我的设计里MIO Bank 0MIO[0:15]和MIO Bank 1MIO[16:31]设成3.3VMIO Bank 2MIO[32:45]设成3.3VMIO Bank 3MIO[46:51]也设成3.3V。GPIO、UART、SPI、I2C、CAN这些接口全部以3.3V CMOS电平引出底板设计时不用额外做电平转换直接接3.3V外设就行。千兆以太网在Zynq里是GMII/RGMII接口MIO引脚直接引出到PHY芯片。我的核心板先不集成PHY而是把RGMII信号引到连接器让底板根据实际需求选PHY型号。这样做的好处是核心板不需要绑定具体PHY底板可以自由选择千兆PHY或百兆PHY。RGMII信号速率是125MHz布线时要注意信号完整性每个信号线做等长处理并预留串阻位置。USB 2.0 OTG接口是PS上的硬核ULPI接口连接到MIO这个也没集成PHY而是把ULPI信号引出到连接器。ULPI的时钟是60MHz需要和USB PHY芯片配合。要注意的是USB的VBUS检测和ID检测引脚也要留出来不然OTG功能没法用。SDIO接口我引到连接器底板接SD卡座或eMMC。SDIO时钟最高50MHz信号完整性要求不算高但要注意SD卡座的卡检测引脚要正确处理不检测的话可能导致内核枚举失败。5.3 PL侧IO Bank与电平规划PL侧的IO分为HR Bank和HP Bank两大类。XC7Z010的PL侧有大概5个HR BankBank0、13、14、35、34以及2个HP BankBank11、12。我在核心板上把HR Bank的IO全部引出电压设为3.3V方便底板接通用器件。HP Bank同样引出电压设为1.5V用于高速信号采集比如接高速ADC、高速DAC、DDR3等。PL IO的大量引脚通过板对板连接器引出这时每个Bank的VCCO必须仔细检查一旦VCCO设错对应Bank的所有IO都是错的而且可能损伤芯片。我在连接器的每个电源引脚旁边都加了100nF去耦电容降低底板供电噪声对核心板的影响。PL侧的配置时钟CCLK和配置引脚PROG_B、DONE、INIT_B也需要引出。PROG_B是配置复位信号可以用来强制重新加载配置DONE信号指示配置是否完成调试时经常用LED连到DONE上看配置状态。6. PCB设计与生产加工要点6.1 层叠结构与阻抗控制XC7Z010核心板我设计了8层板叠层结构是顶层信号、GND、信号、电源、GND、信号、电源、底层信号。这个结构的优点是每个信号层都有相邻的地平面参考信号回流路径短EMI控制比较好。板厚1.6mm铜厚1oz外层内层0.5ozPCB厂家做阻抗控制时这个参数比较好实现。阻抗要求单端50欧差分90欧USB和100欧以太网差分对。因为走线在内外层都有内层走线参考上下地平面线宽要算好外层走线一面参考地线宽略宽。我在设计时用Polar Si9000算阻抗算好之后把线宽线距填到PCB布线规则里让布线工具自动匹配。电源层规划上我把1.0VVCCPINT/VCCINT、1.8VVCCPAUX/VCCAUX、1.5VVCCDDR、3.3VVCCO_MIO各分了一层电源平面总共4层电源这样每路电源都有一个完整的平面阻抗低噪声小。如果层数不够比如6层板电源平面必须分割这时要特别注意不要跨分割走信号。6.2 关键信号布线策略核心板的关键信号分为几个等级布线优先级完全不同。DDR3信号是最高优先级数据线必须整组在同一个层走线尽量避免换层即使换层也要保证回流路径连续。DDR时钟线要做好包地处理两侧用地线围住减小耦合。第二优先级是PS_CLK和PL参考时钟以及USB和以太网的差分对。时钟信号尽量走内层上下都是地平面金黄3W原则线与线间距至少3倍线宽避免平行走线。差分对的话对内等长控制在±5mil对外等长控制在±20mil。第三优先级是MIO信号、JTAG、QSPI Flash信号。这些信号速率不高布线要求不严但不能跨分割。跨分割的地方如果有高速信号会产生严重的阻抗不连续和EMI问题。板对板连接器的分配也要注意。Zynq的HP Bank、HR Bank、MIO信号都走连接器连接器的选型和引脚分配直接影响布线的复杂度。我选用了4个80pin的0.5mm间距板对板连接器引脚分配时把高速信号放在连接器中间位置低速信号和电源放在两端这样高速信号能就近进入内层减少过孔数量。6.3 散热设计与可制造性XC7Z010的功耗PS满载大概1.5WPL侧如果逻辑跑得多再加1W左右合计约2.5W。这个功耗在工业温度范围内必须考虑散热。芯片底部有散热焊盘我建议在PCB上开散热过孔阵列将热量导到背面。散热过孔不要开太大0.3mm孔径、1.0mm间距20个左右就够。如果产品外壳能接触到芯片顶部可以加一个导热垫效果更好。可制造性方面核心板因为引脚密度高焊盘间距小PCBA加工难度比普通板子高。0.5mm间距的连接器焊接工艺稍有偏差就容易虚焊因此PCB焊盘的尺寸、钢网开孔、回流焊温度曲线都需要根据代工厂的工艺能力调整。我在Gerber文件里会特意标注出连接器焊盘的尺寸公差并和代工厂确认钢网厚度。QSPI Flash、DDR3、Zynq芯片这些BGA封装的器件X-Ray检测是必须的不然内部短路或虚焊都发现不了。我产线上遇到过几次Zynq芯片BGA焊接不良表现是一上电电流偏大或者部分IO功能异常X-Ray检查能看到锡球排列不齐返修后正常。7. 常见问题与调试经验实录7.1 上电后JTAG检测不到芯片这个问题我在样机阶段几乎每次都会遇到排查思路按顺序来。首先看电源指示灯亮不亮各电压轨有没有输出。用万用表测VCCPINT是否稳定在1.0VVCCPAUX是否1.8V3.3V是否正常。如果电源都对再查PS_CLK是否有时钟输出用示波器点一下晶振引脚33.33MHz频率是否准确。如果PS_CLK正常再查PROG_B引脚是不是被拉低如果拉低了芯片一直被复位JTAG当然识别不到。还有一个常见原因JTAG连接器的TDI、TDO、TMS、TCK引脚顺序搞反了。不同厂家的JTAG头引脚定义不完全一样我用过Xilinx原装线缆和Digilent的线缆引脚定义一致但如果你用的是第三方调试器一定要核对引脚顺序。最后一个容易忽略的点是Zynq的PS侧JTAG使能问题。Zynq的JTAG和PL的JTAG不太一样PS的JTAG链默认是使能的但如果有某个MIO引脚被配置成和JTAG复用而且外部电路把它拉到了不对的电平就可能屏蔽JTAG。所以我设计时特意留了JTAG链路不接任何MIO复用信号。7.2 DDR3 Training失败或偶发报错DDR训练失败是核心板调试中最常见的问题我分两层排查。第一层是硬件电压、时钟、等长、VREF、终端电阻。第二层是软件DDR控制器参数配置是否正确。Vivado里第一次建立工程时DDR型号必须选对不然Training时用错误的配置去驱动硬件必然失败。我遇到过DDR偶发报错的场景很有代表性程序跑几个小时突然报ECC错误。排查过程中发现是DDR走线过长导致信号劣化数据线的飞行时间超出了DQS窗口。解决办法是把DDR数据线全部换到内层走线并且加严格等长约束重做后跑了72小时压力测试没有再报错。另外DDRVREF的稳定性极容易被忽略。VREF是DDR3内部的参考电压由外部电阻分压产生VREF噪声大时接收端判断高低电平的窗口就变小信号稍有抖动就采错。调高点分压电阻精度从5%换成1%并在VREF引脚加0.1uF去耦电容这个问题就能解决。7.3 Linux启动中段崩溃或外设初始化失败Linux启动时U-Boot能正常引导但内核启动到一半崩溃常见原因是设备树里配置的外设地址或中断号与实际硬件不一致。我遇到过一个情况内核启动后在USB初始化时报错检查发现U-Boot的USB PHY初始化没有执行原因是U-Boot配置里把USB模式设成了Host-only但设备树里配置的是OTG模式两边对不上。另外一个典型问题SD卡启动时内核报mmc0错误。排查中发现是SDIO信号线上的上拉电阻没有加上导致时钟和数据信号不稳定。SDIO时钟线和数据线建议都加上上拉电阻具体阻值参考Zynq TRM的推荐值。实测在很多底板上不加也能工作但偶尔会初始化失败加上后稳定多了。因为PS外设的MIO引脚是软件可配置的同样的核心板在不同底板上的功能可能完全不同。我建议设计完底板后在Vivado里把每个MIO引脚的复用功能和方向仔细核对一遍避免底层硬件冲突导致莫名其妙的问题。7.4 核心板调试的通用工具与技巧硬件调试离不开工具这里列一下我在调Zynq核心板时常用的工具组合。示波器至少200MHz带宽最好有一个差分探头。逻辑分析仪16通道以上调试MIO信号时很方便。万用表有四位半精度就够了主要是测电压轨和电阻。热风枪和烙铁用于返修BGA返修台就按需配置。软件工具方面Vivado的Hardware Manager除了下载Bitstream还能读FPGA内部温度、电源电压寄存器调试时很方便。第一次上电时不要急着烧入很久的比特流先把电源调正常再用GPIO点灯程序验证最小系统。行业里有一个实用技巧打样回来后先不焊接DDR3只焊接电源部分、Zynq、QSPI Flash然后量每个电压轨的电压和纹波确认电源完全没问题再焊DDR3。这样做的好处是万一电源设计有BUG不用报废昂贵的DDR颗粒和Zynq芯片修板成本低很多。我的一些朋友一开始就把所有器件一锅端焊上上电后发现电源有问题拆芯片时把焊盘都搞坏了折腾了好几个来回。8. 从核心板到产品的工程化经验8.1 核心板与底板的接口定义核心板做成商品连接器引脚分配要兼顾灵活性、可扩展性和信号完整性。我采用的4个80pin板对板连接器整体引脚规划如下电源分配占20pinMIO信号占30pinPL信号占60pin调试和配置占20pin其余是GND。GND引脚均匀分布在连接器中起到屏蔽和回流作用。电源引脚要注意最大电流问题。一个0.5mm间距连接器的单pin额定电流大约0.5A如果需要从底板给核心板供5V的2A电流至少需要4个引脚并联。我每个电源轨都并联了4到6个引脚并且均匀分布在连接器各段避免连接器局部过热。连接器的机械可靠性也要考虑。核心板有DDR3和Zynq这类重器件安装到连接器上后如果受到振动容易松动。我加了两个定位螺丝孔用M2铜柱把核心板和底板固定在一起这样经过多次插拔和振动测试都没出问题。8.2 量产可制造性与测试方案硬件设计最终要能进入量产。我在设计阶段就会提前考虑测试问题。每个核心板预留串口测试点产线上用串口指令读回核心板的版本号、温度、DDR容量等信息判定是否合格。JTAG接口用来烧写量产固件流程是先焊好板卡再统一烧写。还要做老化测试。核心板在45度高温老化房里跑24小时压力测试包括内存读写、QSPI读写、UART回环、以太网Ping包。测试脚本记录每次失败日志结束后人工分析。这块跑不过的话绝对不能出货。量产版本的BOM里有源晶振、PMIC、DDR3、QSPI Flash这类核心物料一定要找正规代理商或者原厂购买不要贪便宜走灰色渠道。我见过一个量产批次用了非正规渠道的DDR3不良率明显偏高换回正规物料后问题消失白白损失了一批板子。8.3 后续可扩展方向XC7Z010核心板的基础上如果要升级性能可以直接把Zynq换成XC7Z020封装和引脚完全兼容PCB不用改只是DDR控制器的带宽建议配成32bit已有PL侧资源翻倍可以做更复杂的逻辑。如果还需要更高性能就要考虑Zynq UltraScale系列不过封装和设计规则变了核心板要重新画。外设扩展方面核心板引出的HP Bank可以做高速ADC采集配合FPGA逻辑做数据预处理这是目前工业检测领域很热的方案。Xilinx自己的VDMA和AXI-Stream协议已经把这个流程封装得很完善软件开发效率比纯FPGA开发高很多。我做的这款XC7Z010核心板已经用在机器视觉缺陷检测、工业以太网网关、数据采集卡三个产品方向上稳定性都通过了考验。核心板的设计思路和这套调试经验放之整个Zynq-7000系列都适用。如果你也在做类似的板子希望这篇文章能帮你少走点弯路特别是电源、DDR和启动这三块值得多花时间仔细推敲。
返回列表