1、最简单的JTAG硬件线
TMS:测试模式选择信号,输入,IEEE 1149.1标准强制要求。
TCK:测试时钟信号,输入,IEEE 1149.1标准强制要求。
TDI:测试数据输入信号,输入,IEEE 1149.1标准强制要求。
TDO:测试数据输出信号,输出,IEEE 1149.1标准强制要求
2、工作原理
2.1 JTAG的最简单连接方式
2.2 JTAG状态机
TAP控制器有16个状态,控制器的下一个状态由TMS信号决定,TMS信号在TCK的上升沿被采样生效。状态机的转移关系如下图所示。
2.3 数据/指令传输
每个IC都有自己所属长度的IR寄存器(指令寄存器)。比如图中CPU的IR长度是5,FPGA是10。这些IR寄存器组成联调通过TDI和TDO。
从PC端来看,IR链的长度就是15,为了装载IR的值,PC必须先保证TAP的状态是Shift-IR,然后才能通过TDI发送这15bit的数据。比如,要分别发送00100到CPU的IR,0000000010到FPGA的IR,这操作是:
JTAG_clock(0);
JTAG_clock(1);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(0);
JTAG_clock(1);
JTAG_clock(0);
JTAG_clock(0);
FPGA的指令可以有1024种,CPU的指令可以有32种。但是在JTAG情况下,存在一些强制的指令,(BYPASS,EXTEST,SAMPLE/PRELOAD,IDCODE(不是必须的,常常有)),每一个IC的IR指令往往不一样。
DR寄存器(数据寄存器)传输也是一样的。
2.4 BYPASS模式
此模式下,IC通过TDI接收到的数据迟延1个clk再从TDO转出去。比如查看JTAG链上一共有多少个IC器件。
// go to reset state
for(i=0; i<5; i++) JTAG_clock(TMS);
// go to Shift-IR
JTAG_clock(0);
JTAG_clock(TMS);
JTAG_clock(TMS);
JTAG_clock(0);
JTAG_clock(0);
// Send plenty of ones into the IR registers
// That makes sure all devices are in BYPASS!
for(i=0; i<999; i++) JTAG_clock(1);
JTAG_clock(1 | TMS); // last bit needs to have TMS active, to exit shift-IR
// we are in Exit1-IR, go to Shift-DR
JTAG_clock(TMS);
JTAG_clock(TMS);
JTAG_clock(0);
JTAG_clock(0);
// Send plenty of zeros into the DR registers to flush them
for(i=0; i<1000; i++) JTAG_clock(0);
// now send ones until we receive one back
for(i=0; i<1000; i++) if(JTAG_clock(1)) break;
nbDevices = i;
以CPU和FPGA为例,时序示意如上图,逻辑是先清空了每个IC中DR的数据为0,当PC发送1时,CPU收到1,延迟1个clk再发出去(TDO_cpu),FPGA收到TDO_cpu的信号后,延迟1clk再发出去,则PC从TDO_fpga上收到1时,已经过了2个clk,因此知道IC的个数就是nbDevices (2)。