[X]关闭

【ZYNQ-7000开发之十】TGP+VDMA+HDMI搭建视频通路

文档创建者:RZJM
浏览次数:19311
最后更新:2019-02-15
 
本帖最后由 RZJM 于 2016-1-26 20:46 编辑

本编文章在ADI官方HDMI例程的基础上进行修改,实现视频通路,为使用ZYNQ视频处理做好必要准备。

【ZYNQ-7000开发之九】使用VDMA在PL和PS之间传输视频流数据 这篇文章中,介绍了如何使用VDMA传输stream类型的视频流数据,本次实验将结合【ZYNQ-7000开发之三】ZYNQ平台的HDMI驱动测试这篇文章,本次实验默认大家已经完成了【三】和【九】,至少要完成【三】,本次实验将在【三】的基础上直接修改。


本篇文章的思想是使用TPG产生stream类型的数据,然后用VDMA转换成Memory Map类型的数据写入到DDR3缓存,最后再用VDMA 从DDR3读出来转换成stream类型,发送给HDMI控制器,进而显示在HDMI显示器上。


TGP VDMA等的规范说明可以到官网下载最新版本


本文所使用的开发板是Miz702(兼容zedboard)
PC 开发环境版本:Vivado 2015.2 Xilinx SDK 2015.2
其它:HDMI显示器,串口线


修改硬件系统工程打开【ZYNQ-7000开发之三】做好的vivado工程,打开Block Design找到VDMA双击,选中Enable Write Channel,同时设置Memory Map Data Width为64,点击OK

点击Run Connection Automation,在弹出的对话框选择ALL,点击OK点击ADD IP,添加一个TPG IP Core双击刚刚添加的TPG,按照如图所示配置,这个主要为了简洁一些,去掉了一些不必要的功能

把TPG的video_out和VDMA的S_AXIS_S2MM连接在一起,如图所示

同理把TPG的aclk连接到VDMA的aclk,把TPG的aresetn连接到VDMA的resetn,此外VDMA的s_axis_s2mm_aclk也和VDMA的aclk连在一起然后按下F6快捷键,验证下系统是不是有问题,没有问题就保存工程,点击generate bitstream完成后,导出硬件,Launch SDK

修改软件工程
找到cf_hdmi.c文件,把InitHdmiVideoPcore函数修改如下:
  1. /***************************************************************************//**
  2. * @brief InitHdmiVideoPcore.
  3. *******************************************************************************/
  4. void InitHdmiVideoPcore(unsigned short horizontalActiveTime,
  5.                         unsigned short horizontalBlankingTime,
  6.                         unsigned short horizontalSyncOffset,
  7.                         unsigned short horizontalSyncPulseWidth,
  8.                         unsigned short verticalActiveTime,
  9.                         unsigned short verticalBlankingTime,
  10.                         unsigned short verticalSyncOffset,
  11.                         unsigned short verticalSyncPulseWidth)
  12. {
  13.     unsigned short horizontalCount     = 0;
  14.     unsigned short verticalCount       = 0;
  15.     unsigned short horizontalBackPorch = 0;
  16.     unsigned short verticalBackPorch   = 0;
  17.     unsigned short horizontalDeMin     = 0;
  18.     unsigned short horizontalDeMax     = 0;
  19.     unsigned short verticalDeMin       = 0;
  20.     unsigned short verticalDeMax       = 0;
  21.     DDRVideoWr(horizontalActiveTime, verticalActiveTime);
  22.     horizontalCount = horizontalActiveTime +
  23.                       horizontalBlankingTime;
  24.     verticalCount = verticalActiveTime +
  25.                     verticalBlankingTime;
  26.     horizontalBackPorch = horizontalBlankingTime -
  27.                           horizontalSyncOffset -
  28.                           horizontalSyncPulseWidth;
  29.     verticalBackPorch = verticalBlankingTime -
  30.                         verticalSyncOffset -
  31.                         verticalSyncPulseWidth;
  32.     horizontalDeMin = horizontalSyncPulseWidth +
  33.                       horizontalBackPorch;
  34.     horizontalDeMax = horizontalDeMin +
  35.                       horizontalActiveTime;
  36.     verticalDeMin = verticalSyncPulseWidth +
  37.                     verticalBackPorch;
  38.     verticalDeMax = verticalDeMin +
  39.                     verticalActiveTime;
  40.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_HTIMING1),
  41.               ((horizontalActiveTime << 16) | horizontalCount));
  42.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_HTIMING2),
  43.               horizontalSyncPulseWidth);
  44.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_HTIMING3),
  45.               ((horizontalDeMax << 16) | horizontalDeMin));
  46.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_VTIMING1),
  47.               ((verticalActiveTime << 16) | verticalCount));
  48.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_VTIMING2),
  49.               verticalSyncPulseWidth);
  50.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_VTIMING3),
  51.               ((verticalDeMax << 16) | verticalDeMin));
  52.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_RESET), 0x1);
  53.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_SOURCE_SEL), 0x0);
  54.     Xil_Out32((CFV_BASEADDR + AXI_HDMI_REG_SOURCE_SEL), 0x1);
  55.     Xil_Out32(VDMA_BASEADDR + 0x30, 0x4); //reset   S2MM VDMA Control Register
  56.     Xil_Out32(VDMA_BASEADDR + 0x30, 0x8); //genlock
  57.     Xil_Out32(VDMA_BASEADDR + 0xAC,   0x08000000);//S2MM Start Addresses
  58.     Xil_Out32(VDMA_BASEADDR + 0xAC+4, 0x0A000000);
  59.     Xil_Out32(VDMA_BASEADDR + 0xAC+8, 0x0D000000);
  60.     Xil_Out32(VDMA_BASEADDR + 0xA4, 640*4);//S2MM Horizontal Size
  61.     Xil_Out32(VDMA_BASEADDR + 0xA8, 640*4);//S2MM Frame Delay and Stride
  62.     Xil_Out32(VDMA_BASEADDR + 0x30, 0x3);//S2MM VDMA Control Register
  63.     Xil_Out32(VDMA_BASEADDR + 0xA0, 480);//S2MM Vertical Size  start an S2M
  64.     Xil_DCacheFlush();
  65.     Xil_Out32((VDMA_BASEADDR + AXI_VDMA_REG_DMA_CTRL),
  66.               0x00000003); // enable circular mode
  67.     Xil_Out32((VDMA_BASEADDR + AXI_VDMA_REG_START_1),
  68.             0x08000000); // start address      
  69.     Xil_Out32((VDMA_BASEADDR + AXI_VDMA_REG_START_2),
  70.             0x0A000000); // start address
  71.     Xil_Out32((VDMA_BASEADDR + AXI_VDMA_REG_START_3),
  72.             0x0D000000); // start address
  73.     Xil_Out32((VDMA_BASEADDR + AXI_VDMA_REG_FRMDLY_STRIDE),
  74.               (horizontalActiveTime*4)); // h offset
  75.     Xil_Out32((VDMA_BASEADDR + AXI_VDMA_REG_H_SIZE),
  76.               (horizontalActiveTime*4)); // h size
  77.     Xil_Out32((VDMA_BASEADDR + AXI_VDMA_REG_V_SIZE),
  78.               verticalActiveTime); // v size
  79. }
复制代码

分别配置好FPGA和ARM后,在串口终端按‘6’,选择640*480分辨率,看到如下所示的效果就成功了。大家可以更换TPG的输出类型,查看不同的效果。

总结

目前通过zynq实现了640*480的视频显示,大家可以调试下其它的分辨率。此外,串口终端发送数据的时候会断开,不知道大家是否会遇到这个BUG。




发表评论已发布 13

Milinker_XU

发表于 2016-1-26 21:56:04 | 显示全部楼层

帅气
回复

使用道具 举报

uisrc

发表于 2016-1-27 23:09:22 | 显示全部楼层

已经走在通往大神的道路上预计还要2-3个月全面突破ZYNQ
越努力越幸运!加油!

Li2015

发表于 2016-2-29 11:20:46 | 显示全部楼层

厉害!
回复

使用道具 举报

zjsxfkf@163.com

发表于 2016-3-2 21:43:15 | 显示全部楼层

不错,值得学习

Li2015

发表于 2016-3-18 09:10:56 | 显示全部楼层

楼主写这篇文章都参考了哪些资料啊,尤其是那些代码中的初始化都是参考了哪些手册啊?

RZJM

发表于 2016-3-18 09:37:12 | 显示全部楼层

Li2015 发表于 2016-3-18 09:10
楼主写这篇文章都参考了哪些资料啊,尤其是那些代码中的初始化都是参考了哪些手册啊?

ADI的官方ADV7511 Demo
xapp1205

vince_pan

发表于 2016-4-5 10:37:48 | 显示全部楼层

我按照步骤试,显示器输出绿屏一闪而过,以后一直输出黑屏,有遇到这样问题的吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

RZJM

发表于 2016-4-14 19:47:19 | 显示全部楼层

是不是显示器不支持

helloTP

发表于 2016-6-29 14:36:36 | 显示全部楼层

楼主我已经顺利完成“之三”,但是在做“之十”结果显示在不同分辨率下都是雪花,但是可以分辨出不同分辨率下,雪花效果还不一致,这是为什么呢?用的是zedboard
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则