VDMA操作相关,VDMA实现流水线

VDMA操作相关,VDMA实现流⽔线
1.CSDN 上的原⽂ -*----HLS图像处理系列——在ZEDBoard搭建DDR图像处理通路
ZYNQ芯⽚内包含⼀个丰富特性的基于双核ARM Cortex-A9的处理⼦系统(Processing System,PS)和Xilinx 28nm可编程逻辑(Programmable Logic,PL)。PS除了核⼼外还包括⽚上存储器、外部存储器接⼝以及⼤量外设连接接⼝。
利⽤ARM,我们可以做嵌⼊式操作系统相关的任务,如图形界⾯、⽤户输⼊、⽹络、DDR3控制等,由于ARM本⾝具有丰富的外设接⼝,⽽且⽀持多级流⽔线,处理这些事务游刃有余,但对于计算量较⼤的应⽤却捉襟见肘,因为ARM本⾝还是典型的串⾏处理器,不适合做⼤数据、实时性较⾼的处理任务。FPGA恰好弥补了这⼀点,利⽤可编程逻辑可以实现并⾏处理,只要逻辑资源够⽤,我们可以采⽤以空间换时间的策略,使多个计算单元同时进⾏,可⼤⼤缩短处理时间。
⽤ZYNQ进⾏图像处理具有架构上的优势,因此对于⽤ZYNQ做视频相关的开发⼈员,⼀套ZYNQ上的图像通路是必须的。本博⽂介绍的是⼀种摄像头+HLS图像处理+DDR存储+VGA显⽰的图像通路。该通路是本⼈和另外⼀位同事合作实现,本⼈负责摄像头的FPGA驱动、HLS图像处理IP的实现以及系统的后期优化。由于涉及公司项⽬,因此不能提供⼯程⽂件,只提供框架和思路。
系统框架如下:
屋顶融雪装置重点模块介绍:
Camera:采⽤ov7725摄像头,帧率60fps,分辨率640*480。关于摄像头时序的详解,请参考本⼈博⽂《教程——在ZEDBoard实现图像通路(Block Ram版本)》
封装后的摄像头IP如下图:
VDMA:在本设计中,VDMA的地位和通常设计中的DMA相似。但是,和DMA不同的是,VDMA专门为视频流数据提供的⾼度存储访问模块。其通过AXI-Stream协议接收视频数据,⽽控制信号(⽐如帧缓冲的⼤⼩,DMA功能的开启和关闭,以及⼀些其他的设置)则通过AXI-Lite从其他接⼝访问。
VDMA拥有两条DMA通路,S2MM通路将输⼊的AXI4-Stream数据流映射到指定的帧缓冲,⽽MM2S则相反,将帧缓冲输出为AXI4-Stream类型的数据流。
VDMA的配置界⾯如图:
其中可以看到⼀些对于数据帧的配置信息,以及FrameBuffers数量的设置。FrameBuffers数量⾄少为3个,因为如果少于3个,那么会出现写⼊DDR与读取DDR的冲突,导致图像出现断层现象。在本设计中,FrameBuffers设置为3个。
Video In to AXI4-Stream 与 AXI4-Stream to Video Out:由于摄像头传⼊的信号使⽤的协议并⾮AXI4-Stream,⽽VDMA却需要接收AXI4-Stream类型的数据,所以需要有专门的IP核来进⾏两者之间的转换。
这两个IP核是:小区停车收费系统
Video In to AXI4-Stream,该IP将视频数据转化为AXI4-Stream类型。本⼯程中,视频数据来⾃于camera模块,只需要camera提供四路信号:⾏同步、场同步、24bit的像素、数据有效信号。
AXI4-Stream to Video Out,该IP将AXI4-Stream类型数据转化为视频数据。视频数据即为VGA信号,包含⾏同步、场同步、数据有效信号以及像素。该模块有⼀个timing的输⼊,在本系统中,来⾃于video timing control IP。video timing control模块给AXI4-Stream to Video Out IP提供⼀个640*480p的VGA时序信号。
下图为Video In to AXI4-Stream IP与AXI4-Stream to Video Out IP:
这两个IP核在本设计中处于桥梁地位,⽤于连接外部IO和VDMA。在这两个模块内部的视频数据都是AXI4-Stream类型,省去了地址,因此速度更快、更容易处理。⼀般⽽
⾔,HLS硬件图像处理模块都会放在这两个IP核之间。
HLS图像处理模块:本设计中,构建了⼀个简单的Sobel图像处理模块,由HLS⼯具⽣成打包成IP。关于HLS⼯具不多介绍,可以参考本⼈博客《HLS图像处理系列——前⾔》来初步了解HLS。HLS⽣成的IP输⼊输出视频流都符合AXI4-Stream协议。
然后,附上vivado的⼯程截图:
在SDK⼯程,主要是进⾏HLS IP的初始化与VDMA的初始化。只有初始化之后,整个图像通路才能正确运⾏。HLS初始化源码短短⼏⾏,但也是折磨了我好久,因为需要关闭中断,好长时间内都没有发现这个问题。初始化重点源码如下:
1.
/************config hls ip********/
保安机器人2.
void ConfigureHlsIP(XImgprocess_top *ImgProcess)
3.
{
4.
ImgProcess->Control_bus_BaseAddress = XPAR_IMGPROCESS_TOP_0_S_AXI_CONTROL_BUS_BASEADDR;
5.
ImgProcess->IsReady = XIL_COMPONENT_IS_READY;
6.
7.
XImgprocess_top_EnableAutoRestart(ImgProcess);
8.
XImgprocess_top_SetRows(ImgProcess, 480);
9.
XImgprocess_top_SetCols(ImgProcess,640);
10.
背景板制作11.
XImgprocess_top_InterruptDisable(ImgProcess, 0xFFFFFFFF);
12.
XImgprocess_top_InterruptGlobalDisable(ImgProcess);
13.
XImgprocess_top_Start(ImgProcess);
14.
}
15.
16.
int main()
17.
{
电子元器件封装18.
init_platform();
19.
usleep(100000);
20.
print("Hello World\n\r");
21.
ConfigureHlsIP(&ImgProcess);
22.
// MM2S
23.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x00, 0x008B); // enable run, circular_park, GenlockEn, GenlockSrc
24.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x5C, 0x01000000); // Start address of the 1st frame(3 frames in all)
25.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x60, 0x02000000); // Start address of the 2nd frame(3 frames in all)
26.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x64, 0x03000000); // Start address of the 3rd frame(3 frames in all)
27.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x58, 0x0780); // Stride number
28.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x54, 0x0780); // number of bytes per line(640 x 3)
29.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x50, 0x01E0); // number of lines per frame(480)
30.
31.
//S2MM
32.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0x30, 0x108B); // enable run, circular_park
33.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xAC, 0x01000000); // Start address of the 1st frame(3 frames in all)
34.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xB0, 0x02000000); // Start address of the 2nd frame(3 frames in all)
35.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xB4, 0x03000000); // Start address of the 3rd fram
e(3 frames in all)
36.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA8, 0x0780); // Stride number
静脉曲张裤子
37.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA4, 0x0780); // number of bytes per line(640 x 3)
38.
Xil_Out32(XPAR_AXI_VDMA_0_BASEADDR + 0xA0, 0x01E0); // number of lines per frame(480)
39.
40.
return 0;
41.
}
2.对上位的注解如下:
HSIZE为每⾏的点数,单位byte;如果是rgb格式的数据就要在每⾏的点数上*3;
VDMA IP中设置帧buffer为3,在寄存器设置时,就对应设置三个start address,对应每帧buffer的起始起始地址;在这⾥是VDMA实现乒乓帧,流⽔线操作的关键;genlock mode circular mode  internal genlock
stride number 单位byte;每次⾏突发的步进值;这个值⼩于等于HSIZE;
双击查看原图
⼿册中这段⽂字,⼀是解析VDMA在处理S2MM/MM2S两端对DDR总线的带宽资源的占⽤是如何进⾏仲裁的。
⼆是,在这⾥更加体现VDMA 的乒乓流⽔特性;

本文发布于:2024-09-23 10:16:25,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/115206.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   视频   处理   图像处理   模块   通路   实现   信号
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议