ZYNQ PS VDMA②
1. 今日摸鱼任务
学习使用PS端显示TFT屏幕 |
小梅哥教材: 03_【裸机教程】基于C编程的Zynq裸机程序设计与应用教程v2.4.5.pdf 18.7 VDMA 设计实例 |
2. 制作图像数据文件
使用Img2Lcd.exe生成一个.h文件 小梅哥 ACZ702 型 Zynq 开发板资料\盘 A_ACZ702 开发板标准配套资料 \ 05_驱动和软件\02 常用工具和附件 |
LCD 屏的分辨率为 800*480 ,我们要确保输出的图像大小与该值接近,多余部分 不会被显示。 |
![]() |
红色框为固定选择 |
蓝色框的比例按照自己的图片调整一下,接近800:480是合适的 |
可爱女儿图片的pic.h可以下载,SDK后面用到 |
3.硬件逻辑设计
①导入IP核 |
【zynq课程笔记】【裸机】【第20课 】【基于VDMA的RGB TFT显示】 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! 创建工程后,将例程中的ip_repo文件夹复制到新建的工程文件夹中 然后在工程中添加: 点击Apply即可 |
本次设计所需添加的 IP 核如下 |
|
AXI-VDMA IP 核 功能与 DMA 相似,是一种用来快速传送数据的 IP 核,为数据快速进出DDR 提供一种便捷的方案。该 IP 核可以提供内存和 AXI流视频类型的目标外设之间的高带宽存储访问,这类目标外设包括支持 AXI4- Stream 视频协议的设备。初始化状态和管理寄存器等操作可以通过 AXI4-Lite 从接口访问。很多视频应用需要帧缓冲来处理帧速率变化,图像尺寸变化(拉伸),而该 IP 核的帧缓存功能刚好满足要求。同时, AXI-VDMA 被设计用来允许 AXI4- Stream 接口和AXI4内存映射接口之间的高带宽访问。 AXI-Stream to Video Out IP 核 AXI-Stream to Video Out IP 核用于将 AXI4-Stream 数据流转换成视频协议的数据流,该 IP 核与 VTC IP 核共同工作,内核配置为从模式,接收 VTC 内核的定时信号,生成视频输出信号。这使得设计人员能够快速方便地将具有 AXI4-Stream 接口的视频处理模块连接到外部视频接收器。 Video Timing Controller ( VTC ) IP 核 VTC IP 核是一个通用的视频定时发生器和检测器,该 IP 核的输入端自动检 测水平和垂直同步脉冲、极性、消隐、定时和视频像素。输出端产生标准视频 系统中使用的水平和垂直的消隐和同步脉冲,并支持可编程脉冲极性。这个 IP 核其实可以就看做是一个时序发生器,产生显示器输出所需要的时序信号,有 了此核之后,那些各种显示消隐区也就不需要怎么考虑了,可以省心很多。 Dynamic Clock Generator IP 核 关于 Dynamic Clock Generator IP 核,该 IP 核是来自 Digilent 的开源 IP,该IP 核可以实现动态的时钟功能,我们使用 AXI 接口更改里面的相应寄存器值, 就可以更改该 IP 输出的时钟频率。对于为什么要使用该 IP,原因是不同型号的 LCD 有可能需要不同的输入时钟频率,使用该 IP 核即可在初始化时更改时钟频率,以此适配多种不同型号的 LCD 显示屏。 rgb to lcd IP 核 rgb to lcd IP 核为我们封装好的 IP 核,用于 LCD 屏的图像显示,该核无需配置,导入后直接添加使用即可。该核会将接受到的 RGB888 格式数据转换为RGB565 ,同时生成背光信号,输出到 LCD 屏显示。 rgb565to888 核 该核为自定义 IP 核,用于对 RGB565 格式数据各个颜色分量的低位补零,进而转变为 RGB888 格式数据。除了格式转换,该核还支持大小端转换(数据高低排列顺序)。 |
②ZYNQ核配置 |
DDR UART1(调试) HP 图像数据被存在于 DDR 中,读取到 VDMA 中进行转换和显示 因此需要在 DDR(PS)与 VDMA (PL)间进行大量的数据传输 PL Clock 配置后 |
③VDMA核配置 |
本次设计 VDMA 用于从 DDR 中读取数据输出到 PL,不需要用到多缓存,所以帧缓存选择 1 。 本次设计只需从 DDR 中读取数据,所以只需使能读通道,突发读的大小设定为 64,因为使用的数据格式为 RGB565 ,所以 Stream Data Width 设置为 16 ,行缓冲宽度设置为 1024 。 Address Width : VDMA 读取 DDR 中的图像数据并输出到 PL ,地址位宽与 DDR 一致,即 32 位。 Frame Buffers :本次设计图像数据提前存储在了 DDR中,不需要使用多帧缓存,因此设置为 1 。 Enable Write/Read Channel :本次设计只用 VDMA 的读通道,用以读取 DDR 内图像数据。 Memory Map Data Width :本次设计中即 VDMA 与 HP 接口间数据传输的位宽,使能 HP 接口时,我们保持的默认值 64,所以这里也设置为 64 。 Read Burst Size :突发读长度,这里保持默认值即可。 Stream Data Width : VDMA 与 PL 侧的接口位宽,DDR 数据为 RGB565 ,因此该项设置为1 6 位。 Line Buffer Depth :行缓冲深度,类似于 fifo 缓存,以 Stream Data Width 为单位,这里设置为 1024 。 配置后(无S2MM) ![]() |
④Video Out核配置 |
使用独立时钟进行控制,时钟模式一栏选择 Independent Pixels Per Clock:时钟像素,指定并行输出的像素数,该项会影响输入和输出的数据总线宽度,每个时钟像素的选项为 1 , 2 或 4 。 Video Format:视频格式,选定的格式会决定颜色分量的个数, 颜色分量个数 x 时钟像素 x 颜色分量位宽 = 视频总线位宽 视频格式宽度四舍五入到最接近 8 的整倍数→ AX4-Stream 数据总线的位宽 这里保持的默认自动选项,设置为 RGB格式,即有三个颜色分量。 AXI4S Video Input Component Width :输入的图像数据颜色分量位宽。 Native Video Output Component Width:输出的图像数据颜色分量位宽。 配置后 在 RGB 模式下, Video Out 核输入输出的颜色分量位宽最低只能设置为 8 ,因此本次设计中输入输出 Video Out 核的数据为 RGB888 格式,需要使用 rgb565to888 核将 rgb565格式图像数据转换为 rgb888 。 |
⑤VTC核配置 |
本次设计用来生成时序信号,所以只需使能生成选项,取消检测选项的使能, 其余保持默认即可 Include AXI4-Lite Interface : IP 核将生成一个 AXI4 Lite 接口,该接口允许动态编程和更改处理参数。 Max Clock Per Line : VTC 核可以生成或检测的每行视频数据的最大时钟周期数。使用默认值。 Max Lines Per Frame : VTC 核可以生成或检测的每个视频帧的最大行数。使用默认值。 Frame Syncs:该项设置要生成的帧同步输出的数量,这里保持默认值 1。 Vertical Blank Generation :此参数启用 / 禁用生成垂直空白输出。 Horizontal Blank Generation :此参数启用 / 禁用生成水平空白输出。 Vertical Sync Generation :此参数启用 / 禁用生成垂直同步输出。 Horizontal Sync Generation:此参数启用 / 禁用生成水平同步输出。 Active Video Generation :此参数启用 / 禁用生成有效视频输出。 Active Chroma Generation :此参数启用 / 禁用生成有效色度输出。 配置后(无vtiming_in 、det_clken) |
其它默认就行 |
⑥连接(写一下理解的连线) |
先连接一下LCD同频的时钟线 |
ZYNQ FCLK_CLK0 Video Out(aclk) | VDMA(m_axis_mm2s_aclk) |
数据流向 VDMA(M_AXIS_MM2S) → rgb565to888(S_AXIS) rgb565to888(M_AXIS) → Video Out(video_in) VTC( vtiming_out ) → Video Out(vtiming_in) Video Out(vid_io_out) → rgb to lcd(vid_rgb) ![]() |
Video Out(vtg_ce) → VTC(gen_clken ) Dynclk(LOCKED_O) → rgb 2 lcd(vid_rst) ![]() |
导出LCD引脚 |
|
检查无误 |
⑦ .dxc |
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[15]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[14]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[13]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[12]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[11]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[10]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[9]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[8]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[7]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {lcd_0_data[0]}] set_property IOSTANDARD LVCMOS33 [get_ports lcd_0_bl] set_property IOSTANDARD LVCMOS33 [get_ports lcd_0_de] set_property IOSTANDARD LVCMOS33 [get_ports lcd_0_hs] set_property IOSTANDARD LVCMOS33 [get_ports lcd_0_pclk] set_property IOSTANDARD LVCMOS33 [get_ports lcd_0_vs] set_property PACKAGE_PIN W20 [get_ports {lcd_0_data[15]}] set_property PACKAGE_PIN W19 [get_ports {lcd_0_data[14]}] set_property PACKAGE_PIN V17 [get_ports {lcd_0_data[13]}] set_property PACKAGE_PIN V16 [get_ports {lcd_0_data[12]}] set_property PACKAGE_PIN T15 [get_ports {lcd_0_data[11]}] set_property PACKAGE_PIN V20 [get_ports {lcd_0_data[10]}] set_property PACKAGE_PIN U17 [get_ports {lcd_0_data[9]}] set_property PACKAGE_PIN V18 [get_ports {lcd_0_data[8]}] set_property PACKAGE_PIN T16 [get_ports {lcd_0_data[7]}] set_property PACKAGE_PIN R16 [get_ports {lcd_0_data[6]}] set_property PACKAGE_PIN U19 [get_ports {lcd_0_data[5]}] set_property PACKAGE_PIN Y19 [get_ports {lcd_0_data[4]}] set_property PACKAGE_PIN W18 [get_ports {lcd_0_data[3]}] set_property PACKAGE_PIN Y18 [get_ports {lcd_0_data[2]}] set_property PACKAGE_PIN W16 [get_ports {lcd_0_data[1]}] set_property PACKAGE_PIN Y17 [get_ports {lcd_0_data[0]}] set_property PACKAGE_PIN R17 [get_ports lcd_0_bl] set_property PACKAGE_PIN W15 [get_ports lcd_0_de] set_property PACKAGE_PIN U14 [get_ports lcd_0_hs] set_property PACKAGE_PIN U15 [get_ports lcd_0_pclk] set_property PACKAGE_PIN W14 [get_ports lcd_0_vs] |
生成.bit .hdf |
4. 软件程序设计
【zynq课程笔记】【裸机】【第20课 】【基于VDMA的RGB TFT显示】 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz! |
还是这一个,去例程里面SDK里面找 LCD、SCU、USER |
main.c |
#include <stdio.h> #include "SCU_GIC.h" int main(void) |
//芜湖~ |