参照网上教程使用Microblaze+VDMA+Video On Screen Display+AXI4-Stream to Video Out+HDMI等IP核组成图像输出回路:
第一次尝试显示出lena图像,有色偏,之后调试了很久才重新把图像显示出来并解决色偏;
总结有如下坑:
1、关于色偏:程序中提供的图像数据以ARGB方式存储,而HDMI模块仅使用低24位,故需要做一下转换:
const unsigned char gImage_lena[1048584] = { 0X00,0X20,0X00,0X02,0X00,0X02,0X00,0X39,
0X00,0X80,0X8A,0XE1,0X00,0X7F,0X89,0XE0,0X00,0X7E,0X88,0XE0,0X00,0X7D,0X87,0XDF,
0X00,0X7E,0X89,0XE3,0X00,0X78,0X83,0XDD,0X00,0X7C,0X89,0XE5,0X00,0X7B,0X88,0XE4...};
void SOBEL_DDRWR(unsigned int addr,unsigned int cols,unsigned int lows)
{
u32 i=0;
u32 j=0;
u32 r,g,b,a;
u32 index = 0;
for(i=0;i<cols;i++)
{
for(j=0;j<lows;j++)
{
a= gImage_lena[index];
b= gImage_lena[index+1];
g= gImage_lena[index+2];
r= gImage_lena[index+3];
Xil_Out32((addr+index), a|(r<<16)|(g<<8)|(b<<0));
index += 4;
}
}
Xil_DCacheFlush();
}
另需要确认设置:VDMA的Enable Read Channel选项中Stream Data Width为32,Video On Screen Display中Option选项中VideoFormat设置为RGBa,以及AXI4-Stream to Video Out中Video Forma设置为RGBA,以保证数据以32位宽传输。因为BD里默认对AXI4-Stream to Video Out数据做低位裁剪,故实际使用了ARGB的格式传输。
2、最大的坑在于AXI4-Stream to Video Out这个IP核,它需要Video Timing Control组合使用才能正常工作;输出vtg_ce必须接到vtc的gen_clken用以实现时序同步;输入的AXIS和Timing必须保证一致,故在之前加入一个Video on Screen Display,同时将两个IP的时序设置成一样的,我这里都设成了1280*720;
3、在使用Simulation观察波形的时候,一开始AXI4-Stream to Video Out没有输出波形,在保证输入AXIS和Timing一致后,需要等待约3~4个VSYNC后locked输出高电平,然后才有vid_io_out波形。
Video on Screen Display IP核提供了一种类似于背景色的功能,同时可支持AXI接口进行简单的图像绘制,当VDMA以非720P大小输出图像时,Video on Screen Display可实现自动组合和裁剪;
4、要依据设置分辨率大小设置时钟频率,720P视频时钟计算:Frequency=1650*750*60=74250000=74.25MHz,同时HDMI IP核需要一个5倍于系统时钟的时钟,使用clk_wizard生成另一个371.25Mhz时钟。