3、JTAG与编程器:JTAG协议基础、常用编程器(如USB-Blaster)的使用、边界扫描测试

做CPLD开发这么多年,我敢说JTAG是咱们打交道最多的接口之一。别看它只有4根线,背后藏着不少门道。今天咱们就把JTAG协议、编程器使用和边界扫描测试这三块内容彻底聊透。

3.1 JTAG协议基础——这4根线到底在干什么?

JTAG的全称是Joint Test Action Group,说白了就是联合测试行动组搞出来的标准。它最初是为了解决电路板测试难题而生的,后来被Altera、Xilinx这些厂商拿来做FPGA/CPLD的配置接口。

JTAG接口就4根信号线,我列个表给你看:

信号名 全称 方向 作用
TDI Test Data In 输入 数据从编程器流入芯片
TDO Test Data Out 输出 数据从芯片流出到编程器
TCK Test Clock 输入 时钟信号,同步所有操作
TMS Test Mode Select 输入 控制状态机跳转

嗯,这里要注意——JTAG本质上是一个状态机驱动的串行协议。TMS信号控制状态机在16个状态之间跳转,TDI和TDO则在特定状态下完成数据移位。

核心概念:JTAG链路上可以串联多个器件。每个器件内部有一个指令寄存器(IR)和多个数据寄存器(DR)。通过TMS控制状态机,我们可以选择访问哪个寄存器,然后通过TDI/TDO进行数据读写。

我在项目中遇到过一个问题:板子上串了3个CPLD,结果第二个器件死活识别不到。查了半天,原来是第二个器件的TDO虚焊了。你想想看,JTAG链路上任何一个节点的TDO到下一个节点的TDI断了,整条链就断了。

3.2 JTAG状态机——16个状态怎么玩?

JTAG状态机有16个状态,但常用的其实就几个。我画了个简化的状态图,你一看就明白:

JTAG状态机核心路径 Test-Logic-Reset Run-Test/Idle Select-DR-Scan Select-IR-Scan Capture-DR Shift-DR Capture-IR Shift-IR Update-DR Update-IR 复位/空闲 选择路径 数据寄存器操作 指令寄存器操作

实际编程时,我们最常用的路径是:Test-Logic-Reset → Run-Test/Idle → Select-DR-Scan → Capture-DR → Shift-DR → Update-DR。这条路径用来读写数据寄存器。指令寄存器操作类似,只是把DR换成IR。

小技巧:我个人习惯在每次操作前先让状态机走一遍Test-Logic-Reset,确保状态机处于已知状态。TMS连续拉5个TCK高电平就能强制回到复位状态,这个操作百试百灵。

3.3 常用编程器——USB-Blaster到底怎么用?

说到编程器,USB-Blaster绝对是Altera/Intel生态里最经典的。它本质上是一个JTAG协议转换器,把USB信号转成JTAG时序。

USB-Blaster的核心参数:

参数 说明
接口类型 USB 2.0 兼容USB 1.1
JTAG电压 1.8V / 2.5V / 3.3V / 5V 自动适配目标板电压
最大TCK频率 24MHz 实际建议用6MHz以下
支持器件 Altera/Intel全系列 CPLD/FPGA/SoC

使用USB-Blaster时,我建议你注意这几点:

  • 驱动安装:Windows下需要安装Altera USB-Blaster驱动,Linux下通常用libusb驱动。我曾经在Win10上折腾了半小时驱动,最后发现是数字签名问题。
  • 连接线序:10针JTAG接口的线序是固定的,1脚是TCK,2脚是GND,3脚是TDO...千万别接反了。我见过有人把TDI和TDO接反,折腾一整天没找到原因。
  • TCK频率:不是越高越好。线缆长了或者板子干扰大,高频容易出错。我一般先用1MHz调试,稳定了再往上提。

警告:USB-Blaster的VREF引脚是检测目标板电压用的,不是供电引脚!千万别想着用USB-Blaster给CPLD供电,电流不够,还会烧坏编程器。我曾经...嗯,不提了,反正后来换了个新的。

3.4 边界扫描测试——不跑代码也能测硬件

边界扫描测试(Boundary Scan Test,BST)是JTAG最原始的应用场景。它可以在不运行任何代码的情况下,测试芯片引脚和板级连接。

原理其实很简单:每个芯片引脚内部都有一个边界扫描单元(BSC),这些单元串联成一个移位寄存器链。通过JTAG接口,我们可以:

  • 捕获(Capture):读取引脚当前的电平状态
  • 更新(Update):强制设置引脚输出电平
  • 移位(Shift):把数据串行移入或移出

我在项目中用过边界扫描测试来排查焊接问题。有一次板子回来,CPLD和Flash之间的连接不通。用万用表量了半天没找到问题,后来用边界扫描测试,给CPLD的Flash接口引脚强制输出高电平,然后读Flash那边的引脚状态——发现有个地址线是低电平。一查,原来是PCB走线断了。

实用命令:在Quartus II中,通过Tools → JTAG Debugger → Boundary Scan可以打开边界扫描界面。选择SAMPLE/PRELOAD指令可以读取引脚状态,选择EXTEST指令可以强制输出。

边界扫描测试的典型流程:

  1. 连接USB-Blaster到目标板,打开Quartus II Programmer
  2. 点击Auto Detect,自动识别JTAG链路上的器件
  3. 选择目标器件,右键选择Boundary Scan
  4. 在Boundary Scan编辑器中,选择要测试的引脚
  5. 设置期望的输出值,执行EXTEST指令
  6. 读取实际引脚状态,对比期望值

你想想看,这个功能对于调试硬件问题有多方便。不用写一行代码,不用跑任何逻辑,就能知道每个引脚的电平状态。说白了,边界扫描就是给硬件工程师准备的"示波器"。

3.5 实际调试中的避坑指南

做JTAG调试这么多年,我踩过的坑不少。分享几个典型的:

避坑1:JTAG链路上如果有多个器件,每个器件的TCK和TMS是并联的,TDI和TDO是串联的。千万别把TDI和TDO搞混了。我曾经在原理图上把TDI和TDO标反了,板子回来才发现,只能飞线解决。

避坑2:CPLD的JTAG引脚默认是专用引脚,但有些型号可以配置成普通IO。如果你发现JTAG识别不到器件,先检查一下是不是在代码里把JTAG引脚复用了。我有个同事就因为这个查了三天。

避坑3:TCK频率不要设太高。线缆长了信号会衰减,频率高了容易误码。我一般遵循"1米线缆用1MHz,0.5米用6MHz"的经验法则。

好了,JTAG这部分内容就聊到这儿。记住一句话:JTAG是CPLD调试的"生命线",用好它,你能省下至少一半的调试时间。

核心总结:

  • JTAG是4线串行协议,通过状态机控制数据读写
  • USB-Blaster是最常用的编程器,注意电压匹配和TCK频率
  • 边界扫描测试可以在不运行代码的情况下测试硬件连接
  • 调试时优先检查JTAG链路完整性,再排查其他问题

公众号:蓝海资料掘金营,微信deep3321