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 复制代码
摄像头与显示器解耦
稳定视频输出
高带宽视频处理
相关推荐
智塑未来6 小时前
FPGA开发板怎么选?先看资质、案例与研发底盘
fpga开发
AOI小白新手上路14 小时前
江科协51单片机 17-2 红外遥控电机调速实验调试总结
单片机·嵌入式硬件·51单片机
oshan201216 小时前
零基础STM32入门教程--10-PWM 呼吸灯
stm32·单片机·嵌入式硬件
2601_9556624616 小时前
AI 配音工具 7 款实测:短视频、影视解说、小说推文音质横向对比
人工智能·音视频·语音识别·视频
记帖17 小时前
STM32C5A3R开发(7)----ADC电压采集
嵌入式硬件·adc·dac·stm32cubeide·stm32c5·stm32cubemx2·stm32c5a3rgt6
阿童木写作17 小时前
跨境电商图片翻译工具,批量翻译视频字幕一键抠图
人工智能·python·音视频
自小吃多19 小时前
器件移动、旋转、镜像、对齐、等间距操作笔记
笔记·嵌入式硬件
jianqiang.xue20 小时前
智能体整体架构设计:四大模块与目录组织
单片机·嵌入式硬件·物联网·架构·esp32
minglie121 小时前
黑金AX301的SDRAM
fpga开发
东莞市永盛电气1 天前
三相208V变380V变压器,出海工业设备供电适配方案
python·单片机·嵌入式硬件