1. 一块二手矿板先摸清启动模式这回事EBAZ4205这块板子我是从蚂蚁矿机S9控制板上拆下来的Zynq-7020矿板。买它的时候图的就是便宜一片完整的XC7Z020CLG400、板载512MB DDR3、NAND Flash、千兆网口整套下来比单独买核心板低太多。但玩过几块之后我得说句实话板子便宜是真便宜坑多也是真多。尤其是“上电之后它自己先跑NAND里残留的矿机固件完全不听你指挥”这个毛病能直接把第一次接触Zynq的新手折腾到怀疑人生。我第一次拿到板子时高高兴兴把JTAG线插上打开Vivado Hardware Manager准备下载一个点灯工程结果设备列表里要么是空的要么刚连上几秒就报“device chain broken”。后来才反应过来这块板默认从NAND启动BootROM一上电就去找NAND里的矿机固件PS侧已经被人家自己的程序占住了我这边想用JTAG接管等于在跟一个正在全速跑的程序抢方向盘。搞清楚这个逻辑之后我开始研究启动模式切换最终把默认的NAND启动临时切到JTAG模式所有调试立刻顺畅起来。这篇内容就围绕“从NAND启动切换到JTAG模式”这个核心动作展开适合手里正好有EBAZ4205矿板、但对Zynq启动机制还不太熟的朋友。我会把原理、操作、验证方法、常见坑一次讲清楚让你看完能直接上手操作。1.1 “矿板”的底细它到底是一块什么板先说硬件配置。EBAZ4205的核心是Xilinx Zynq-7020 SoC型号通常是XC7Z020-1CLG400C这颗芯片集成了一颗双核ARM Cortex-A9处理器以及一片Artix-7级别的可编程逻辑资源PS和PL在同一个SoC里协同工作。板载DDR3内存多数为512MB由四颗128MB颗粒组成不同批次可能用不同品牌镁光、尔必达、海力士都有可能。NAND Flash容量也常见两种32MB或256MB型号常见的是华邦W29N02GV、镁光MT29F2G08这类具体以板子上实际焊接的丝印为准别看到网帖说多少就默认多少。板上还有千兆PHY、调试串口、HDMI接口、USB接口等等。供电方面矿板原生使用12V输入通过板载DC-DC转换成各路电压有些版本用DC电源座有些版本直接用PCIe金手指供电。最需要注意的一点是没有板载JTAG调试器需要外接Xilinx Platform Cable USB II、Digilent JTAG-HS2/HS3或者兼容调试器。这块板的定位很明确——矿机控制板所以出厂时NAND里写的是矿机控制固件整个系统上电后会自动运行。PCB上没有原理图网上能找到的多是热心网友整理的点位图、跳线说明不一定和你手上这个批次完全一致。因此我的建议是拿到板子先别急着上电先用万用表和放大镜做一遍“摸底”搞清楚启动模式配置点在哪JTAG插座在哪电源入口是哪种然后再操作。1.2 ZYNQ的启动模式为什么一块板子会有“性格”Zynq-7000系列的启动过程由片内BootROM控制处理器复位释放后BootROM会在极短时间内采样一组专用引脚的电平这组引脚就是MIO[6:4]。这三个引脚的高低电平组合决定处理器从什么介质加载启动镜像。常见的组合关系如下JTAG为000QSPI为001NAND为010SD卡相关模式为100或101。需要注意不同资料里对SD模式的写法不完全一致最可靠的依据是Xilinx官方文档UG821。对于EBAZ4205矿板真正关心的是0、1、2这三组000是JTAG001是QSPI010是NAND。出厂默认设计就是010所以板子上电后BootROM直接去NAND里搬固件完全没你什么事。你可以把BootROM想象成电脑里的BIOS引导程序NAND启动相当于把系统盘设为硬盘QSPI启动相当于把系统盘设为板载SPI FlashSD启动相当于U盘启动而JTAG模式相当于不进任何系统盘静静等待外部调试器接管。这个类比看起来简单但实际操作中很多人会忽略一个关键点MIO[6:4]的电平只在复位释放瞬间被采样一次之后你在软件里怎么改寄存器都改不了启动介质必须通过硬件层面的跳线、电阻或飞线去改变这三个脚的电平然后重新上电或复位才生效。1.3 切换JTAG模式到底解决什么问题把EBAZ4205从NAND启动切到JTAG模式不是为了“让固件消失”而是为了调试阶段让BootROM跳过NAND把所有控制权交给主机端的Vivado和调试器。切换之后的直接好处有三个。第一NAND里的矿机固件不会再运行PS侧不会被莫名其妙的程序占用串口不会刷出矿机日志JTAG连接稳定得多。第二PL侧下载bitstream之后不会出现“下载成功但立刻被PS侧固件反复复位”的情况你写的逻辑可以稳定运行。第三调试裸机程序时FSBL和用户程序之间不会跟矿机固件产生冲突单步调试、断点设置都能正常工作。很多新手问是不是必须把NAND里内容擦掉才能切到JTAG不是。启动模式是纯硬件引脚电平决定的NAND里的东西可以完全不动。调试阶段用JTAG模式需要固化到NAND时再切回010模式两边互不干扰。这一点想通之后矿板用起来就跟普通开发板没太大区别了。2. JTAG模式切换前的硬件摸底2.1 准备工具和认识板卡关键位置在动任何跳线之前先把工具准备齐。我的建议清单如下Xilinx JTAG调试器原装Platform Cable USB II或者Digilent JTAG-HS3都行便宜的兼容线也能用但驱动的稳定程度会差一些。万用表最好是带通断蜂鸣档的查线序、测电平都靠它。杜邦线、镊子、细尖电烙铁用于处理只留了贴片电阻的启动模式配置点。12V直流电源电流建议2A以上矿板没有板载稳压电路只靠USB给调试器供电是不够的。USB转TTL串口模块用于观察BootROM和U-Boot的日志输出波特率通常是115200。这些工具里万用表和串口模块最容易被人忽略但恰恰是排查问题时最实用的。上电前我习惯先用万用表量一下12V输入接口的正负极避免电源极性接反烧板。矿板来源复杂有的被矿场泡过、烤过接口附近可能有残留物先清理再上电是基本原则。JTAG插座的位置一般在PCB边缘常见是10pin或14pin的2.54mm排针丝印会标JTAG、DEBUG或SWD之类。如果没有丝印就顺着板上调试器连接器附近的信号线找通常TCK、TMS、TDI、TDO这四根信号是走在一起的旁边大概率还有VCC和GND。实在找不到可以在网上搜对应批次的高清板卡照片对照PCB走线确认。2.2 启动模式引脚MIO[6:4]的定位方法MIO[6:4]这三位在芯片内部是PS侧的专用启动模式引脚在EBAZ4205这种拆机板上它们并不会像开发板那样引到一个醒目的拨码开关上。很多版本的矿板是把对应的上拉或下拉电阻直接做在PCB上通过0欧电阻或普通贴片电阻连接电阻位置往往在芯片附近或PCB背面。找它的办法有三个。第一看丝印运气好的板子会在焊盘旁边标注MIO4、MIO5、MIO6或者写成MIO[4:6]。 第二顺着Zynq BGA封装的引脚扇出走线找。这需要一点耐心但通常这些启动模式引脚会连到板边的排针或测试焊盘因为厂家在生产测试时需要调整启动介质。 第三参考网上已有的EBAZ4205点位图。很多玩家整理过不同批次的启动模式配置点位置可以对照自己板卡的PCB特征判断。找到之后要用万用表确认每个引脚的默认状态。MIO[6:4]010的意思是MIO6为0、MIO5为1、MIO4为0。测量时在板上电状态下测引脚对地电压大约3.3V是高电平1接近0V是低电平0。最好先记录默认状态再动手改动免得改乱之后想恢复却忘了原始接法。这里要特别提一句MIO[6:4]在系统运行后可以被PS侧复用为普通GPIO但复位采样的瞬间它们是专用的。所以不要试图用软件在读BootROM之前做任何配置所有修改都必须发生在复位释放之前也就是通过外部硬件完成。2.3 上电前检查供电、串口、JTAG连接EBAZ4205的供电坑我踩过两次必须单独说。第一板载DC-DC要求12V输入有些人拿5V的USB电源去试板子能亮但DDR初始化失败现象非常迷。第二矿板的12V输入走线很粗启动瞬间电流不小电源至少要能持续输出2A以上不然JTAG连接时调试器会把板子拖到欠压。第三插入JTAG调试器时调试器本身的电平要和板子匹配。Zynq的JTAG接口通常是1.8V或3.3V电平具体看板载电平转换电路如果调试器输出电平不对轻则连不上重则损伤器件。上电前把串口模块接好打开串口终端波特率设置115200。按正常流程上电后如果板子还在NAND启动状态串口会刷出矿机固件的启动日志或者至少能看到U-Boot阶段的输出。如果切到了JTAG模式串口应该是安静的没有任何打印因为BootROM在JTAG模式下不会加载任何执行代码。JTAG连接的检查也很简单断电状态下用万用表通断档量JTAG插座上TCK、TMS、TDI、TDO地引脚之间的连接确保没有虚焊、短路。然后把调试器一头连电脑、一头连板子打开Vivado Hardware Manager插上电源点击Auto Connect。如果能识别出xc7z020说明链路OK如果报错基本可以确定是启动模式或JTAG链路问题往下看排查部分。3. 从NAND启动切换到JTAG模式完整实操3.1 方案A使用跳线或拨码开关临时切换如果你的板子启动模式配置点是一组排针或者有拨码开关切换非常简单。以MIO[6:4]000为目标就是把三个引脚全部拉低对应拨码或跳线全部拨到0或GND那一侧。具体步骤先断电确保所有电源输入拔掉。然后找到启动模式配置点按照板子丝印或点位图确认MIO4、MIO5、MIO6对应的跳线位置。接着把三个跳线全部设为低电平也就是接地。这一步要小心有些板子的丝印顺序是反的看起来像是MIO4、MIO5、MIO6实际上排针顺序可能是MIO6、MIO5、MIO4接反之后会变成其他非预期模式一样进不了JTAG。设置完成后用万用表确认每个引脚确实接到了GND再上电。上电后观察两个现象串口终端没有输出说明BootROM没有执行NAND内容Vivado Hardware Manager里能看到xc7z020设备说明JTAG模式生效。这种临时切换方式的好处是可逆改回来只要把跳线恢复原样就行完全不动NAND内容适合日常调试。缺点是一些矿板根本没有跳线帽位置只有贴片电阻那就只能走方案B。3.2 方案B飞线强制拉低大多数EBAZ4205批次没有跳线只有几颗决定启动模式电平的电阻这个时候需要手动飞线。先找到MIO4、MIO5、MIO6对应的焊盘以及它们各自连接的上拉或者下拉电阻。出厂NAND启动的默认状态是010即MIO6低、MIO5高、MIO4低。要改成000需要把MIO5从高拉到低。操作前先断电用电烙铁把MIO5相关的高电平上拉电阻摘掉或者直接把MIO5焊盘飞线到GND。飞线时注意别把旁边的BGA焊盘搞短路建议先给焊盘上一点锡用细漆包线焊接然后万用表确认相邻引脚之间没有粘连。如果想要更稳定的临时方案可以选择不摘电阻直接在MIO5焊盘上飞一根线到GND。但因为上拉电阻还在MIO5会被同时拉高和拉低结果取决于电阻阻值和飞线的接地阻抗。大多数情况下上拉电阻阻值在4.7k到10k之间直接用导线接地可以压过低电平但这种方式不够干净我建议还是摘掉上拉电阻更可靠。飞线接好后上电测试。如果设备识别不到先别怀疑飞线检查一下是否还有其他启动相关引脚带了额外电路。EBAZ4205不同批次之间还有些细小差别有的板子MIO6上除了下拉电阻之外还会连到其他芯片这时候要顺着网络查一下。3.3 验证切换结果电流、串口、JTAG三重判断启动模式切换是否成功不能只看“好像没输出”最好做三重验证。第一重看电流。NAND启动时BootROM会连续读NAND芯片功耗有明显波动电源上的电流表数值跳变得比较明显。切到JTAG模式后BootROM停在原地等待调试器电流非常稳定。当然这个判断需要经验积累你没有对比数据的话可以通过观察电源指示灯是否忽明忽暗来判断。第二重看串口。NAND启动模式只要NAND里有合法固件头BootROM就会把第一级启动代码搬进OCM执行串口大概率会输出矿机固件日志如果NAND内容损坏串口也会有一些BootROM错误打印。切成JTAG模式后BootROM完全静默串口从开机到稳定一个字节的输出都不会有。第三重看JTAG设备列表。打开Vivado Hardware Manager点击Auto Connect如果看到目标设备xc7z020说明启动模式切换成功。三个条件都满足基本就可以放心往下调试了。这里给一个简单速查表检查项NAND启动JTAG模式串口输出有矿机日志或错误打印完全静默电流波动明显跳动稳定Vivado识别不稳定可能识别到后消失稳定显示xc7z020上电后行为自行运行NAND固件等待JTAG主机接管3.4 一直保持JTAG模式还是临时用切换成JTAG模式后这个状态掉电不丢失因为每次上电BootROM都会重新采样引脚电平你把引脚短接在GND上它就一直是JTAG模式。所以在调试周期内完全可以一直保持这个状态不用每次上电都重新改。但要注意JTAG模式下如果想测试NAND固化的一些功能比如U-Boot从NAND加载内核就要先把启动模式改回010否则系统不会自动加载NAND里的任何东西。一个比较实用的工作流是平时调试用JTAG模式确认程序没问题需要固化时切回NAND模式烧写烧完后断电再把模式切回JTAG继续下一轮调试。如果你担心改来改去把焊盘搞坏可以在确认引脚电平之后用排针引一个小的切换开关出来把MIO5做成可选择高或低的控制点这样后续切换就方便很多。我曾经在板子上留了一根飞线到一个小拨动开关调试时拨到低、固化后拨到高体验和正规开发板没什么区别。4. 在JTAG模式下完成第一次PS/PL调试4.1 通过Vivado加载bitstream启动模式切到JTAG后首先可以做最简单的PL侧验证。在Vivado里新建工程器件选择xc7z020clg400-1写一个简单的LED灯或引脚翻转逻辑生成bitstream。然后打开Hardware ManagerOpen Target之后会看到xc7z020设备。点击Program Device选择生成的bit文件下载完成之后PL侧逻辑就开始运行。这一步看似简单但很多矿板用户会卡在“设备识别到了但Program之后没有反应”。如果出现这种情况先确认板卡的PL时钟是否正常EBAZ4205的PL侧默认没有外部时钟输入如果你在工程里用了时钟需要从PS侧的PS_CLK或者其他引脚引入或者直接在Vivado里生成一个不需要外部时钟的纯组合逻辑验证。另外还要确认bitstream是否包含了正确的引脚约束矿板的引脚定义和常规开发板不一样不要套用网上的通用约束要根据自己板子上实际连到LED或排针的引脚来写。JTAG模式下载bitstream的优势在于PL侧不会再被NAND里的固件莫名其妙复位。之前在NAND模式下我也试过bitstream下载完成瞬间能工作但几秒后矿机固件开始访问外设PL逻辑就被干掉了感觉就像有人一直在按你的重启键。4.2 FSBL是什么为什么JTAG调试也绕不开它只下载bitstream只能验证PL逻辑如果你需要运行PS侧的ARM程序就必须面对FSBL。FSBL是First Stage Boot Loader它的核心工作是初始化PS侧的时钟、DDR内存控制器、MIO引脚然后把用户程序搬进DDR或者OCM里运行。在JTAG调试模式下FSBL同样不能省。因为Zynq上电之后PS侧的DDR控制器、PLL等外设都处于未初始化状态直接往DDR里加载程序一定会失败。有些人试过在SDK里Debug一个PS程序提示下载elf文件失败或者运行后卡在某个内存访问地址基本都是因为FSBL没有先执行。Vitis下比较简单的方法是在调试配置里选择“Launch on Hardware”工具链会自动加载FSBL、下载bitstream、再加载用户的elf文件整个过程不需要手动干预。如果你想手动复现也可以用Vivado先下载bitstream然后在Xilinx的调试工具里分别加载fsbl.elf和用户程序elf注意加载地址要匹配链接脚本FSBL一般运行在DDR起始地址附近用户程序可以放在更高地址或者由FSBL引导。FSBL在矿板上的另一个作用是它本质上是一个极简的裸机环境你可以通过修改FSBL源码来初始化自定义的DDR参数或GPIO但这属于后话新手阶段先用默认FSBL即可。4.3 如何在JTAG模式下访问NAND内容切到JTAG模式不代表不能碰NAND只是BootROM不会自动启动NAND里的程序。如果你想在JTAG模式下读取、擦除、烧写NAND常见做法有两条路。第一条路是使用Vivado/Vitis自带的Flash Programmer功能。在Hardware Manager连上设备后右键设备可以找到Add Configuration Memory Device或Program Flash相关选项按照NAND型号选择对应的存储器配置就可以通过JTAG直接对NAND进行操作。需要特别注意的是Zynq的NAND启动镜像要求头部带有BootROM能识别的引导头并且ECC校验算法要匹配不同NAND颗粒的页大小、块大小、ECC要求不一样选错型号会导致写进去之后无法从NAND启动。第二条路是先用JTAG加载一个裸机程序或U-Boot到DDR然后通过这个程序操作NAND。这种方法更灵活常用于恢复被写坏的NAND或者批量刷写。具体操作就是在Vitis里写一个NAND读写测试程序编译后用JTAG加载运行程序里把镜像写入NAND。U-Boot的话可以用Xilinx官方或社区编译好的u-boot.elfJTAG模式加载后进命令行用nand erase和nand write命令完成烧写。这两条路都“动NAND”所以我建议动手前先把原始NAND内容备份一份用Flash Programmer先读出来存成镜像文件后面怎么折腾都有后悔药。4.4 切回NAND启动怎么操作以及“假砖”的恢复调试完成想恢复NAND启动只要把启动模式配置点从000改回010就行。如果你用的是跳线或开关直接拨回去上电如果用了飞线方式拆掉飞线把摘掉的上拉电阻焊回去或者恢复原来的电阻配置再上电。切换回去后如果串口刷出矿机原有固件日志说明NAND里的东西还完好恭喜你的板子相当于在“普通开发板”和“矿机控制板”之间自由切换。如果切回去后串口没有任何输出那可能是NAND里的内容之前被破坏过或者当前批次NAND里本来就是空的。遇到“上电没有任何反应、JTAG还能连上”这种情况先别急着唉声叹气说变砖。这其实是“假砖”处理方式很简单把启动模式暂时切回JTAG让BootROM跳过NAND然后通过JTAG加载一个临时U-Boot或裸机程序再重新烧写NAND。真正的“硬砖”一般是指Zynq的加密熔丝被烧了或者DDR坏了这种概率很小矿板大多数故障都是软件层面恢复起来并不难。5. 常见问题与排查技巧5.1 “JTAG chain broken”或识别不到设备这是玩矿板最常遇到的问题现象是Vivado里Auto Connect后要么找不到设备要么设备出现一下然后报“JTAG chain broken”。原因通常有以下几个启动模式根本没切成JTAGBootROM在NAND模式自跑PS侧固件把JTAG链路干扰了JTAG线序接反TCK、TMS、TDI、TDO四根信号位置弄错调试器供电能力不足板子启动瞬间电流把JTAG电平拖垮了TCK时钟频率设得太高特别是用长线的劣质调试器。排查顺序建议是从硬件到软件。先用万用表确认JTAG四根信号的通断和线序然后用示波器或万用表确认TCK上有没有时钟跳变再检查板卡供电是否稳定。如果硬件都没问题就在Vivado Hardware Manager设置里把JTAG TCK频率降到1MHz甚至更低很多矿板的JTAG布线不会像开发板那样精心处理高频下更容易出错。还有一个冷门原因同时打开多个Vivado工程或硬件管理器导致调试器被其他进程占用。这种问题的典型现象是第一次连接成功第二次连接就开始报链断裂解决方法是彻底退出Vivado相关进程重新插拔一下调试器USB口再开Hardware Manager。5.2 启动模式已经切到JTAG但上电后串口还是刷日志有个朋友遇到一个有意思的现象明明把MIO[6:4]都拉低了上电串口还是有矿机日志刷出来。排查到最后发现他把板子上的切换点认错了改的是另一个测试点而不是真正的启动模式配置点。这种情况在矿板上太常见了因为板子丝印缺失光靠目测很容易找错位置。正确做法是不要依赖外观直接找到Zynq芯片对应的BGA扇出网络用万用表量到MIO4、MIO5、MIO6的实际引脚。另一个方法是用一个已知能用的程序来做“反向确认”把三个引脚分别做成全高、全低观察串口是否出现对应的BootROM错误比如NAND模式下你有没有连接NAND颗粒BootROM会报NAND初始化失败如果报错内容和模式对应上了说明你找对了地方。另外还要注意一个细节有些矿板在MIO[6:4]上还挂了其他芯片比如扩展IO芯片或调试脚当你把MIO5拉低时其他芯片可能也在驱动这个引脚导致最终采样值不是你设定的值。这种情况需要找到挂在同一个网络上的所有器件把多余的驱动源隔离掉比较直接的方式是切断与MIO5相连的上拉电阻而不是简单飞线到GND。5.3 JTAG连接成功但烧写NAND总是失败在JTAG模式下通过Vivado的Flash Programmer烧写NAND最常见的问题是“验证失败”或“Address out of range”。这个问题的根源多半是NAND型号选错或是操作地址越界。EBAZ4205不同批次的NAND颗粒容量和页大小不同有些是32MB有些是256MBFlash Programmer里选择存储器型号时如果按照网帖默认的型号去选很可能与实际颗粒不匹配导致烧写过程中计算出的块地址、页地址全部错位。我的建议是在上电前把NAND颗粒表面的丝印拍下来放大看根据丝印字符去查对应的datasheet然后在Flash Programmer里手动输入参数不要直接套默认配置。如果确认型号没错但烧写还是失败可以把TCK频率降低再试有些矿板的NAND数据线旁边有比较多灰尘或氧化高速读写时容易出错。另外NAND烧写前最好先做一次全片擦除有些旧固件残留的坏块标记会影响镜像写入的位置规划。5.4 网上那些“could not stop”报错别直接往Zynq上套搜索矿板问题的时候你会频繁看到各种“could not stop cortex-m device”之类的报错这其实是STM32调试器报的问题跟Zynq矿板没有任何关系别被误导了。Zynq在JTAG调试时如果出现类似“cant halt CPU”或“processor not running”的提示原因通常是目标设备没有进入可调试状态。在JTAG模式下只有BootROM启动到JTAG等待状态时ARM核才处于可控状态如果程序里关了调试接口或者启动后PS侧固件重新配置了MIO功能调试器就会失去对CPU的控制。处理办法是先按一下板子上的PS复位按键或者把PROG_B引脚拉低再释放让Zynq重新进入复位流程此时BootROM重新采样启动模式如果还是JTAG模式调试器理论上就能重新接管。调试器失去控制的另一个常见原因是FSBL或应用程序把JTAG调试相关的安全设置改了比如使能了安全启动或调试锁定这种情况下单纯复位可能没用需要检查工程里的配置。对于矿板玩家来说只要没有动过eFUSE基本不会遇到“永久锁死”的情况但凡能通过复位恢复的都算软件问题耐心排查就行。6. 写在最后我在矿板上踩过的几个坑前前后后经手了好几块EBAZ4205最大的体会就是“没有原理图不是不能玩而是每一步都得留退路”。刚开始我拿到板子第一件事就是天真地想从NAND里把矿机固件读出来研究结果那次操作因为Flash型号选错直接搞乱了NAND分区折腾了一晚上才用JTAG重新刷回来。所以我现在给朋友的建议永远是拿到矿板的第一天先切到JTAG模式把NAND完整备份一次存到电脑里后面随便再怎么折腾都有底牌。另外想提醒一句矿板虽然是拆机件价格便宜但它的PCB布局和供电设计是为矿机7x24小时运行准备的很多地方对维修和调试并不友好。操作时尽量用防静电镊子焊接时温度不要太高飞线不要横跨DDR区域这些习惯能让你少买好几块“尸体板”。EBAZ4205的性价比确实高前提是你愿意花时间去摸清启动模式的脾气等这一步搞定它就是一块非常趁手的Zynq开发平台。