我正在使用XUPV5-LX110T,我试图通过JTAG读取状态寄存器。我收到的数据不正确,但我不明白为什么。我似乎得到全部为零。
我怀疑它与JTAG链的顺序有关,但我不确定如何调整我发送的命令的顺序。
我知道TMS坑会改变链上所有设备的状态,但是当它是链中的最后一个设备时,如何将数据转移到FPGA?
答案 0 :(得分:4)
我实际上在同一台设备上工作过。如果我是正确的,当您查看iMPACT中的JTAG链时,您应该看到5个设备:两个PROM,一个SystemAce和一个CPLD,然后是Virtex 5作为链上的最终项目。像这样:
PROM - > PROM - > SysAce - > CPLD - > Virtex5
为了成功读取状态寄存器,您需要了解TAP控制器的工作原理:
JTAG State Machine http://www.fpga4fun.com/images/JTAG_TAP.gif
如您所说,TMS信号连接到JTAG链上的所有设备。也就是说,如果您处于测试逻辑复位状态并发送0 1 1 0 0,则所有设备现在都将处于Shift-DR状态。
接下来,您将想知道JTAG链上所有器件的指令寄存器的大小。在这种情况下,两个PROM的IR大小为16位。 SysAce和CPLD的IR大小为8位。您想知道这些尺寸,以便了解向下移动的数据量。 Virtex 5的IR大小为10位。
使用JTAG的最后一个技巧是注意,当发送命令时,它们首先在TDI LSB上传输。但是,将数据转移到DR中首先是MSB。请务必检查Virtex 5 Configuration Guide
中的哪个方向使用这些信息,您可以像这个伪代码一样读取状态寄存器:
unsigned int read_status_register {
reset JTAG to Test-Logic-Reset by sending five 1s on TMS
go into Shift-IR state
// The order of this depends on your JTAG chain
Send CONFIG_IN on TDI (these 10 bits will eventuall get pushed to the Virtex 5's IR)
Send eight 1's to put the CPLD in BYPASS
Send eight 1's to put the SysAce in BYPASS
Send sixteen 1s to put the next PROM in bypass
Send fifteen 1s to put the last PROM in bypass
// As described in the configuration guide
Send the last 1 on TDI while transitioning from Shift-IR to the Exit state
Transition back to Test-Logic-Reset
Transition to Shift-DR
Shift in the command sequence (sync word, noop, read_status, noop, noop)
Shift in 3 bits to push the command sequence past the other devices on the chain
Shift in 1 more bit while transitioning to exit
Transition to Shift-IR
Shift in CONFIG_OUT
Shift in 1's to put all devices in BYPASS like we did above
Transition to Shift-DR
Shift out 32-bits and save the data coming from TDO
// Note that we can stop here because the FPGA is the last device
// on the chain. Otherwise, you may need to shift in a couple of bits
// to push the data past other devices on the chain
}
正如您所看到的,它基本上都是关于进行正确的状态转换,以及了解发送内容的顺序。祝你好运!