1. 基础知识
1.1 关于XVC
(1)Xilinx Virtual Cable (XVC) 是一种用于通过网络连接远程调试和编程Xilinx FPGA的协议。使用XVC协议,可以将FPGA的JTAG接口连接到一个网络端口上,然后通过TCP/IP协议在远程计算机上进行JTAG操作,从而实现对FPGA的调试和编程。
(2)Xilinx Virtual Cable (XVC)协议目前有两个版本,分别是XVC v1.0和XVC v2.0。XVC v1.0是早期版本的XVC协议,使用固定的JTAG时序和格式进行数据传输。它适用于通过网络连接到一个远程JTAG设备,但对于某些应用场景下,可能需要更高的传输速度和更灵活的配置选项。为了满足这些需求,Xilinx推出了XVC v2.0版本,它提供了更多的灵活性和可配置选项,支持更高的传输速率和更多的JTAG设备类型。XVC v2.0支持可配置的时序和数据格式,同时支持多路连接和流式数据传输。需要注意的是,XVC v2.0需要更高版本的Xilinx Vivado工具才能支持,因此在选择使用哪个版本的XVC协议时,需要根据具体的应用需求和工具版本进行选择。
1.2 关于JTAG
(1)JTAG(Joint Test Action Group)是一种用于在集成电路中进行调试和测试的标准接口。它可以访问芯片内部的寄存器,实现对芯片内部状态的控制和观测。
(2)根据不同的JTAG版本,支持的功能和性能也会有所不同。目前常见的JTAG版本有JTAG IEEE 1149.1、IEEE 1149.6、IEEE 1149.7等。其中,IEEE 1149.1是最基本的JTAG版本,支持单线调试,而IEEE 1149.6和IEEE 1149.7则是一些特殊应用场景下的改进版本,支持多线调试和高速调试。
(3)对于Xilinx FPGA,一般使用的是IEEE 1149.1版本的JTAG接口。使用XVC协议进行远程调试和编程时,需要将FPGA的JTAG接口连接到网络上,并使用XVC协议在远程计算机上进行JTAG操作。具体的JTAG版本和调试方式,需要根据具体的应用需求和硬件平台进行选择和配置。
(4)IEEE 1149.1是一种用于测试和调试集成电路的标准接口,也被称为JTAG(Joint Test Action Group)接口。它定义了一种包含4条线的串行接口,用于测试和调试芯片内部的逻辑电路,并支持在生产测试和维护阶段对芯片进行编程和调试。
1.3 JTAG的时序图
IEEE 1149.1标准接口由以下4条线组成:
Test Data Input (TDI):测试数据输入线,用于向芯片内部输入测试数据。
Test Data Output (TDO):测试数据输出线,用于从芯片内部输出测试结果。
Test Mode Select (TMS):测试模式选择线,用于控制测试模式的转换。
Test Clock (TCK):测试时钟线,用于控制测试时序和数据传输速率。
除了这些标准线之外,IEEE 1149.1标准还定义了一些辅助线,用于实现特殊的测试和调试功能,例如测试控制和状态寄存器(TAP控制和状态寄存器)。
通过使用IEEE 1149.1标准接口,可以实现对芯片内部逻辑电路的测试和调试,包括读取和写入寄存器、检查电路状态、检测电路故障等。此外,IEEE 1149.1标准还可以用于在生产测试和维护阶段对芯片进行编程和调试,以实现更高的生产效率和更好的维护性能。
1.4 JTAG的状态机
参考文档《7系列FPGA的配置》。
1.5 XVC的三种报文
参考文件:《xapp1251-xvc-zynq-petalinux.pdf》,可以在xilinx官网免费下载改文档。
XVC 协议内容简单,使用方便,其基本内容可总结为如下三条指令:
1) getinfo:
该指令用于获取XVC 服务的版本。当接收到“getinfo:”指令时,该服务将会返回如下的字符串:“ xvcServer_v1.0; ”, 其中,代表了该协议一次能移位发送的字节向量的最大长度。
2) shift:[num bits][tms vector][tdi vector]
该指令表示分别以字节向量TMS vector 和TDI vector 的形式发送num_bits 个二进制数据。其中,num_bits 是一个小端格式的整数,TMS vector和 TDI vector 代表所要发送的TMS 和TDI 的二进制数据。发送过程中,0 字节的0 比特位首先被发送出去,字节向量的长度会根据num_bits 的值向上补齐成最接近的字节数。该指令最终应该返回与TMS vector 向量同样长度的字节向量TDO vector,代表从JTAG 接口返回的所有的TDO。同样也是0字节的0 比特位首先被接收回来。
3) settck:[period in ns]
该指令表示将该协议通信的时钟周期设置为period 纳秒。period 同样是一个小端格式的整数值。使用该指令最终应该返回实际的周期值。
2. 调试过程
在单片机中建立TCP服务端,接收vivado发来的报文。本章节重点关注"shift:"命令。
2.1 shift命令的实际内容
(1)在实现网络通信之后,debug调试抓到vivado发来的shift命令。下图只是部分报文,并非全部。
(2)根据jtag协议,上述报文的对应的jtag理论波形,如下图所示。bit0先传。
- 第一条shift命令,如下图所示。可知主要用来搬运32位的数据。这里不知道这32位的数据表示什么意思。
- 第二条shift命令,移动132字节的数据
2.2 shift命令的实际示波器波形
(1)由下面的TMS和TDI波形,对比2.1中的理论波形,可以看到,是一致的。
(2)TDO引脚配置为输入,处于高阻状态或者上拉。由jtag从设备控制TDO引脚。
2.3 vivado识别设备的IDCODE的shift命令
(1)发送位长度为:0x0000042E的shift命令,可以得到国产FPGA的IDCODE:03691093
(2)发送位长度为0x2E的shift指令,也可以得到IDCODE。
73 68 69 66 74 3A 2E 00 00 00 FF 02 00 00 00 18 00 F0 0F 00 00 00
2.4 进口xlinxV7和国产V7的IDCODE
2.5 测试命令
这里的命令是使用wireshark抓包到的,仅是部分命令。
67 65 74 69 6E 66 6F 3A
73 65 74 74 63 6B 3A 64 00 00 00
73 68 69 66 74 3A 05 00 00 00 1F 00
73 68 69 66 74 3A 2B 00 00 00 5F 00 00 00 00 03 00 FE 01 00 00 00
73 68 69 66 74 3A 2E 04 00 00 FF 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00