ZYNQ + OV5640 视频系统开发(三):AXI VDMA 帧缓存原理

文章目录

    • [一、为什么视频系统需要 FrameBuffer](#一、为什么视频系统需要 FrameBuffer)
    • [二、AXI VDMA 的作用](#二、AXI VDMA 的作用)
    • [四、FrameBuffer 的工作流程](#四、FrameBuffer 的工作流程)
    • [五、为什么使用 Triple FrameBuffer](#五、为什么使用 Triple FrameBuffer)
    • [六、VDMA 关键参数](#六、VDMA 关键参数)
    • [七、VDMA 的优势](#七、VDMA 的优势)
    • 八、小结

一、为什么视频系统需要 FrameBuffer

在 FPGA 视频系统中,摄像头和显示器的工作方式完全不同。

摄像头输出是:

bash 复制代码
连续视频流

也就是:

bash 复制代码
Camera → 按像素连续输出

而显示设备需要的是:

bash 复制代码
稳定帧数据

也就是说:

bash 复制代码
Display → 按固定时序读取整帧

如果直接把摄像头连接到显示器,很容易出现:

bash 复制代码
撕裂
丢帧
时序错乱

因此必须在中间加入:

bash 复制代码
FrameBuffer(帧缓存)

通常使用 DDR 存储器 来实现。

二、AXI VDMA 的作用

在 ZYNQ 视频系统中,最常用的帧缓存 IP 是:AXI VDMA

VDMA 的作用是:

bash 复制代码
在 AXI Stream 和 DDR 之间搬运视频数据

VDMA 具有两个方向的数据通道:

三、视频数据流结构

典型的视频系统结构如下:

bash 复制代码
Camera
   ↓
Video In to AXI4-Stream
   ↓
VDMA (S2MM)
   ↓
DDR FrameBuffer
   ↓
VDMA (MM2S)
   ↓
AXI4S to Video Out
   ↓
Display

数据流可以理解为:

bash 复制代码
摄像头写DDR
显示器读DDR

四、FrameBuffer 的工作流程

假设系统分辨率为:800 × 600

VDMA 的工作流程如下。

第一步

摄像头数据进入 AXI Stream:

bash 复制代码
AXIS_TDATA
AXIS_TVALID
AXIS_TREADY

第二步

VDMA S2MM 将数据写入 DDR:

bash 复制代码
DDR Address + FrameOffset

例如:

bash 复制代码
Frame0 → 0x10000000
Frame1 → 0x10100000
Frame2 → 0x10200000

第三步

VDMA MM2S 从 DDR 读取数据:

bash 复制代码
DDR → AXI Stream

再送到显示模块。

五、为什么使用 Triple FrameBuffer

很多视频系统都会使用:

bash 复制代码
Triple FrameBuffer

也就是:

bash 复制代码
3 帧缓存

结构如下:

bash 复制代码
Frame0
Frame1
Frame2

这样做的好处是:避免读写冲突

当系统运行时:

bash 复制代码
Frame0 → 正在显示
Frame1 → 正在写入
Frame2 → 空闲

下一帧再循环。

这样可以避免:读写同一帧

导致画面撕裂。

六、VDMA 关键参数

在配置 VDMA 时,需要设置几个关键参数。

Horizontal Size

bash 复制代码
hsize = width × bytes_per_pixel

例如:

RGB565:800 × 2 = 1600

RGB888:800 × 3 = 2400

Vertical Size

bash 复制代码
vsize = height

例如:600

Stride

Stride 表示:

bash 复制代码
每一行占用多少字节

通常:stride = hsize

七、VDMA 的优势

使用 AXI VDMA 作为 FrameBuffer 有几个优势:

1 、支持高带宽视频

VDMA 可以支持:

bash 复制代码
1080p
4K

级别的视频流。

2 、自动帧管理

VDMA 内部可以自动管理:

bash 复制代码
Frame Buffer

不需要 CPU 参与。

3 与 AXI4-Stream 完美配合

视频 IP 核普遍使用:

bash 复制代码
AXI4-Stream

VDMA 可以直接连接这些模块。

八、小结

AXI VDMA 是 FPGA 视频系统中最核心的 IP 之一。

它的作用可以总结为:

bash 复制代码
视频流 → DDR → 视频流

通过 FrameBuffer,可以实现:

bash 复制代码
摄像头与显示器解耦
稳定视频输出
高带宽视频处理
相关推荐
xiangw@GZ2 小时前
功耗测量:基于INA226的功耗测量原理深度解析
嵌入式硬件
Strange_Head2 小时前
快速入门 MQTT:从 Broker、发布订阅到双机通信
嵌入式硬件
Hello World . .3 小时前
Linux:Linux命令行音视频播放器
linux·音视频
LCG元3 小时前
STM32实战:基于STM32F103的MQTT协议通信(EMQ X Broker)
stm32·单片机·嵌入式硬件
zmj3203243 小时前
51单片机
单片机·嵌入式硬件·51单片机
zmj3203243 小时前
MCS-51单片机
单片机·嵌入式硬件·51单片机
飞翔的SA3 小时前
MLX‑VLM :Mac本地跑通多模态大模型的开源项目!让图片、音频、视频理解一键上手
人工智能·python·macos·音视频
小柯博客3 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(八)
c语言·git·stm32·单片机·嵌入式硬件·嵌入式·yocto
421!12 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习