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 复制代码
摄像头与显示器解耦
稳定视频输出
高带宽视频处理
相关推荐
微帧Visionular4 小时前
AI视频单帧清晰,播放时却闪烁,原因是什么?
人工智能·深度学习·音视频
szxinmai主板定制专家5 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
辰辰观影5 小时前
Windows网盘视频播放器推荐:无广告4K HDR怎么选
音视频
2601_966827457 小时前
电视端云盘在线播放怎么选?支持4K HDR的应用推荐
音视频
HQB20268 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
开开心心就好8 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
泛凡(Linyongui)9 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~10 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计11 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界11 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统