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 参考参数配置

vdma
在这里插入图片描述

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 参考参数配置

在这里插入图片描述
vtc

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使用的,大家可以不用理会
clkwiz

2.7.2 信号连接

首先是genclken的连接,genclken 用于控制 VTG 是否跟随外部参考信号同步,这里需要连接
genclken
其次需要将显示链路各个模块的clk连接起来,统一到一个时钟源(72M),主要是VTC和VOUT,如果还有信号转换,那也需要连接。然后vid_data,hsync,vsync这些信号就是实际的图像信号输出,如果没有转换步骤的话一般就可以输出了,我这里后端是还连接了转换模块
72M
其余信号,AXI接口基本就是AUTO一下,整体block design如图
在这里插入图片描述
这里的PWM IP是我用来驱动LCD背光的,其实初期调试直接拉高也没啥问题。然后建议大家综合的时候就先综合一个ILA进去,方便后续查找链路问题

2.7.3 约束

大家如果和我一样使用LVDS,可以参考一下,其他的不用理会:
xdc


小结

本篇在Vivado上实现了图像输出链路的搭建,欢迎读者点赞、收藏、评论,如有错误也欢迎评论、私信沟通指正,下一篇将介绍软件驱动与显示实现。


作者:Jafi


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐