以下内容仅代表个人观点,欢迎指正。
接着上一篇文末提到了AXI转JTAG IP核,本篇主要从该IP分析与优化方面进行展开。首先从官网获取XAPP1251.zip,提取其中axi_jtag文件夹,该文件夹为AXI转JTAG IP核,建立测试文件(源码现已迁移至码云,csdn会偷改所需下载积分)。
设定TCK分频系数为8(),运行仿真,结果如下:
由图看出,一次AXI转JTAG传输由LENGTH、TMS_VECTOR、TDI_VECTOR、CTRL寄存器写,CTRL寄存器轮询和TDO_VECTOR寄存器读组成;XXX_VECTOR向JTAG信号(TCK、TMS、TDI、TDO)转换处于CTRL寄存器置位这段时间中,这段时间理论值为LENGTH寄存器÷TCK频率。因此一次AXI转JTAG传输所需要的时间为LENGTH寄存器÷TCK频率+5*AXI总线读/写时间。
实际在ZYNQ中再运行,建立的设计如下:
测试代码如下:
#include "xparameters.h"
#include <stdint.h>
typedef struct AXI_JTAG_TypeDef_s
{
volatile uint32_t LENGTH;
volatile uint32_t TMS_VECTOR;
volatile uint32_t TDI_VECTOR;
volatile uint32_t TDO_VECTOR;
volatile uint32_t CTRL;
} AXI_JTAG_TypeDef;
AXI_JTAG_TypeDef* AXI_JTAG = (AXI_JTAG_TypeDef*) XPAR_AXI_JTAG_0_BASEADDR;
int main(int argc, char** argv)
{
uint32_t i;
volatile uint32_t tms_vector_value;
for (i = 0; i < 4; i++)
{
AXI_JTAG->LENGTH = 32;
AXI_JTAG->TMS_VECTOR = i;
AXI_JTAG->TDI_VECTOR = 0x11111111 + i;
AXI_JTAG->CTRL = 1;
while (AXI_JTAG->CTRL & (1U << 0))
;
tms_vector_value = AXI_JTAG->TDO_VECTOR;
}
return 0;
}
通过ILA抓取波形
相比于仿真,实际运行时ZYNQ的AXI Lite总线读写时间增加到了190ns,这也符合上篇中对于AXI总线传输的分析。仿真中计算得比特效率为84.21%,实际运行得比特效率为70.52%。
显然,造成AXI转JTAG效率低下的原因,主要是过度依赖CPU数据搬运,所有的控制信号和数据均通过AXI-Lite总线进行传输,并且传输为写—处理—读的同步传输方式。
AXI总线的主从AXI4,AXI-Lite总线类型均可以在ZYNQ上进行使用,而如何改善/改变总线传输方式,并引入异步传输机制这是接下来考虑优化问题的方向。
未完待续...
(不定时更新,随时会鸽,别问源码)