基于ZYNQ的照相机系统

数据源由 PS 通过向 DDR3 中写入OV5640摄像头输出的图像数据产生的,我们只使能了VDMA IP核的读通道,通过读通道来将AXI4 Memory Map格式的数据流转换成AXI4-Stream类的数据流。重点是将摄像头的图像数据写入VDMA IP核的帧缓存中,即DDR3内存中,即可实现摄像头的图像显示。 VDMA支持AXI4 Memory Map格式转换成AXI4-Stream格式,同时也支持AXI4-Stream格式转成AXI4 Memory Map 格式,因此可以通过VDMA将图像数据写入帧缓存中,也就是使能VDMA的写通道,来将图像数据写入帧缓存中。需要注意的是,我们需要先将图像数据转换成AXI4-Stream的格式,才能通过VDMA的写通道写入帧缓存中,Xilinx提供了Video in to AXI4-Stream IP核,可以实现视频数据流转成AXI4-Stream流,因此本次实验可以通过添加Video in to AXI4-Stream IP核实现数据格式的转换。 Video in to AXI4-Stream IP 核的输入端口为视频数据流,而OV5640摄像头输出的数据为行场同步信号控制的 8 位数据,这两个端口不可以直接连接,需要先经过数据的转换才能连接,因此本次实验通过添加了一个图像采集的IP核来实现这个数据的转换。

该系统是以 ZYNQ 作为主控系统。使用 OV5640 双目摄像头进行采 集图像,通过串口 发送‘c’进行捕获图片,将所捕获的图像存储在 SD 卡中,以达到实现拍照效果,同时使用 HDMI 显示屏进行实时显示 图像。

本次采用的是OV5640摄像头模块进行采集图像数据,将采集图像数据通过OV5640图像采集IP核将原始数据转换为视频流数据,在经过Video In to AXI-Stream IP核时,将视频流数据转换为AXI4-Stream格式,通过VDMA的写通道将AXI4-Stream格式转换成AXI4 Memory Map格式,并最终写入DDR存储器中。

VDMA 通过 AXI Smartconnect IP 核与 AXI_HP 接口进行连接,从而高效访问DDR3;

VDMI读通道从DDR3读取AXI4 Memory Map格式数据,并且将其转换成AXI4-Stream格式,AXI4-Stream to Video Out IP核在 VTC IP核的控制下,把AXI4-Stream 格式的数据转换成视频输出的数据格式,并将输出的视频数据流连接至DVI_Transmitter IP 核的输入端。

需要使能VDMA

读通道作用-(将AXI4 Memory Map格式的数据流转换成AXI4-Stream格式的数据流)-设置为动态同步锁相从模式

写通道作用-(将图像数据写入帧缓存中)将AXI4-Stream格式转换成AXI4 Memory Map格式--设置为动态同步锁相主模式。

VDMA作用:支持AXI4 Memory Map格式转换成AXI4-Stream格式,同时也支持AXI4-Stream格式转成AXI4 Memory Map 格式

Video In to AXI_Stream IP核作用:实现视频数据流转成AXI4-Stream流

Vedio Timing Controller IP核作用:AXI4-Stream to Video Out IP核在 VTC IP核的控制下,把AXI4-Stream 格式的数据转换成视频输出的数据格式

Video in to AXI4-Stream IP 核的输入端口为视频数据流,而OV5640摄像头输出的数据为行场同步信号控制的 8 位数据,这两个端口不可以直接连接,需要先经过数据的转换才能连接

图像采集IP核作用:图像原始数据(行场同步信号控制的8位数据)转换为视频流数据

DVI_Transmitter作用:将并行数据转换为TMDS信号,输出到HDMI显示器

在VDMA IP核的配置上,需要使能VDMA的写通道和读通道。并且对于本次使用来说,需要对帧缓存进行频繁的写入和读出,为了避免读通道和写通道同时访问同一帧缓存,那么VMDA必须配置成动态同步锁相模式,且帧缓存数量要大于等于3。由于分配过多的帧缓存区域对效率的提升已经微乎其微,且会占用更多的存储空间和消耗CPU的时间,因此本次实验将帧缓存空间设置为3,并采用动态同步锁相模式。 由于OV5640 摄像头需要经过初始化之后,才能正常工作。通过SCCB接口对OV5640 进行配置,SCCB端口是通过EMIO连接至PS中,SCCB的驱动由PS实现。

SCCB接口作用:由于OV5640 摄像头需要经过初始化之后,才能正常工作。通过SCCB接口对OV5640 进行配置,SCCB端口是通过EMIO连接至PS中,SCCB的驱动由PS实现

SCCB-(Serial Camera Control Bus,串行摄像头控制总线)

该总线控制着摄像头的图像数据格式、分辨率以及图像处理参数等

两线式

OV5640图像采集是我们自定义的IP核,负责将OV5640的数据转成视频流数据。

视频流数据经过Video in to AXI4-Stream IP核转换成AXI4-Stream IP格式数据流,然后通过 VDMA 的写通道转成 AXI4 Memory Map 格式,并最终写入 DDR 内存中。

VDMA 通过 AXI Smartconnect IP 核与 AXI_HP 端口进行连接,从而高效访问DDR3,VDMA从DDR3中读取的视频或图像数据传输给AXI4-Stream to Video Out IP核。AXI4-Stream to Video Out IP核在 VTC IP核的控制下,把AXI4-Stream 格式的数据转换成视频输出的数据格式,并将输出的视频数据流连接至DVI_Transmitter IP 核的输入端。

帧缓存

帧缓存(帧缓存存储器(Frame Buffer)(显存)):

为显示设备(如HDMI显示器、RGB LCD液晶屏等)提供数据缓存的一片存储区域;

一般图像输入源和图像显示的传输速率不匹配(如图像输入源传输速度较快或者图像显示端传输速度较快),这个时候需要一片存储区域来缓存输入的图像数据,以便显示设备读取数据,同时也方便后续对视频数据做图像处理。帧缓存的每一个存储单元对应屏幕上的一个像素,整个帧缓存对应一帧图像。

一般选择外置的DDR3存储器作为帧缓存,而不是选择片内的BRAM,这是由于ZYNQ片内的BRAM存储容量非常小。ZYNQ7010的BRAM存储容量为2.1Mbit,ZYNQ7020的存储容量为4.9Mbit

对于使用帧缓存存储器来缓存图像数据来说,可以采用单帧缓存或者多帧缓存的方案。单帧缓存是指图像的输入和图像的显示都是通过读写同一片存储区域来实现的。虽然也可以实现显示设备显示图像的功能,但这会带来一个问题,即读出的单帧图像是输入的两帧图像或者更多帧图像数据叠加在一起的结果,可能会导致显示设备显示的图像出现割裂的现象

同步锁相(Genlock)

图像输入端和输出端的数据速率不匹配,通常使用帧缓存来避免因速率不匹配而导致的潜在错误。为了解决单帧缓存区域带来的图像叠加问题,通过分配多个帧缓存区域保存数据,图像输入端在写入其中一个帧缓存时,输出端读取其它的帧缓存。 VDMA支持四种同步锁相模式,分别是Genlock Master(同步锁相主模式)、Genlock Slave(同步锁从模式)、Dynamic Genlock Master(动态同步锁相主模式)和Dynamic Genlock Slave(动态同步锁相从模式)。 VDMA有一个写通道(S2MM)和一个读通道(MM2S),用户通过写通道将输入端数据写入帧缓存,通过读通道将从帧缓存中读出数据。VDMA的每一个通道都可以选择以上四种模式中的一种。

Dynamic Genlock Master 动态同步锁相主模式

当写通道(S2MM)或者读通道(MM2S)配置为Dynamic Genlock Master时,该通道会跳过Dynamic Genlock Slave 通道正在操作的帧缓存,通过跳过或者重复一些帧缓存区域的方式来完成。 这里以分配三个帧缓存为例。当配置为Dynamic Genlock Master的通道访问帧缓存时,没有检测到Slave通道访问的帧缓存,那么它会循环访问帧缓存0 1 2 0 1 2;而如果检测到Slave访问的帧缓存区域,它们它会跳过该区域并开始访问下一帧缓存。因此,如果Slave通道长时间访问帧缓存1,则Master会循环访问帧缓存2和3。

Dynamic Genlock Slave 动态同步锁相从模式

当写通道(S2MM)或者读通道(MM2S)配置为Dynamic Genlock Slave时,该通道会操作 Dynamic Genlock Master 通道上一周期操作的帧。

OV5640 SCCB的写传输协议

基地址 (Base Address):硬件IP核在内存映射空间中的起始地址

作用:通过该地址可直接访问时钟控制器的寄存器

“请说明项目中PS端和PL端的具体分工,为什么将VDMA放在PL端?”

“PS端运行Linux和FATFS文件系统,负责SD卡存储逻辑、OV5640的I2C配置等控制密集型任务;PL端通过VDMA IP核实现摄像头数据到DDR3的高效搬运(AXI-Stream加速),同时生成HDMI时序。VDMA放在PL端是因视频流传输需要确定性延迟,硬件DMA比PS端软件搬运带宽提升15倍以上。”

“VDMA与DDR3之间的AXI接口类型?如何优化传输效率?”

使用AXI4-Full(Memory Map接口)实现高带宽突发传输

优化:配置128位总线宽度、4KB突发长度、双缓冲机制避免流水线停滞

“摄像头初始化时SCCB协议与I2C有何区别?遇到信号完整性问题如何解决?”

“SCCB省略了I2C的ACK/NACK机制,通过EMIO模拟时序时增加了3μs延时保证稳定性。

布线时发现PCLK串扰导致图像撕裂,通过降低PCB走线阻抗(50Ω→65Ω)和添加屏蔽层解决。”

“FATFS写入BMP文件时如何避免帧丢失?SDIO模式下的DMA配置流程?”

采用乒乓缓冲:VDMA写帧N+1时,PS端保存帧N

SDIO DMA配置:启用ADMA2模式,描述符链地址对齐64字节

memcpy操作前为何没有Cache刷新?直接操作DDR物理地址会有什么风险?

// 必须添加Cache刷新确保数据一致性

Xil_DCacheFlushRange(rd_fram_addr, vd_mode.height*vd_mode.width*3);

memcpy((void*)bmp_addr, (void*)rd_fram_addr, ...);

风险:ARM核有Cache,PL直接访问DDR会导致数据不一致(可能拷贝到旧帧

"XAxiVdma_StartParking冻结帧时,如何保证后续视频流不中断?"

"VDMA配置为三帧缓冲(FRAME_BUFFER_NUM=3),冻结帧N时,摄像头继续写入帧N+1/N+2"

"为什么读通道需要Parking,写通道不需要?"

写通道实时接收摄像头数据不能停止,读通道暂停可确保拍照时帧完整

"如果要求同时支持1080P视频录制,当前架构需要哪些改动?"

1. VDMA总线宽度扩至128bit

2. 启用DDR多端口仲裁

3. PL端添加H.264编码IP

4. 改用UDP传输替代SD卡存储

"BMP文件头使用全局数组,多任务调用会冲突吗?"

"pic_cnt和bmp_head是全局变量,中断场景下需加锁:

Xil_DCacheDisable(); // 关中断

pic_cnt++;

Xil_DCacheEnable();

"从输入'c'到图片保存完成需要多少毫秒?最耗时的操作是什么?"

实测约200ms,瓶颈在SD卡写入(BMP格式未压缩)。

优化方案:

改用JPEG编码(PL端硬件加速)

启用SDIO DMA传输

"f_write()写入期间会阻塞系统吗?如何优化?"

"创建独立线程处理存储,或使用VDMA帧结束中断触发非阻塞写入"

HP接口:

PL端的4个AXI HP接口直接连接着AMBA 总线,而AMBA又是直接连接着DDR3,这中间没有任何其他的存储设备。因此,PL端通过AXI的HP口可以直接访问DDR,而不需要经过CPU的约束。

对于GP接口(general purpose)通用目的接口,有四个接口(两个从端口,两个主端口);HP接口(high-performance purpose)高性能接口,有四个接口(四个都是从端口)。GP接口直接连接到的是中央互联区(central interconnect),然后由中央互联区再连接到OCM interconnect和存储器接口上;而HP接口直接连接到的是OCM interconnect和存储器接口。所以对于GP接口,通常使用他进行控制配置;而对于HP接口,通常使用它进行数据传输交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值