一种基于CPLD的高速JTAG调试器的设计与实现
2014-08-07张红余建
张红余建
(常州信息职业技术学院电子与电气工程学院 江苏常州 213164)
0 引言
随着信息技术的发展,越来越广泛地用到嵌入式处理器。通常,嵌入式处理器上运行的操作系统都没有完善的调试软件,需要通过主机来控制才能进行调试。由于嵌入式处理器千差万别,这就导致每一个SOC芯片都需要移植操作系统。工程师通常使用JTAG接口来调式操作系统而使其能正常工作。
最初,设计JTAG作为芯片的边界扫描接口。后来有厂商开始在嵌入式处理器内部集成调试控制模块,该模块可以用来控制CPU的停止和单步执行,而JTAG接口就用来作为主机和这个调试控制模块的通信接口[1-2]。通常把这个调试控制模块称为OCD,而把JTAG接口控制模块称为TAP(TEST ACCESS PORT)。图1所示的是一个完整的基于JTAG的调试方案。
图1 JTAG调试方案
主机用来运行调试软件,调试软件通过USB等接口与JTAG协议转换器通信。JTAG协议转换器则用来将调试软件发送的调试命令转换为对TAP控制器的控制信号并控制OCD模块来调试CPU。
本文主要研究图1中的JTAG协议转换器,用来实现USB到JTAG的信号转换。主机软件则采用开源的GDB调试器。
1 系统设计
JTAG接口总共包括5个信号TCK,TMS,TDI,TDO和TRST:其中4个是输入信号,另外1个是输出信号接口。作用如下:
Test Clock Input(TCK):为TAP提供一个独立的时钟,TAP的所有操作都基于这个时钟。
Test Mode Select Input(TMS):TMS信号用来控制TAP状态机的转换,TMS信号在TCK的上升沿有效。
Test Data Input(TDI):TAP的数据输入接口,在TCK的上升沿有效。
Test Data Output(TDO):TAP的数据输出接口,在TCK的下降沿有效。
Test Reset Input(TRST):TAP复位控制输入。
JTAG协议转换器通过对TMS信号的控制,可实现
TAP状态机的转换[3],状态转换如图2所示:
图2 TAP状态机
图2中状态转换发生在TCK信号上升沿,根据TMS信号处于0或者1状态来进行相应的状态转换。
根据JTAG协议,TAP定义了2个寄存器,分别是数据寄存器和指令寄存器。当TAP处于Shift-DR和Shift-IR状态时,可分别实现对TAP数据寄存器和指令寄存器的编程。根据不同的TAP指令,可实现对OCD的控制,进而实现对CPU的控制。
为提高通信的效率,JTAG协议转换器需要实现宏指令到JTAG信号的转换。也就是,主机调试软件只发送一个状态切换或者移位等的高级操作命令,JTAG协议转换器负责将这个高级操作命令转换为一连串 TCK,TMS,TDI,TDO 等的信号。
本文采用FT245BM+MAX II EPM570 CPLD来实现USB接口到JTAG接口的信号转换。FT245BM用来实现USB接口到8bit并口的信号转换。CPLD则用来读取8bit并口给出的宏指令,解析宏指令产生JTAG控制信号,并将从JTAG接口读取到的数据通过8bit并口返回给主机。宏指令的格式定义如图3所示:
图3 宏指令格式
一条宏指令由8bit组成,低4bit为命令部分,高4bit为参数部分。即图3中,CCCC为命令部分,PPPP为参数部分。具体命令定义如下:
0000:设置时钟分频器,参数为0表示不分频,参数为1表示2分频,参数为3表示4分频。
0001:设置 TAP状态,参数部分为需要设置到的TAP状态值,如图2所示。
0010:得到当前的TAP状态
0011:TAP软复位
0100:TAP硬复位
0101:设置TAP移位的大小端模式
0110:读取n比特
根据以上需求,系统设计框图如图4所示:
当RXF#信号为低时,CPLD可以读取Data信号得到新的宏指令并产生JTAG信号。如果宏指令为移位指令,则CPLD需要将移出来的数据写回FT245BM。当TXE#为低时,CPLD将数据放到Data总线上并产生一个WR信号高到低的跳变来将数据写回FT245BM[4]。当主机软件查询到FT245BM有数据需要返回时,通过USB的读端点读取CPLD送回来的数据。
图4 系统设计框图
2 CPLD设计
CPLD逻辑设计采用状态机设计。状态机由6个状态组成,如图5,分别为:ReadByte,ProcessByte,ShiftOutNBits,WriteByte,WaitTapSM,SoftResetTap。ReadByte状态时,通过检查RXF#信号来判断是否有下一个1Byte的并口数据,如果有则读取这8bit数据,并根据当前是否是命令的处理的第2阶段来决定跳转到ProcessByte或者ShiftOutNBits状态。如果是前一个命令的第2阶段,则跳转到ShiftOutNBits状态。否则,跳到ProcessByte状态。
图5 顶层状态机
ProcessByte状态时,根据读取到的8bit宏指令的命令部分进行跳转,如果是复位指令,则跳转到ResetTAP状态。如果是设置TAP状态指令,则跳转到WaitTapSm状态。如果是得到当前TAP状态指令,则跳转到WriteByte状态。如果是读取n比特命令,则跳回ReadByte状态,并将命令状态设置成第二阶段。
ResetTap状态调用TAP状态机产生TAP信号,使得目标TAP转移到Reset状态。WaitTapSm状态则调用TAP状态机产生TAP信号,使得目标TAP转移到宏指令参数部分设置的状态[5]。
ShiftOutNBits首先调用TAP状态机将TAP目标状态设置为Shift-DR或者Shift-IR状态。然后继续调用TAP状态机将读取到8bit数据移出。结束之后将移回来的8bit数据暂存到寄存器中,并跳转到WriteByte状态,等候WriteByte状态将该8 bit数据写回主机。
3 实验结果
为验证CPLD设计的正确性,本文搭建了系统仿真测试平台,如图6所示:
图6 仿真平台
根据宏指令格式,FT245BFM产生一组测试序列,首先设置TAP状态到ShiftDR,然后发送读取
8bit命令,之后设置TAP状态到IDLE,宏指令序列如下:
0x41,0xf6,0x11
仿真波形见图7:
图7 仿真波形
从仿真波形可知,DUT正确执行了宏指令,并给出了正确的TAP信号。
db[7:0]给出了第一个0x41的命令,经过4个tck时钟,Tap的状态 tap_state[3:0]的变化为1,2,3,4。根据图2的TAP状态机可知状态变化是正确的。当前状态已经转移到Shit-DR。
db[7:0]给出了第二个0xF6的命令,根据宏指令设计格式,这个命令是读取8bit命令。然后db[7:0]给出8比特数据0x55。TAP信号出现了8个tck,并且tdi给出01010101的波形。由于TAP的工作模式是进一个比特就对应的移出来一个bit,所以进去的01010101就把TAP内部的初始值00000000给移出来,最后db[7:0]上就出现了移出来的0x0数据。在移出最后一个比特数据时,Tms信号被置高,tap_state[3:0]状态从 Shift-DR转移到 Exit1-DR,也就是状态5。
db[7:0]给出的第三个命令是0x11。根据图2状态机,从Exit1-DR状态可以经过4个tck时钟,从Parse-DR,Exit2-DR,Update-DR状态最后转移到Run-IDLE状态。因此,tap_state[3:0]的状态值序列为 6,7,8,1。
4 结束语
本文设计的JTAG调试器可应用于ASIC硬件验证以及嵌入式系统软件的调试。相比以往基于FT232芯片设计的调试器,速度可以提高10倍以上,可稳定工作于20 MHz的频率下。该解决方案的应用,必将为广大嵌入式工程师以及ASIC工程师提供更好的工具并提高效率。
[1] 周金,张景璐.一种嵌入式系统实现的JTAG调试器[J].电子技术应用,2006(11):69.
[2] 胡倩,杨景常.基于JTAG协议的ARM调试接口设计[J].西华大学学报:自然科学版,2007(2):39.
[3] 殷伟凤.基于JTAG的ARM嵌入式系统调试技术实现及应用[J].浙江万里学院学报,2009(2):17.
[4] 曾强,赵娟,魏林,等.基于FT245的Linux USB驱动的设计[J].光电技术应用,2011(1):70.
[5] 常志恒,尚铁军,史顺波.基于JTAG的片上调试器与调试系统的设计实现[J].计算机工程与应用,2012(30):78-82.