什么是JTAG

JTAG是IEEE标准(1149.1),开发与1980年代。真早。早期的JTAG用于大批量电路板的检测。TAG通过四个端口来检测电路板中ICs的PIN脚。通过TDI输入与TDO输出,各芯片形成所谓的JTAG-chain。这样一来,通过传输数据,就可以确认芯片各引脚的链接正确与否,此种方法就是传说中的”IC Boundary test”.
但随着技术发展,JTAG也不仅仅只用于IC边界测试。还用于debug、通过JTAG来设置FPGA。JTAG可以通过

  • Parallel (printer) port
  • USB port
  • Ethernet port

来连接PC。最简单的控制是采用·Parallel (printer) port。

一个并行端口可以视为是计算机的一个12位输出以及一个5位输入的端口。当然JTAG只需要3位输出,1位输入即可。

从C语言的角度,控制JTAG很简单。例如控制TCK,代码如下:


#define lpt_addr 0x378

#define TCK 0x01

 

void toggle_TCK()

{

outport(lpt_addr, 0);

outport(lpt_addr, TCK);

outport(lpt_addr, 0);

}

jtag

其中TCK是时钟信号。在每一个JTAG芯片里都有一个TAP控制器。就如上图,CPU和FPGA中各有一个TAP控制器,而TAP控制器是一个具有16个状态的状态机。而TMS就是控制TAP控制器的信号。

tap-controller

这就是TAP控制器的状态机。在这个状态机中最重要的两个状态即是:Shift-DR Shift-IR两个状态。这两个状态用于组成JTAG-chain。以IR(instruction register)为例。每个IC中的TAP控制器选择IR状态。接着你就可以往这个IR寄存器里写指令控制JTAG。

jtag-example

从软件角度,这个过程可以表示成如下代码:


// Because the bits are shifted through in a chain, we must start sending the data for the device that is at the end of the chain

// so we send the 10 FPGA IR bits first

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);

 

// then send the 5 CPU IR bits

JTAG_clock(0);

JTAG_clock(0);

JTAG_clock(1);

JTAG_clock(0);

JTAG_clock(0 | TMS); // last bit needs to have TMS active (to exit shift-IR)

这段代码将00100 送入CPU中的IR寄存器中,而把0000000010 送入FPGA中IR寄存器中。

这样一来就可以利用JTAG进行DEBUG或者设置芯片了。例如可以利用BYPASS模式来计算JTAG链上芯片的个数。

以上,是我在http://fpga4fun.com/JTAG.html这里学习的笔记。

发表评论

电子邮件地址不会被公开。 必填项已用*标注