但随着技术发展,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,代码如下:
[c]
#define lpt_addr 0x378
#define TCK 0x01
void toggle_TCK()
{
outport(lpt_addr, 0);
outport(lpt_addr, TCK);
outport(lpt_addr, 0);
}
[/c]
其中TCK是时钟信号。在每一个JTAG芯片里都有一个TAP控制器。就如上图,CPU和FPGA中各有一个TAP控制器,而TAP控制器是一个具有16个状态的状态机。而TMS就是控制TAP控制器的信号。
这就是TAP控制器的状态机。在这个状态机中最重要的两个状态即是:Shift-DR Shift-IR两个状态。这两个状态用于组成JTAG-chain。以IR(instruction register)为例。每个IC中的TAP控制器选择IR状态。接着你就可以往这个IR寄存器里写指令控制JTAG。
从软件角度,这个过程可以表示成如下代码:
[c]
// 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)
[/c]
这段代码将00100 送入CPU中的IR寄存器中,而把0000000010 送入FPGA中IR寄存器中。
这样一来就可以利用JTAG进行DEBUG或者设置芯片了。例如可以利用BYPASS模式来计算JTAG链上芯片的个数。
以上,是我在http://fpga4fun.com/JTAG.html这里学习的笔记。
没有评论:
发表评论
谢谢您的留言^_^