zynq如何将c语言的初始化序列抓出来,转成寄存器读写?(用ILA) - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

step1: 核心思想,在总线上加一个ILA,通过ILA抓寄存器读写过程

image

step2: ILA捕捉,对于寄存器写,只需要保留这几个信号。注意Wready通常是一个脉冲宽度

image

step3:将ILA波形右键导出csv表格

image

删除不必要的信号,只保留这几个。把名字改一下。按Wready=1做个筛选,由于Wready=1的宽度通常只有一个周期,因此非常适合做筛选。 写个excel表达式,直接转化为寄存器读写。

效果演示,用纯寄存器:一把就把原子的sd_hdmi例程用纯寄存器驱动出来了

void init()
{
	//配置VDMA
	Xil_Out32(0x43000000,0x4);
	Xil_Out32(0x43000000,0x10002);
	Xil_Out32(0x43000054,0x1680);
	Xil_Out32(0x43000058,0x1680);
	Xil_Out32(0x4300005c,0x1100000);
	Xil_Out32(0x43000000,0x14002);
	Xil_Out32(0x43000000,0x14003);
	Xil_Out32(0x43000050,0x438);
	usleep(1000);

	//初始化Display controller
	Xil_Out32(0x43c10008,0x800083);
	Xil_Out32(0x43c1000c,0x800411);
	Xil_Out32(0x43c10010,0x0);
	Xil_Out32(0x43c10014,0x82);
	Xil_Out32(0x43c10018,0xd2cfa401);
	Xil_Out32(0x43c1001c,0x006300ff);
	Xil_Out32(0x43c10000,0x1);
	usleep(1000);

	Xil_Out32(0x43c10008,0x400041);
	Xil_Out32(0x43c1000c,0x0000069a);
	Xil_Out32(0x43c10010,0x0);
	Xil_Out32(0x43c10014,0x000020c4);
	Xil_Out32(0x43c10018,0xcfafa401);
	Xil_Out32(0x43c1001c,0x00a300ff);
	Xil_Out32(0x43c10000,0x0);
	Xil_Out32(0x43c10000,0x1);
	usleep(1000);

	 //设置VideoMode
	Xil_Out32(0x43c00000,0x2);
	Xil_Out32(0x43c0006c,0x0000007f);
	Xil_Out32(0x43c00070,0x898);
	Xil_Out32(0x43c00074,0x4650465);
	Xil_Out32(0x43c00060,0x4380780);
	Xil_Out32(0x43c00094,0x4380000);
	Xil_Out32(0x43c00078,0x080407d8);
	Xil_Out32(0x43c00080,0x0440043b);
	Xil_Out32(0x43c0008c,0x0440043b);
	Xil_Out32(0x43c00068,0x2);
	Xil_Out32(0x43c0007c,0x7800780);
	Xil_Out32(0x43c00084,0x07d807d8);
	Xil_Out32(0x43c00088,0x7800780);
	Xil_Out32(0x43c00090,0x07d807d8);
	Xil_Out32(0x43c0007c,0x7800780);
	Xil_Out32(0x43c00084,0x07d807d8);
	Xil_Out32(0x43c00088,0x7800780);
	Xil_Out32(0x43c00090,0x07d807d8);
	Xil_Out32(0x43c00000,0x03f7ef02);
	Xil_Out32(0x43c00000,0x03f7ef06);
	usleep(1000);
}

int main(void)
{
	xil_printf("HDMI Display 1920*1080 \r\n");
	sleep(10);

	//设置video参数,分辨率:1920*1080
	vd_mode = VMODE_1920x1080;

	//配置VDMA
//	run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
//							frame_buffer_addr,0, 0,ONLY_READ);

    //初始化Display controller
//	DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
    //设置VideoMode
//	DisplaySetMode(&dispCtrl, &vd_mode);
//	DisplayStart(&dispCtrl);

	init();
	//读取SD卡图片并显示
	load_sd_bmp((u8*)frame_buffer_addr);

    return 0;
}

可以看到,用一个纯寄存器读写的init函数,取代了3个复杂的函数。一把就把hdmi屏幕驱动成功了。

使用ILA的Capture Control功能,可以更为高效的捕获(可以捕获低频信号)

image

这个勾选上。强烈推荐,每次都把这个勾选上!

image

  1. 设置ILA,Capture Mode设置为BASIC。注意这里的窗口是指待捕获的sample数量,显然我们配置的寄存器数量一般是几十个,因此这里不需要设置太大。根据我们的实际情况,寄存器配置数量大约在32-64之间,因此这里配置为64。
  2. 设置Capture信号,这里选择wready信号,因为wready信号默认宽度是一个脉冲,可以用来精准且不重复的捕获AXI4的写数据。注意,Trigger可以不用设置。
  3. 烧录程序,可见捕获了44个sample。由于没有达到64,因此这里还没有结束。我们点击停止按钮,主动让他结束。

image

注意,中间那个wready一个低电平的位置,那是trigger position的位置(16)。 可见,现在捕获到足够样本,结束了。我们将数据右键导出为csv,然后在csv中做个处理。 一次就把完整的配置表抽出来了。

image

注意,excel表的公式如下

="Xil_Out32(0x"&B2&",0x"&C2&");"