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 复制代码
摄像头与显示器解耦
稳定视频输出
高带宽视频处理
相关推荐
崇山峻岭之间13 分钟前
单片机按键实验
单片机·嵌入式硬件
XMAIPC_Robot13 分钟前
深度无人机自动驾驶仪,中小型无人机硬件在环仿真飞行
运维·arm开发·人工智能·fpga开发·无人机·边缘计算
踏着七彩祥云的小丑18 分钟前
嵌入式测试学习第 16 天:复位电路、电源电路基础原理
单片机·嵌入式硬件
小手智联老徐28 分钟前
Arduino IDE环境搭建与点亮ESP32 D1板载LED
嵌入式硬件·esp32·arduino
yong999043 分钟前
STM32 LoRaWAN Ping-Pong 节点方案
stm32·单片机·嵌入式硬件
chao18984444 分钟前
基于MATLAB的音频信号AM调制与解调实现
开发语言·matlab·音视频
模拟IC攻城狮1 小时前
(最新)华为 2025届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
嵌入式硬件·华为·硬件架构·pcb工艺·模拟芯片
我先去打把游戏先1 小时前
Ubuntu虚拟机(服务器版本)Git安装教程(附常用命令)——从零开始掌握版本控制
服务器·c语言·c++·git·嵌入式硬件·物联网·ubuntu
m0_634666731 小时前
Stability Audio 3.0 把 AI 音乐推过了一个门槛:从“音频片段”走向“完整歌曲”
人工智能·音视频
2的n次方_1 小时前
健身 Agent:不止视频,更有 AI 人物实时跟练交互
人工智能·音视频·交互·魔珐星云