3.1 ZYNQ 图像采集显示系列-显示部分(一):系统路径与 Vivado 显示链路搭建
3.1 ZYNQ 图像采集显示系列-显示部分(一):系统路径与 Vivado 显示链路搭建
前言
嵌入式图像处理系统中,ZYNQ SoC 凭借其将 可编程逻辑(PL)与处理系统(PS)深度耦合的架构,成为图像显示领域的理想选择。相比传统 MCU 或纯 FPGA 方案,ZYNQ 具备独特优势:硬件加速能力强,PL 可用于高速图像数据通路(如 VDMA、图像格式转换、颜色空间转换、时序控制等),实现低延迟、高带宽处理。
题外话:最近比较忙,写的断断续续,草稿框架搭好之后就扔着了。有些问题有些想法可能搞的火热的时候记忆深刻,但是一旦被打断,常常不知道自己进行到哪里,想再拾起如果没有先前的记录,又得好一段挣扎,所以随手写个blog更显得重要了
1. 整体实现路径
1.1 图像流路径
PS (ARM 核生成或获取图像数据)
↓ AXI HP 接口
VDMA(AXI 内存到视频流)
↓ AXI4-Stream
Video Timing Controller(生成显示时序)
↓ AXI4-Stream + Sync 信号
Video Out (RGB Output)
↓ RGB 信号
信号转换模块(可根据实际需求修改或省略)
↓ 信号输出
目标显示屏
1.2 数据流说明:
-
图像数据生成:
图像内容在 PS 中生成(可来自内存、摄像头、或软件合成)。
数据通过 AXI HP 接口 写入 DDR 中预分配的帧缓存区域。 -
VDMA 读取图像帧:
PL 中的 VDMA IP 核 通过 AXI 读取 DDR 中的图像帧缓存。
输出为标准 AXI4-Stream 视频流格式。 -
Video Timing Controller(VTC):
负责输出显示所需的同步信号(vsync、hsync、active video 等)。
同步 AXI 视频流与物理显示接口。 -
Video Output:
将 AXI4-Stream 视频数据与时序整合为 RGB888(或 RGB565等)格式输出。
该输出可以直接驱动标准 RGB 屏幕,或进入后级转换模块。 -
信号转换:
使用 FPGA 自定义逻辑将并行 RGB 信号转换为 如HDMI信号、 LVDS 差分信号等。 -
显示屏显示:
最终接收信号的显示终端,按照配置的分辨率和刷新率正常显示图像内容。
2. Vivado 综合设计
2.1 整体链路
┌─────────────────────┐
│ PS (ZYNQ) │
│---------------------│────────────────可选──────────────┐
│ DDR3, AXI HP, GPIO │ │
└─────────┬───────────┘ │
│AXI_HP (S2MM) │
▼ ▼
┌───────────┐ ┌────────────────────────┐
│ VDMA │ ← 配置使用 AXI-MM2S │ Video Timing Controller│ ← 输出显示同步信号 (vsync/hsync)
└────┬──────┘ └────────┬───────────────┘
│AXI4-Stream │
▼ ▼
└──────────┐ ┌────────────────────────┘
└────┬──────┘
▼
┌──────────────┐
│ Video Out │ ← RGB888 or another
└────┬─────────┘
│
▼
┌────────────────────┐
│ RGB 信号转换逻辑 │
└────────┬───────────┘
│
▼
┌──────────────┐
│ 约束管脚 │
└──────────────┘
2.2 PS 核心配置
2.2.1 HP 接口
在 ZYNQ 架构中,PS与 PL之间通过多种 AXI 接口连接,其中用于高速数据传输最关键的是 High Performance(HP)接口。VDMA 从 DDR 中读图像数据需要高带宽、低延迟传输,HP 接口是 ZYNQ 提供的 64-bit 高速 AXI 接口,可由 PL 侧 IP(如 VDMA)访问 PS 的 DDR 内存,故我们需要启用该接口
2.2.2 PCLK
我们还需要一个PCLK作为时钟源,作为 PL 内部各 AXI IP 的时钟源。在之前的篇章中已经启用了 100MHz 的 PCLK0,这里简要说明其作用与配置建议:
PCLK 的作用是为 PL 中的 AXI 总线、VDMA、VideoOut 等模块提供统一且稳定的时钟,通常建议设置为 100MHz~150MHz,这是兼顾时序收敛和带宽需求的一个通用配置。对于本项目中1280×800@60Hz 的显示需求,100MHz 的 PCLK 已经完全足够,既能满足 AXI4-Stream 的时序,又便于后续使用 ILA 进行调试。
2.3 VDMA IP
2.3.1 主要配置参数介绍
本次为图像显示路径,VDMA 仅使用 读通道(Read Channel),从 DDR 中读取帧缓存并输出 AXI4-Stream 数据。
Basic:
| 参数名 | 推荐设置 | 说明 |
|---|---|---|
| Enable Read Channel | 开启 | 启用从 DDR 到 AXI4-Stream 的读取通道 |
| Address Width | 32 | 地址宽度,一般默认设置为 32 位 |
| Frame Buffers | 2 或 3 | 帧缓存数量,支持帧轮转显示(我使用4帧是因为下一篇测试需要,实际使用3帧比较合适) |
| Memory Map Data Width | 64-bit | AXI 总线数据宽度,需与 HP 接口匹配(如 64-bit) |
| Read Burst Size | 16 | AXI 突发读传输最大长度,推荐 16 提高效率 |
| Stream Data Width | 16-bit / 24-bit | 视频数据宽度,对应 RGB565 或 RGB888,我这边使用RGB888 |
| Line Buffer Depth | ≥ 2048 | 行缓冲深度,需大于或等于一行像素的数据量 |
Advanced:
| 参数名 | 推荐设置 | 说明 |
|---|---|---|
| Genlock Mode | Dynamic-Slave | 同步锁相,动态微调自己的播放时钟 来逐渐对齐,尽量避免跳帧 |
| FSync Options | None | 一般显示路径无需帧同步,设置为 None |
| Allow Unaligned Transfers | 勾选 | 允许对齐传输 |
2.3.2 参考参数配置


2.4 Video Timing Controller(VTC)IP
这个IP是尤为重要的,它负责的就是图像时序\同步信号的控制,最终图像是否能正确显示,很多都要看他设置的对不对
2.4.1 主要配置参数介绍
本项目只有一个显示屏,使用固定分辨率,所以这边使用固定配置,如果需要分辨率切换什么的,可以打开AXI接口,在软件部分调整相关配置参数
Detection/Generation
| 参数名 | 推荐设置 | 说明 |
|---|---|---|
| Include AXI4-Lite Interface | 关闭 | 若需要通过 AXI 配置 VTC 才开启,固定配置时可关闭 |
| Include INTC Interface | 关闭 | 中断接口,常规应用无需 |
| Interlaced Video Support | 关闭 | 是否支持隔行,LCD/HDMI 通常逐行,建议关闭 |
| Synchronize Generator to Detector/FSYNC | 关闭 | 是否与外部检测或 fsync 对齐,普通模式可关闭 |
| Max Clocks Per Line | 4096 | 每行最大时钟数上限,保持默认即可 |
| Max Lines Per Frame | 4096 | 每帧最大行数上限,保持默认即可 |
| Frame Syncs | 1 | 帧同步输出个数,1 路常见 |
| Enable Generation | √(开启) | 启用时序生成 |
| Enable Detection | 关闭 | 若只需生成时序无需检测,关闭即可 |
| Generation Options – Vertical Blank | √ | 生成垂直消隐信号 |
| Generation Options – Horizontal Blank | √ | 生成水平消隐信号 |
| Generation Options – Vertical Sync | √ | 生成 VSYNC 信号 |
| Generation Options – Horizontal Sync | √ | 生成 HSYNC 信号 |
| Generation Options – Active Video | √ | 生成有效视频区信号 |
| Generation Options – Active Chroma | 关闭 | 色度信号,RGB 模式可关 |
Default/Constant
我的屏幕采用的1280*800分辨率,IP没有可选项,所以我这边采用自定义参数,这些参数基本都在屏幕技术规格书中,大家可以根据自己的屏幕调整,主要就这些注意参数,其他基本保持默认就行。实在不知道怎么确认自己的屏幕相关参数,一般都有一定的标准,网上也有很多网站可以直接计算,大家自行搜罗吧。
| 参数名 | 推荐设置 | 说明 |
|---|---|---|
| Video Mode | Custom | 自定义分辨率 |
| Horizontal Active | 1280 | 有效水平像素点数 |
| Horizontal Frame | 1440 | 每行总像素数(含消隐+同步区) |
| HSync Start | 1360 | 行同步起始位置 |
| HSync End | 1370 | 行同步结束位置 |
| Vertical Active | 800 | 有效垂直像素点数 |
| Vertical Frame | 823 | 每帧总行数(含消隐+同步区) |
| VSync Start | 810 | 帧同步起始行 |
| VSync End | 813 | 帧同步结束行 |
| Active Polarity – Vblank | High | 垂直消隐信号有效电平 |
| Active Polarity – Hblank | High | 水平消隐信号有效电平 |
| Active Polarity – Vsync | High | 垂直同步信号有效电平 |
| Active Polarity – Hsync | High | 水平同步信号有效电平 |
| Active Polarity – Active Video | High | 有效视频区信号高电平有效 |
2.4.2 参考参数配置


2.5 Video Output IP
2.5.1 主要配置参数介绍
| 参数名 | 推荐设置 | 说明 |
|---|---|---|
| Pixels Per Clock | 1 | 每个时钟周期传输一个像素,常见配置 |
| Video Format | RGB | 输出格式为 RGB,可选 YUV 等(需匹配实际显示屏) |
| AXIS Video Input Component Width | 8 | AXI4-Stream 输入单个分量的位宽,一般AUTO |
| Native Video Output Component Width | 8 | 实际输出到屏幕信号的分量位宽,建议与输入一致 |
| FIFO Depth | 1024或更大 | 内部缓冲 FIFO 深度,确保防止数据中断(VDMA 与输出时钟异步时尤为重要) |
| Clocking Mode | Independent | 常用设置,允许 AXIS 接口与 Video Output 使用不同时钟域 |
| Timing Mode | Slave | 表示由外部模块(如 VTC)提供时序控制信号(vsync、hsync、active_video) |
| Hysteresis Level | 12 | 滞后等级,建议小一点,保持默认即可 |
2.5.2 参考参数配置

2.6 图像输出转换
2.6.1 常见输出接口
| 接口类型 | 描述 | 应用场景 |
|---|---|---|
| RGB | 最基础的 RGB 输出格式 | TFT LCD、RGB 屏 |
| LVDS | 低压差分信号,常用于工业屏/笔记本屏 | BOE 屏、医疗级显示屏 |
| HDMI | TMDS 差分信号,适配电视/显示器 | 通用 HDMI 显示输出 |
| MIPI DSI | 串行高速接口,用于移动设备 | OLED、手机屏 |
2.6.2 个人选择的接口转换(RGB TO LVDS)
我个人使用的显示屏为 LVDS 接口屏幕,LVDS是一种高速、低功耗的差分信号传输方式,常用于笔记本、工业屏、医疗屏等高分辨率显示场景。 VideoOut IP 默认输出为标准的 并行 RGB 信号,但 LVDS 屏要求输入为 串行的差分信号,因此需要在 PL 端实现 RGB 到 LVDS 的转换。
这里对我个人的实现方式进行简述,后续有机会可以单开一篇详细介绍:
从 VideoOut IP 输出的 RGB888信号 + 同步信号(hsync/vsync/de),通过 FPGA 内部逻辑将这些信号串化分配到 4 组数据通道 + 1 组时钟通道,使用差分输出原语将信号转换为符合 LVDS 规范的电平;
2.7 BLOCK DESIGN 与输出综合
2.7.1 时钟设计
我这里采用clocking wizard输出72M时钟,这个时钟基本就是显示链路的基准驱动时钟了,不同的显示屏这个值各不相同
看到还有一个506.8M的时钟,这个是我用于RGB转LVDS使用的,大家可以不用理会
2.7.2 信号连接
首先是genclken的连接,genclken 用于控制 VTG 是否跟随外部参考信号同步,这里需要连接
其次需要将显示链路各个模块的clk连接起来,统一到一个时钟源(72M),主要是VTC和VOUT,如果还有信号转换,那也需要连接。然后vid_data,hsync,vsync这些信号就是实际的图像信号输出,如果没有转换步骤的话一般就可以输出了,我这里后端是还连接了转换模块
其余信号,AXI接口基本就是AUTO一下,整体block design如图
这里的PWM IP是我用来驱动LCD背光的,其实初期调试直接拉高也没啥问题。然后建议大家综合的时候就先综合一个ILA进去,方便后续查找链路问题
2.7.3 约束
大家如果和我一样使用LVDS,可以参考一下,其他的不用理会:
小结
本篇在Vivado上实现了图像输出链路的搭建,欢迎读者点赞、收藏、评论,如有错误也欢迎评论、私信沟通指正,下一篇将介绍软件驱动与显示实现。
作者:Jafi
更多推荐

所有评论(0)