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 复制代码
摄像头与显示器解耦
稳定视频输出
高带宽视频处理
相关推荐
KaifuZeng5 小时前
电路面试问题汇总一
单片机·嵌入式硬件·面试·电路
CHY_1285 小时前
Arm Ethos‑U65:YOLOv8n 模型准备与 Vela 编译
arm开发·人工智能·yolo·目标检测
Freedom_my6 小时前
STM32简单项目
stm32·单片机·嵌入式硬件
GeekArch7 小时前
第8讲:裸机单片机项目——Vibe快速迭代的最优边界
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·ai编程
Delta-delta7 小时前
M85-GCC13.3-CMSIS-接入笔记
笔记·单片机·嵌入式硬件
caimouse7 小时前
Phase1Initialization 函数分析
单片机·嵌入式硬件·reactos
2401_8275012819 小时前
51单片机(二):GPIO、中断、定时器与PWM
单片机·嵌入式硬件·51单片机
三易串口屏20 小时前
音频控件使用教程
音视频·工控·串口屏·三易串口屏
尼喃21 小时前
HDMI/DP高速差分接口ESD保护:0.3pF超低电容PWESD-5VSDF方案详解
嵌入式硬件
ACP广源盛1392462567321 小时前
GSV6155@ACP# 搭配 AI 服务器、AI PC 完整适配方案
大数据·服务器·人工智能·分布式·单片机·嵌入式硬件