恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
用JTAG读IDCODE:新板卡芯片型号识别与链路排查实战
首页
资讯中心
/
用JTAG读IDCODE:新板卡芯片型号识别与链路排查实战
用JTAG读IDCODE:新板卡芯片型号识别与链路排查实战
发布时间:2026/9/24 11:58:23
拿到一块板卡丝印磨损、原理图丢失、芯片型号不确定这种情况在电子调试里太常见了。尤其FPGA板卡同系列不同容量的芯片外观几乎一模一样靠眼睛根本分辨不出来。这时候JTAG接口和IDCODE就是最可靠的突破口——不用跑任何代码不用加载bitstream只要芯片上了电、链路是通的JTAG就能把芯片的“身份证号”读出来型号、厂商、版本一次性确认。这篇文章就把这套思路和完整流程拆开讲透从原理到接线、从Vivado到Quartus和OpenOCD最后附上常见问题和排查经验不管你是刚入门FPGA还是已经调过几块板子都能照着操作。1. 为什么新板卡上手第一步是读IDCODE1.1 IDCODE是什么JTAG协议里的“身份证”IDCODE全称是Identification Code属于IEEE 1149.1标准也就是大家常说的JTAG标准里规定的一个只读寄存器。它的长度固定为32位芯片厂商在流片时就把它写死在硅片里了用户没法改、也没法擦除。你通过JTAG的TDI/TDO移位链路可以随时把它“搬”出来看。关键的一点是读取IDCODE完全不依赖FPGA的用户逻辑。也就是说哪怕芯片里没有任何bit文件、FPGA处于未配置状态只要芯片供电正常、JTAG链路畅通它就能老老实实回答“我是谁”。这跟PC上插一个未知硬件后在设备管理器里看到“硬件ID”是一个道理——操作系统都不用装驱动设备ID已经在那边了。这条特性在板卡调试里价值非常大。因为很多情况下我们拿到的是一块“沉默”的板子没有代码、没有文档、甚至不确定芯片是否焊接完好。IDCODE就成了第一个活着的信号它告诉你芯片在不在线、厂商是谁、具体型号是哪一款相当于板卡调试的第一块敲门砖。1.2 什么时候需要靠IDCODE认芯片我总结了一下下面这几类场景基本都绕不开IDCODE二手板卡或库存散件丝印被磨、标签脱落、表面被散热片盖住肉眼无法判断型号。原理图不完整或标注错误PCB上印的型号和实际焊接芯片不一致或者遇到替代料、兼容料丝印A但实际是B。同系列大小容量混淆很多FPGA系列里比如某厂商的同一封装下有好几种容量等级外观上完全无法区分只能靠IDCODE认。远程支持与诊断帮同事或客户远程看问题你没法打开机箱看丝印让对面用烧录器读一下IDCODE最快。验证JTAG链路是否正常新设计的板卡第一次上电先不跑业务先扫一下JTAG链确认芯片没有被焊错、链路没有断线。可以说读IDCODE是一个“成本极低、信息量极高”的操作。它不需要任何成熟的固件不依赖FPGA内部逻辑甚至不需要JTAG下载器有多高级——只要能产生JTAG时序的工具就行。2. 动手前准备JTAG连接、电平匹配与链路检查2.1 JTAG五个核心信号线的定义与接法读取IDCODE之前先把JTAG本身的物理连接搞明白。JTAG标准最少需要四根信号线加上地线一共五根信号全称方向作用TCKTest Clock主机到目标测试时钟所有移位操作都由它驱动TMSTest Mode Select主机到目标切换JTAG状态机状态TDITest Data In主机到目标串行数据输入进入指令寄存器或数据寄存器TDOTest Data Out目标到主机串行数据输出芯片把寄存器内容移出来GND地公共参考地必须可靠连接有些板子上还会有nTRST测试复位和nSRST系统复位两个可选信号但读IDCODE不需要它们标准过程里只要TCK/TMS/TDI/TDO/GND齐了就能干活。市面上最常见的JTAG连接器是2×7的14针排针各厂商引脚定义略有差异。以Xilinx平台电缆和很多开发板通用的定义为例引脚信号引脚信号1TCK2GND3TDO4VREF5TMS6nSRST7未连接8nTRST9TDI10GND11未连接12GND13未连接14GND注意第4脚VREF这个不是电源输出它只是从目标板引出一个参考电平让下载器感知目标板IO电压以便匹配逻辑电平。所以千万别把VREF当成供电口去接。2.2 电平、线缆与供电的三个关键检查连接JTAG线之前有非常多地雷。我踩过的坑集中在这几个地方第一是电平匹配。现代FPGA的Bank电压五花八门1.8V、2.5V、3.3V都有。下载器一般能自动适配但前提是你把VREF接到了对应电压上。如果VREF悬空或者接错轻则扫描不到芯片重则把JTAG引脚打坏。这一点在做定制板卡时尤其要谨慎。第二是线缆长度。JTAG对信号完整性有一定要求TCK频率越高线越长越容易出问题。自己飞线调试的时候尽量把线控制在10cm以内不要用杜邦线去接半米长的排线。如果板卡结构限制必须走长线可以把TCK频率降下来。Vivado里可以设置连接器的TCK频率默认一般是10MHz或6MHz调试期我习惯降到3MHz以下Quartus里也有类似选项。第三是供电确认。读IDCODE的前提是芯片已上电但很多人会把“JTAG线接上了”和“芯片有电了”混为一谈。有些JTAG下载器的VREF脚或VTref脚电平够不代表FPGA内核电源就到位了。FPGA的JTAG TAP逻辑通常由VCCO和VCCINT供电只要其中一路有问题IDCODE读数就可能异常。所以上电后先用万用表确认各路电压确实稳定再插JTAG线。注意读取IDCODE不需要配置FPGA目标板上不需要有bit文件但芯片必须正常上电并且JTAG链路要形成一个完整回环。2.3 链路闭合检查把JTAG当“回路”理解理解JTAG链路可以把它想象成一条“串行班车线路”。主机的TDI是起点顺着线把数据送到第一个芯片芯片内部处理后通过TDO送出来再进入下一个芯片的TDI最后从整条链的末端TDO回到主机。整条链路必须形成完整回路任何一点断开数据都回不到主机。在只有一个FPGA的板卡上TDI进入芯片、TDO出芯片芯片自己就把回路闭合了不需要外部短接。但如果JTAG链上有多个器件或者你只连接了目标板的一部分就要特别注意链上每个器件都得供电每个器件的TDO到下一个TDI的连接都得可靠否则扫描会卡住。判断链路通不通有个很朴素的经验读出来的IDCODE如果全是0xFFFFFFFF大概率是TDO悬空或者链路后端断开了如果读到全0或者固定不变的值可能TDI和TDO被意外短接或者扫描链配置与实际器件数量不匹配。这些现象放在后面“常见问题”部分再逐一展开。3. 实操用Vivado Hardware Manager读取FPGA的IDCODE3.1 硬件准备与连接Xilinx现在叫AMD的FPGA最顺手的工具是Vivado自带的Hardware Manager。硬件方面官方推荐的是Xilinx Platform Cable USB II也可以用Digilent的JTAG-HS3等兼容线缆。如果是国产开发板很多板载了FT232H或CMSIS-DAP方案的下载器Vivado也能识别为第三方cable。连接步骤很简单给目标板上电先确认核心电压和Bank电压正常。拔掉JTAG下载器把JTAG排线两端都接好再插到电脑USB口。打开Vivado不需要创建工程直接进入Hardware Manager。关于“先接JTAG再上电”还是“先上电再接JTAG”我的习惯是目标板断电的时候接好JTAG线然后给目标板上电。这样避免带电插拔导致瞬间电平冲突。USB下载器可以先插电脑也可以后插但和JTAG排线的物理连接建议在断电状态下完成。3.2 创建并打开Hardware TargetVivado里操作路径是Flow Navigator左侧最下方找到“Hardware Manager”点击后进入Open Hardware Manager界面。此时界面中间会有一个大大的“Open Target”按钮点击后选“Open New Target”。向导会依次问你几个问题选择远程或本地服务器默认Local server。选择Hardware Server保持默认。选择下载器这里会出现你电脑上识别的JTAG cable选中即可。然后点击NextVivado会开始扫描JTAG链。扫描过程通常几秒钟。如果链路正常Hardware窗口里会出现类似“xc7a35t_0”这样的设备节点前面的字母x一般代表Xilinx后面的数字就是具体型号系列和序号。看到这个节点说明JTAG链路没问题芯片已经被工具识别出来了。3.3 从扫描结果确认器件与IDCODEVivado识别出器件后默认在设备节点上右键菜单里能找到“Get Device IDCODE”之类的选项不同版本可能叫“Get Device Identifier”点击后弹窗会显示这个器件的完整32位IDCODE值。举个例子某块板卡上读到的IDCODE是0x0362D093对应的就是Xilinx Artix-7系列家族的某个器件。虽然底层具体是XC7A35T还是XC7A50T需要对照官方芯片手册里的IDCODE列表但至少厂商、系列已经确认。如果后续要下载bit或调试Vivado会按照这个IDCODE决定允许加载的器件类型所以在Hardware Manager里“Open Target”成功其实就已经意味着工具认可了这个IDCODE与当前工程的器件型号是匹配的。这里分享一个我自己常用的检查顺序扫描出设备后别急着加载bit先在右键菜单里把IDCODE复制出来和手里的板卡丝印、原理图对照一遍。很多时候板卡丝印写的是XC7A200T但实际焊的是XC7A100T这种事情在二手市场可不罕见。一旦加载bit时报“Device ID mismatch”那就是芯片换了料不是你的工程有问题。3.4 没有Vivado也能读用OpenOCD命令行扫描Vivado体积庞大如果只是想快速读取一个FPGA的IDCODE可以用更轻量的开源工具OpenOCD。配合FT2232H、FT232H这类USB转JTAG适配器命令行下一条指令就能搞定。以FT2232H适配器为例创建一个最小配置文件interface ftdi ftdi_vid_pid 0x0403 0x6010 ftdi_channel 0 ftdi_layout_init 0x0008 0x000b adapter_khz 1000 jtag newtap auto tap -irlen 2 -expected-id 0x00000000 init jtag scan_chain把这个文件保存为scan.cfg然后在终端执行openocd -f scan.cfgOpenOCD启动后会扫描JTAG链并把链上各个TAP的IDCODE打印出来。其中“-expected-id 0x00000000”的意思是不预设IDCODE让工具把所有能扫到的TAP都列出来。对于有些FPGAIR长度可能不止2位需要按实际芯片查一下但作为扫描IDCODE的第一步这个方法远比打开一个几个G的IDE快捷。4. 同一思路在不同工具链中的落地4.1 Intel/Altera Quartus的Auto DetectXilinx有VivadoIntel/Altera阵营则有Quartus。用Quartus读IDCODE同样很简单核心功能在Programmer窗口里。操作流程打开Quartus - Tools - Programmer - Hardware Setup先选择USB-Blaster等下载器关闭对话框。然后在Programmer窗口里点击“Auto Detect”按钮。软件会自动扫描JTAG链上的所有器件并尝试匹配型号。扫描出来的结果会以列表形式显示在设备区域里每个器件后面会有一个IDCODE列直接展示32位十六进制值。如果Auto Detect扫描后弹窗让你选择具体器件型号就说明扫描到了IDCODE但无法自动唯一匹配需要你根据IDCODE手动选一下。这种“半自动”情况也很常见因为同厂商不同型号可能共用部分IDCODE字段或者工具版本不够新不认识较新的器件。Quartus的Auto Detect还有一个隐藏好处它会自动检测链上器件的数量。如果板卡上有CPLD加FPGA串联或者多片FPGA级联Auto Detect能一次性识别出来这对确认整板JTAG拓扑很有用。4.2 国产FPGA工具链高云、紫光等国产FPGA这几年用得越来越多。高云的云源软件Gowin Programmer、紫光同创的PDS、还有安路、易灵思的软件基本上都提供了类似的IDCODE读取功能只是名字和入口略有差异。以高云的Programmer为例连接好下载器后软件界面里通常有一个“Auto Detect”或“Scan”按钮点击后可以识别出链上的器件型号和IDCODE。高云还有一点值得提它的Programmer支持读取器件的“Device Info”里面除了IDCODE还能读到一些器件特有的信息位对确认芯片版本很有帮助。用国产工具链的时候要注意有些下载器是专用协议不一定能用OpenOCD这类通用工具。如果手上只有厂商提供的下载器就用官方软件自带的扫描功能别折腾第三方方案反而浪费时间。4.3 延展场景Zynq SoC、MCU和“禁用JTAG”的坑IDCODE的概念不只适用于纯FPGA。在Xilinx Zynq SoC上JTAG链同时包含PS端ARM和PL端FPGA逻辑的TAP通过扫描链可以看到多个IDCODE。很多人在Zynq上固化QSPI Flash时会问“必须用DDR吗”其实IDCODE扫描这块跟DDR完全无关只要PS端的启动模式引脚和JTAG链路配置正确扫描就能正常进行。DDR只在你需要运行FSBL和应用程序时才有意义跟JTAG链路本身是两回事。MCU领域也经常遇到JTAG相关的坑比如STM32的JTAG引脚被复用成GPIO后会出现“SWD/JTAG Communication Failure”的错误。表面上看是“连不上芯片”实际是芯片内部调试接口被用户代码禁用了。这时候要靠硬件复位时序把芯片拉回调试模式或者用“连接前复位”的方式重新抢占调试口。同样道理如果FPGA的JTAG引脚被复用或未初始化扫描也会异常但FPGA的JTAG TAP一般是独立于用户逻辑的只要器件配置模式没被改动通常不会出现这种问题。5. 读懂IDCODE32位数据拆解开5.1 IDCODE字段结构逐位拆解拿到一串IDCODE光知道它是十六进制还不够还得能读懂里面的信息。IEEE 1149.1标准规定IDCODE是32位布局如下位段宽度含义Bit 31:284位版本号Version芯片不同步进(step)会变化Bit 27:1216位器件编号Part Number对应具体型号Bit 11:111位厂商编号Manufacturer由JEDEC分配Bit 01位恒为1JTAG标准要求LSB为1这里要特别注意JTAG数据的移位方向。IDCODE寄存器在串行移出时是最低位LSB在前也就是“先出来的是Bit 0最后才是Bit 31”。Hex显示时我们看到的都是按MSB到LSB排列的常规写法但如果你自己用示波器或逻辑分析仪抓TDO波形就要注意位序别把高低位搞反了。5.2 一个真实例子的解析拿上文中Vivado扫描到的0x0362D093来拆一下写成二进制0000 0011 0110 0010 1101 0000 1001 0011Version字段31:28 0000也就是版本0。Part Number字段27:12 0011 0110 0010 1101换成十六进制为0x362D。Manufacturer字段11:1 000 0100 1001也就是0x049。Bit 0 1符合标准。其中厂商0x049是Xilinx的JEDEC代码。器件号0x362D这类数值本身没有直观规律它更像厂商内部编码需要通过Xilinx官方文档或者工具自带的IDCODE列表来查。比如Xilinx 7系列设备手册里有一份完整的IDCODE列表按器件号、封装、步进排列。查到0x0362D093就能对应到具体的Artix-7型号。5.3 型号反查的实用渠道反查IDCODE最可靠的渠道是官方文档。Xilinx有专门的IDCODE列表文档Intel的AN系列应用笔记里也有类似内容高云的器件手册里会列出所有型号的IDCODE。除了翻手册还有一个我经常用的土办法直接在开发工具的安装目录里搜字符串。Vivado、Quartus的安装目录下通常有记录器件IDCODE的文本文件可能是xml、txt或者数据库文件。用文本搜索工具搜你读到的IDCODE值往往能直接定位到器件型号。这个方法在离线环境、手边没有手册的时候特别管用。另外JEDEC的厂商代码表也是公开的。在网上搜索“JEDEC Manufacturer ID”就能找到完整列表把IDCODE里的11位厂商代码拿出来对一下至少能知道是哪个厂商的芯片。哪怕这个芯片不是FPGA而是CPLD、MCU只要它支持JTAG这套解析方法都通用。6. 常见问题速查与避坑经验6.1 扫描失败/链路异常的排查路径现实中不可能每次都一次成功。下面这张表是我这些年调试遇到的典型问题的汇总按“现象-原因-排查方法”列出来照着走基本能解决九成问题现象可能原因排查方法设备管理器里看不到下载器USB驱动未装、下载器供电不足重装驱动换USB口用带供电的Hub试试Vivado/Quartus能看到Cable但扫不到器件JTAG接线错误、目标板未上电、VREF没接检查TCK/TMS/TDI/TDO/GND对应关系确认供电和VREFIDCODE全为0xFFFFFFFFTDO悬空、链路后端断开从链路末端往回查用万用表测TDO有没有到下载器IDCODE全为0TDI/TDO短路或扫描链配置错误断开TDI/TDO飞线测量确认链上器件数量Auto Detect弹出的型号与丝印不符板卡焊接实际型号与标称不一致或工具软件版本太旧不认识以IDCODE为准确认后反查型号扫描时好时坏不稳定飞线过长、TCK频率太高、接触不良缩短线缆降低TCK频率重新插拔排线多器件的链上只能识别出部分器件中间某个芯片没供电或TDO到TDI连线断检查JTAG链路中间节点供电和焊接排查JTAG问题时我有个原则先怀疑物理连接再怀疑软件配置。因为物理接触不良是最常见也最隐蔽的问题杜邦线松动、排针虚焊、下载器插头氧化各种意想不到的坑都有。用万用表通断档把TDI/TDO/TMS/TCK每条线都从下载器端量到芯片端基本能找到问题。6.2 读到的IDCODE与丝印不符怎么办你可能会遇到一种更“暧昧”的情况IDCODE能读出来但和板卡丝印对不上。这时候先不要急着下结论按优先级排查第一确认是不是版本号差异。同一个芯片型号硅片步进不同IDCODE里4位版本字段可能不同。比如丝印是A型号但芯片是第二版硅片版本号变了厂商代码和器件号不变。这种差异不影响功能兼容性只是步进不同。第二确认是不是封装或速度等级差异。同一系列的FPGA封装、速度等级不同但IDCODE可能完全一样。因为IDCODE只反映芯片的可编程逻辑配置和核心架构不包含速度等级这些参数。所以IDCODE相同不代表型号完全一致还要结合丝印上的速度等级后缀一起看。第三如果厂商代码都对得上但器件号查不到很可能你用的是新器件而工具版本太老、器件列表没更新。这时候去官网下载最新版软件或者查最新版手册一般都能解决。6.3 调试现场必备的三个小习惯最后分享三个我坚持了很久的调试习惯都是小事但在现场能省大量时间。习惯一让每块板卡都有一个“JTAG指纹档案”。新板卡第一次成功扫描后把IDCODE、扫描到的器件树、TCK频率设置、下载器型号记到一个表格里拍照归档。以后这块板卡再出问题翻档案马上能知道“正常时候长什么样”排查效率高很多。习惯二JTAG线缆上贴标签。尤其是大项目里几十块板卡叠在一起每根JTAG线都长一个样。多花两分钟贴个标签写着“板卡A-JTAG-1”后面调试维修少很多麻烦。习惯三养成上电前用万用表先测一遍关键电压的习惯。JTAG扫描失败时第一步不是怀疑下载器而是拿起万用表量VCCINT、VCCO、VREF三个电压。这三个电压正常再谈时序和链路问题。我用JTAG读IDCODE这件事已经变成拿到任何一块新板卡时的“开机动作”了。它不复杂、不需要工程文件、没有太多技术含量但在关键时刻能救命帮你确认芯片身份、验证链路好坏、缩小故障范围。从原理上讲通从工具上用熟从解析上搞懂这套技能基本就焊死在你脑子里了。以后再遇到“资料丢了、丝印没了、芯片不确定”的板卡至少你不会手足无措。