在本文中作者使用Xilinx的IP搭建一个HDMI输出图形的平台。在这个平台上设计目标是输出800*600像素的图像,本实验没有使用DDR缓存图像数据。本次实验使用到的工具:
开发板:PYNQ-Z2;
开发软件:Vivado 2018.3;
IP:TPG,VTC,Video Out,rgb2dvi。
1.新建工程
如何新建工程这里不再详解,网上有很多关于Vivado建工程的文章。唯一需要注意的是新建工程的时候要选择对应型号的ZYNQ芯片。这里我选择的是xc7z7020clg400-1。
2.新建BD
操作如下:
3添加IP核
需要添加的IP如上图所示,这是已经connected的图。其中有两个System ILA核可以不需要,这两个核是用来调试用的。至于各个IP核的配置如下。
处理器的IP配置主要是DDR的型号及地址位宽,输入时钟的频率。需要注意的是本文输出了两个时钟信号给PL部分做参考,100MHz给AXI总线做参考,40MHz给HDMI输出做PixCLK,配置如下。
在本实验中作者使用TPG(Video Test Pattern Generator)作为图像数据源,我们可以通过AXI总线来动态配置其参数。默认的设置如下。
VTC(Video Time Controller)的作用是产生HDMI输出图像的时序。其设置如下:
接下来是Video Out的设置。
接下来的这个IP不是Xilinx自带的IP,rgb2dvi这个IP是Digilent开源的IP,可以在其官网上下载到,https://github.com/Digilent/vivado-library。下载好这个IP后,需要添加IP依赖才能使用。
在弹出来的对话框中找到该IP存放的文件路径,点击OK即可。
rgb2dvi的设置如下:
按照上面的操作就可连接各个IP的端口了,有些连接线可以自动连接。完成之后生成设计文件,添加约束,以及生成BIT文件。然后到处硬件,启动SDK。SDK的代码参考http://xilinx.eetrend.com/content/2019/100018845.html这篇文章。
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xv_tpg.h"
XV_tpg tpg_inst;
int Status;
int main()
{
init_platform();
print("Hello World\n\r");
/* Insert the code for the TPG here */
Status = XV_tpg_Initialize(&tpg_inst, XPAR_V_TPG_0_DEVICE_ID);
if(Status!= XST_SUCCESS)
{
xil_printf("TPG configuration failed\r\n");
return(XST_FAILURE);
}
// Set Resolution to 800x600
XV_tpg_Set_height(&tpg_inst, 600);
XV_tpg_Set_width(&tpg_inst, 800);
// Set Color Space to RGB
XV_tpg_Set_colorFormat(&tpg_inst, 0x0);
//Set pattern to color bar
XV_tpg_Set_bckgndId(&tpg_inst, XTPG_BKGND_COLOR_BARS);
//Start the TPG
XV_tpg_EnableAutoRestart(&tpg_inst);
XV_tpg_Start(&tpg_inst);
xil_printf("TPG started!\r\n");
/* End of TPG code*/
cleanup_platform();
return 0;
}
下载到板子上显示器输出如下