【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

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

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

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

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

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

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

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

设置好后,点击OK

添加VDMA IP Core

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

点击Run Connection Automation

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

再次点击Run Connection Automation

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

添加TPG IP Core

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

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

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

按照如图所示连接

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

按照如图所示连接时钟线

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

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

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

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

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

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

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

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

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

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

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

在添加一个ILA IP Core

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

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

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

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

右击Bolock design,选择Create HDL Wrapper

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

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

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

软件工程

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

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

#include <stdio.h>
#include "platform.h"
#include "xil_io.h" int main()
{
init_platform(); xil_printf("----------The test is start......----------\n\r"); Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x4); //reset S2MM VDMA Control Register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x8); //genlock
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, 0x08000000);//S2MM Start Addresses
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+4, 0x0A000000);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+8, 0x09000000);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 1920*3);//S2MM Horizontal Size
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, 0x01002000);//S2MM Frame Delay and Stride
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x3);//S2MM VDMA Control Register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 1080);//S2MM Vertical Size start an S2MM transfer //AXI VDMA1
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x4); //reset MM2S VDMA Control Register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x8); //gen-lock Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C, 0x08000000); //MM2S Start Addresses
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C+4, 0x0A000000);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C+8, 0x09000000);
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x54, 1920*3);//MM2S HSIZE Register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x58, 0x01002000);//S2MM FRMDELAY_STRIDE Register 1920*3=5760 对齐之后为8192=0x2000
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x03);//MM2S VDMA Control Register
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x50, 1080);//MM2S_VSIZE 启动传输 cleanup_platform();
return 0;
}
  • 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

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

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

打开vivado->open hardware->program device

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

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

添加触发信号

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

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

同上在hw_ila_2里添加axi_vdma_0_M_AXI_S2MM_AWVALID信号

把waveform里不相关的信号去掉

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

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

S2MM

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

MM2S

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

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

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

转载:http://blog.csdn.net/rzjmpb/article/details/50516181
05-11 11:03