内容:在使用xilinx自带的Pattern Generator的时候,出现了一些莫名的问题,现在做一个总结,如下:
1,首先简单搭一个系统,由于原始的BLOCK图的连线过于复杂,于是简化处理;
2,其中VTC和TPG分别可以工作在free run模式和pass thru模式,这些可以通过寄存器配置。对于TPG来说,如果工作在free run模式,那么XV_tpg_Set_enableInput(&tpg, 0x00)一定要写0,就是禁止输入的流,否则会影响后端的码流速率。
3,如果工作在passthru模式,除了0x98寄存器要写1之外,还要把v_axi4s_vid_out配置成slave模式,原因在于master模式无法自动搜寻SOF信号,这里color bar gen模块和VTC启动的时间肯定不一致,这就导致了axi4s_vid_out模块一直无法LOCK住,
无论你把FIFO的空间增加到4096还是更大。我在论坛里面看到有人遇到同样的问题,他采用的方式在码流输入级加FIFO,我不清楚他的时序是怎么精确控制的。但是却让我想到了master模式的缺陷。
4,如果工作在passthru模式下,那么如下两条程序应当有先后顺序,否则无法正常工作,原因不可知。
XV_tpg_EnableAutoRestart(&tpg);
XV_tpg_Start(&tpg);
5,我的系统中是一个时钟传输2个像素,于是遇到了问题,配置TPG的寄存器active hor size和active ver size必须按照实际大小配置,就是不用除以2。但是passthru的参数就需要除以2,这就是两者的不统一。比如1280x720大小的图像,应当如下配置才行。
XV_tpg_Set_width(&tpg,1280);//原始大小
XV_tpg_Set_height(&tpg,720);
XV_tpg_Set_passthruStartX(&tpg, 1);
XV_tpg_Set_passthruEndX(&tpg, 640);//宽度1280除以2
XV_tpg_Set_passthruStartY(&tpg, 1);
XV_tpg_Set_passthruEndY(&tpg, 720);
6,最后需要把TPG的输入流视频数据选通,否则还是输出的pattern generator自带的数据:XV_tpg_Set_bckgndId(&tpg, 0x00);
总结:
1,关于VTC,不管使用master模式,还是slave模式,都需要考虑视频的timing和stream能否同步上,这跟搭建的系统有关;
2,xilinx本身的IP的数据手册描述不详细,有些坑需要自己踩一遍才知道。