【ZYNQ-7000开发之九】使用VDMA在PL和PS之间传输视频流数据

【ZYNQ-7000开发之九】使用VDMA在PL和PS之间传输视频流数据

原创 2016年01月14日 11:35:02

  • 10384

理论部分

VDMA可以把AXI4-Stream 类型的视频流通过S2MM,写入到DDR3中,反之也可以通过MM2S读入到VDMA接口的外设中。通过内嵌FPGA逻辑分析仪进行观察数据。

本文所使用的开发板是Miz702(兼容zedboard) 
PC 开发环境版本:Vivado Design Suite 2015.2

硬件系统工程

新建一个zedboard工程

建好工程后,再新建一个Block Design

点击ADD IP,添加ZYNQ PS

这里写图片描述

点击Run Block Automation,在弹出的对话框点击OK

这里写图片描述

双击ZYNQ图标,去掉不用的外设

这里写图片描述

使能一个HP接口,PL和PS通过VDMA传输数据做准备

这里写图片描述

设置好后,点击OK

添加VDMA IP Core

这里写图片描述

点击Run Connection Automation

在弹出的对话框的左上角选择All…,点击OK

再次点击Run Connection Automation

在弹出的对话框的左上角选择All…,点击OK,然后重新生成布局

添加TPG IP Core

这里写图片描述

双击刚刚生成的TPG图标,作如下设置

这里写图片描述

按照如图所示连接

这里写图片描述

按照如图所示连接时钟线

这里写图片描述

同上把VDMA的m_axis_mm2s_aclk以及s_axis_s2mm_aclk和上述时钟线连在一起

把TPG的aresrtn按照如图所示连接

这里写图片描述

重新生成布局后,如图所示(右击可以查看高清大图)

这里写图片描述

添加ILA IP Core(方法很多,这里未必是最好的)

这里写图片描述

把ila_0的SLOT_0_AXI和VDMA的M_AXI_MM2SS连接在一起

这里写图片描述

把ila_0的clk和VDMA的aclk连在一起

在添加一个ILA IP Core

把ila_1的SLOT_0_AXI和VDMA的M_AXI_S2MM连接在一起

把ila_1的clk和VDMA的aclk连在一起

完整的硬件结构框图如下(右击可查看高清大图)

这里写图片描述

右击Bolock design,选择Create HDL Wrapper

再次右击Bolock design,选择Generate output Prouducts

完成点击Run Synthesisi

完成后,点击Generate bitstream(耐心等待下吧,可以去吃个饭,睡会觉或者浏览下论坛的帖子,发几个评论……)

然后再选择,Tools -> set Up Debug

最后,File->Export->Export Hardware —-File ->Launch SDK

软件工程

SDK启动后,新建一个Hello World工程

把helloworld.c里的代码修改如下:

 
  1. #include <stdio.h>

  2. #include "platform.h"

  3. #include "xil_io.h"

  4.  
  5. int main()

  6. {

  7. init_platform();

  8.  
  9. xil_printf("----------The test is start......----------\n\r");

  10.  
  11. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x4); //reset S2MM VDMA Control Register

  12. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x8); //genlock

  13. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, 0x08000000);//S2MM Start Addresses

  14. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+4, 0x0A000000);

  15. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+8, 0x09000000);

  16. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 1920*3);//S2MM Horizontal Size

  17. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, 0x01002000);//S2MM Frame Delay and Stride

  18. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x3);//S2MM VDMA Control Register

  19. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 1080);//S2MM Vertical Size start an S2MM transfer

  20.  
  21. //AXI VDMA1

  22. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x4); //reset MM2S VDMA Control Register

  23. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x8); //gen-lock

  24.  
  25. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C, 0x08000000); //MM2S Start Addresses

  26. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C+4, 0x0A000000);

  27. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C+8, 0x09000000);

  28. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x54, 1920*3);//MM2S HSIZE Register

  29. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x58, 0x01002000);//S2MM FRMDELAY_STRIDE Register 1920*3=5760 对齐之后为8192=0x2000

  30. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x03);//MM2S VDMA Control Register

  31. Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x50, 1080);//MM2S_VSIZE 启动传输

  32.  
  33. cleanup_platform();

  34. return 0;

  35. }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

按照如下配置配置软件Debug

这里写图片描述 
这里写图片描述
这里写图片描述

设置好之后,开发板上电,点击Debug

打开vivado->open hardware->program device

成功后,vivado会自动打开硬件调试界面,如图所示

这里写图片描述

添加触发信号

在hw_ila_1里添加axi_vdma_0_M_AXI_MM2S_ARVALID信号,如图所示:

这里写图片描述

同上在hw_ila_2里添加axi_vdma_0_M_AXI_S2MM_AWVALID信号

把waveform里不相关的信号去掉

可以单步调试运行或者直接运行

VDMA启动两个通道启动后,wavefom里的波形如下所示:

S2MM

这里写图片描述

MM2S

这里写图片描述

这里大家可能会注意到有个问题,就是MM2S只传输了一次就停止了,这是问什么呢?大家可以思考下!

总结,在本篇文章我们实现了用VDMA的洗数据,把stream类型的数据转为Memory Map类型的存到内存中,然后用VDMA的读数据把MM的数据转为Stream型。最后还留了个小问题(PS:其实有一步我忘了做了),大家可以思考下!

转载:http://blog.csdn.net/rzjmpb/article/details/50516181

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值