文章目录
-
- [一、为什么视频系统需要 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
摄像头与显示器解耦
稳定视频输出
高带宽视频处理