基于ZYNQ FPGA实现图像采集存储显示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于ZYNQ FPGA实现图像采集存储显示1 FPGA硬件系统设计
基于ZYNQ FPGA实现图像数据采集、存储、处理和显示系统框图如图1所示。

说明:2路摄像头采集系统,4种显示方案,原始数据显示2路,经过算法处理2路。

图1 系统设计
OV5640模块:图像传感器,视频流来源。

写VDMA模块:硬件采集到的数据通过写VDMA存储到PS端的DDR中。

ZYNQ模块:ZYNQ-7000系列FPGA,ARM + FPGA架构,核心处理芯片。

读VDMA模块:通过读VDMA从PS端的DDR中读取图像数据。

RGB转换DVI模块:32bit转为RGB888,再转为DVI时序输出到HDMI显示。

HDMI显示器:显示图像视频数据。

2 关键技术
1)OV5640摄像头
设计中采用两片美国OmniVision公司的CMOS图像传感器
OV5640,OV5640芯片支持DVP和MIPI接口。

为保证OV5640正常工作,需要依次实现以下时序要求。

a、ResetB拉低、PWND拉高;
b、DOVDD和AVDD同时上电;
c、电源稳定5ms后,拉低PWND,再过1ms,拉高ResetB;
d、20ms后初始化OV5640DESCCB寄存器。

e、通过IIC接口配置,配置目标为RGB565、30FPS、720输出格式;
f、FPGA接收来自OV5640的视频流数据输入,需要对摄像头完成相应的时序操作。

每次传输8bit,16bit为一个像素点,所以要进行数据转换8bit-16bit-32bit;
2)图像处理算法
边缘检测算法要求首先找到图片中物体的边缘,由于边缘处颜色变化一般比较明显,在工程上一般借助卷积滤波器实现,卷积滤波器相当于求导的离散版本。

针对图像进行边缘检测,有多种不同的滤波器算子,我们采用的Sobel滤波器算子图1,分别针对图像水平方向的边缘以及竖直方向的边缘,求和得出图像的边缘。

图1 滤波器算子
3)ZYNQ FPGA
ZYNQ 7000系列基于Xilinx 全可编程的扩展处理平台结构,芯片内部集成ARM 公司双核Cortex-A9处理器的处理系统(PS端)和基于Xilinx逻辑资源的可编程逻辑系统(PL端)。

芯片内拥有丰富的资源,PS端的ARMCortex-A9处理器包含DDR控制器、SPI控制器、SMC 控制器等多种控制器接口,同时提供SD/SDIO控制器、UART控制器等在内的多种I/O 接口。

PL端包含可配置逻辑块、数字信号处理资源以及模数转换器、HDMI接口、扩展接口等,同时芯片内部借助
AxI4协议,数据带宽高达4.8GB/s,实现Ps与PL端的高速互联,这些都为用ZYNQ 7000平台实现嵌入式图像传输系统提供有力的支撑。

4)vdma IP核(video dma)
Frame Buffers :选择vdma缓存几帧图像,这里默认是写通道和读
通道都设置相同的缓存帧数,具体设置多少帧合适一般根据应用来定,比如读写带宽相同,想用ddr作为一个乒乓buffer,那就可以设置成2帧,写第一个地址,读第二个地址,写第二个地址,读第一个地址。

这里面设置几帧,就要在vdma寄存器配置的时候设置几个帧起始地址。

Memory Map Data Width:代表数据到达AXI4总线上的位宽,比如这里设置成64,那就代表M_AXI_XX总线上的数据位宽是64bit,这时候如果stream上的数据是32bit,那vdma内部会有一个带宽转换模块,把数据拼成64bit。

Burst Size :AXI总线上突发传输的长度,一般设置为16
Stream Data Width:vdma与pl逻辑部分通过axistream协议交互数据,这里代表stream数据位宽
Line Buffer Depth:vdma内部会有一个行缓存fifo,stream数据会先写入fifo,然后AXI总线逻辑会读出到总线上,这个深度就代表fifo的深度。

设置原则(个人理解):如果AXI总线数据带宽是stream总线数据带宽的1.5倍以上,这个fifo深度可以设置的小一点,如果AXI
总线带宽小于1.5倍的stream总线带宽,那fifo的深度至少要是图像一个有效行的一半。

Advanced :这里面只说一下Fsync Options,这个信号是什么意思呢,就是告诉vdma什么时候开始运行,一般s2mm通道选择tuser,就是说在tuser 拉高的时候开始传输。

mm2s通道,可以选择none,也可以选择mm2s_fsync,这里介绍一下这两个的区别。

none :就是没有同步信号,但这并不是说没有开始信号,而是只要mm2s_stream通道tready拉高,就开始传输,相当于free模式
mm2s_fsync:当这个信号发生一个下降沿的时候开始传输,如果没有这个下降沿,即使mm2s_stream通道tready拉高也不会传输
下面是接口介绍:
M_AXI_XX :axi4总线接口,用来与ddr交互数据
M_AXIS_XX , S_AXIS_XX :axi stream接口,用来与pl交互数据S_AXI_LITE :控制总线,接到ps的gp口或者写一个axilite master 总线去配置。

相关文档
最新文档