1. 从零开始:为什么需要VDMA和HDMI协同工作?
如果你玩过ZYNQ,肯定遇到过这样的场景:PS(处理器系统)端生成了一幅漂亮的图像,或者从摄像头、SD卡里读取了一堆像素数据,你迫不及待地想把它显示在HDMI显示器上。这时候,你可能会想,直接把数据从PS的DDR内存里“扔”给PL(可编程逻辑)不就行了吗?理论上可以,但实际做起来,你会发现这条路坑特别多。
我刚开始做图像显示的时候,就踩过这个坑。直接用PS去控制PL的像素输出,CPU占用率直接飙到100%,画面还卡顿、撕裂,根本没法看。问题的核心在于,PS和PL之间、PL和显示器之间,存在着巨大的“速度差”和“节奏差”。PS处理数据是“突发性”的,而显示器刷新屏幕是“匀速、不间断”的,就像一个水龙头(PS)和一个匀速转动的传送带(显示器),水龙头开开关关,水时大时小,传送带上的水渍肯定不均匀。
这时候,VDMA(Video Direct Memory Access) 就登场了,它本质上是一个为视频流量身定做的DMA(直接内存访问)控制器。它的作用就像一个专业的“调度员”加“缓冲仓库”。PS只需要把一整幅图像数据安心地放在DDR这个“大仓库”里,告诉VDMA:“货在这儿,你负责送出去”。VDMA就会自动、持续地从DDR里读取数据,通过高效的AXI4-Stream通道,以稳定、连续的流形式发送给下游的显示模块。整个过程完全由硬件完成,不占用CPU资源,CPU解放出来可以去处理更复杂的算法,比如图像识别、滤镜处理等等。
而HDMI接口,则是我们通向显示器的“最后一公里”。它需要将原始的RGB像素数据,按照非常严格的时序(比如1080p@60Hz),打包成TMDS差分信号发送出去。这个时序控制极其精密,差一点都可能导致花屏、无显示。
所以,ZYNQ-VDMA与HDMI的协同,就是构建一条从DDR内存到显示器屏幕的“高速公路+标准化物流体系”。VDMA负责从内存仓库高效、稳定地取货、发货,HDMI相关IP负责将货物打包成显示器能接收的标准格式并准时送达。理解了这套协作关系,后面的具体操作就都有了清晰的脉络。
2. 硬件架构搭建:像搭积木一样连接核心IP
纸上谈兵终觉浅,咱们直接上手在Vivado里把系统搭起来。这个过程就像用乐高积木搭建一个机器,每个IP核都是一块功能明确的积木。我用的是Vivado 2022.2和PYNQ-Z2开发板,不同版本界面可能略有差异,但核心思想完全一样。
2.1 核心积木块介绍
在动手连线之前,我们先认识一下今天要用的几块关键“积木”:
- ZYNQ7 Processing System (PS): 这是系统的核心和“大脑”。我们需要配置它,开放与PL通信的“港口”。
- AXI VDMA: 今天的“运输大队长”。负责在DDR和AXI4-Stream之间搬运视频数据。
- AXI4-Stream to Video Out: “格式转换器”。把VDMA输出的流数据,转换成带有行同步(HSync)、场同步(VSync)等信号的视频时序接口。
- Video Timing Controller (VTC): “节奏大师”。产生精确的视频时序信号(如1080p的时序),告诉Video Out模块什么时候输出有效像素,什么时候是消隐区。
- Dynamic Clock (DynClk) & DVI/HDMI Transmitter: “时钟发生器”和“信号发射器”。DynClk根据所需分辨率动态产生像素时钟(如148.5MHz for 1080p@60Hz)。DVI Transmitter(很多开发板提供的IP)将并行RGB数据和时序信号编码成HDMI所需的TMDS差分信号。
2.2 配置PS:打开数据通道和时钟
新建Block Design后,第一件事就是双击ZYNQ7 IP进行配置。
- 开启HP端口:这是高速数据通道。在PS-PL Configuration > HP Slave AXI Interface下,勾选
S_AXI_HP0。这意味着我们允许PL作为主机,通过这个高性能端口来读取PS端DDR里的数据。数据宽度通常保持64-bit以获得最大带宽。 - 开启GP端口:这是控制通道。在同一个页面,勾选
M_AXI_GP0。这个端口是PS作为主机,用来配置PL端的各个IP核(如VDMA、VTC)的寄存器。你可以把它理解为“管理通道”。 - 配置时钟:在Clock Configuration > PL Fabric Clocks下,使能
FCLK_CLK0和FCLK_CLK1。FCLK_CLK0设为100MHz,作为系统控制总线(如GP端口)的时钟。FCLK_CLK1<


1万+

被折叠的 条评论
为什么被折叠?



