[X]关闭

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

文档创建者:RZJM
浏览次数:14313
最后更新:2016-04-21
 
本帖最后由 RZJM 于 2016-1-14 13:49 编辑

理论部分

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
完成后,点击Generate bitstream(耐心等待下吧,可以去吃个饭,睡会觉或者浏览下论坛的帖子,发几个评论……)
最后,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. int main()
  5.    {
  6.            init_platform();
  7.            xil_printf("----------The test is start......----------\n\r");
  8.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x4); //reset   S2MM VDMA Control Register
  9.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x8); //genlock
  10.            //Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x0b);//fs
  11.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, 0x08000000);//S2MM Start Addresses
  12.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+4, 0x0A000000);
  13.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC+8, 0x09000000);
  14.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 1920*3);//S2MM Horizontal Size
  15.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, 0x01002000);//S2MM Frame Delay and Stride
  16.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x3);//S2MM VDMA Control Register
  17.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 1080);//S2MM Vertical Size  start an S2MM transfer
  18.            //AXI VDMA1
  19.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x4); //reset   MM2S VDMA Control Register
  20.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x8); //gen-lock
  21.            //Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x0B);   //fs+
  22.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C,   0x08000000);   //MM2S Start Addresses
  23.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C+4, 0x0A000000);
  24.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C+8, 0x09000000);
  25.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x54, 1920*3);//MM2S HSIZE Register
  26.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x58, 0x01002000);//S2MM FRMDELAY_STRIDE Register 1920*3=5760 对齐之后为8192=0x2000
  27.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x0, 0x03);//MM2S VDMA Control Register
  28.            Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x50, 1080);//MM2S_VSIZE    启动传输
  29.            cleanup_platform();
  30.            return 0;
  31.     }
复制代码


按照如下配置配置软件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:其实有一步我忘了做了),大家可以思考下!



发表评论已发布 8

Li2015

发表于 2016-2-26 10:54:42 | 显示全部楼层

楼主,你说的最后一个小问题是什么啊?

RZJM

发表于 2016-2-27 17:43:12 | 显示全部楼层

Li2015 发表于 2016-2-26 10:54
楼主,你说的最后一个小问题是什么啊?

你想想 AXI stream 协议就知道了

Li2015

发表于 2016-2-29 09:30:58 | 显示全部楼层

本帖最后由 Li2015 于 2016-2-29 10:24 编辑
RZJM 发表于 2016-2-27 17:43
你想想 AXI stream 协议就知道了

是在官网找AXI stream 协议吗

RZJM

发表于 2016-3-6 11:33:44 | 显示全部楼层

Li2015 发表于 2016-2-29 09:30
是在官网找AXI stream 协议吗

是啊,或者是ARM官方也有

狂羁青马

发表于 2016-3-22 16:14:15 | 显示全部楼层

楼主可否讲解一下这个数据流的过程,然看了之后不是很理解,test pattern generator 是干嘛用的呢?视频流数据哪里来的呢?对于新手的我们有些费解,恳请解惑

科比布雷恩

发表于 2016-4-20 14:20:55 | 显示全部楼层

MM2S只传输了一次就停止了--是不是因为 当我们要把内存中的数据往 pl里面写的时候 axis mm2s 输出是不是得连着东西,类似往缓冲区里面写东西,写满不取走就会阻塞

RZJM

发表于 2016-4-21 19:01:09 | 显示全部楼层

狂羁青马 发表于 2016-3-22 16:14
楼主可否讲解一下这个数据流的过程,然看了之后不是很理解,test pattern generator 是干嘛用的呢?视频流 ...

xilinx的测试视频图像的IP

RZJM

发表于 2016-4-21 19:03:00 | 显示全部楼层

科比布雷恩 发表于 2016-4-20 14:20
MM2S只传输了一次就停止了--是不是因为 当我们要把内存中的数据往 pl里面写的时候 axis mm2s 输出是不是得 ...

因为Slave 没有持续的ready信号
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则