当前位置: 首页 > backend >正文

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 中进行转换和显示

因此需要在 DDRPS)与 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里面找 LCDSCUUSER
main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdarg.h>
#include <stdint.h>

#include "SCU_GIC.h"
#include "SCU_TIMER.h"
#include "LCD.h"
#include "pic.h"

int main(void)
{
     char str[] = "abcd";  // 定义字符数组(存储在栈上)
    uint8_t  *p = str;        // 获取首地址指针
    LCD_Init();
    //LCD_DisplayPic(0,0,gImage_pic);
    LCD_DrawPoint(50,50,LCD_GREEN);
    LCD_DrawPoint(50,60,LCD_GREEN);
    LCD_DrawRectangle(20, 20, 300,300, LCD_RED);
    LCD_Color_Fill(400, 50, 600,100, LCD_BLUE);
    LCD_DrawWaveLine(400, 200, 600,220);
    LCD_ShowChar(10, 10,'G',16,1);
    LCD_ShowString(400,400,100,40,16,1,p);
    LCD_Refresh();
    return 0;
}
 

//芜湖~
http://www.xdnf.cn/news/6268.html

相关文章:

  • ElasticSearch高级功能
  • 使用matlab进行数据拟合
  • hghac8008漏洞扫描处理
  • [Java实战]Spring Boot 3整合JWT实现无状态身份认证(二十四)
  • 文章记单词 | 第73篇(六级)
  • 【AI面试秘籍】| 第9期:Transformer架构中的QKV机制深度解析:从原理到实践实现
  • Lord Of The Root: 1.0.1通关
  • 安卓system/文件夹下的哪些文件夹可以修改为别的设备的
  • 【信息系统项目管理师】第5章:信息系统工程 - 36个经典题目及详解
  • Agent Builder API - Agent Smith 扩展的后端服务(开源代码)
  • 【Java学习笔记】toString方法
  • MySQL 数据库基础
  • 右值引用的学习
  • cGAS-STING通路
  • 线程同步机制
  • GO 小游戏在线试水
  • UE中:puerts使用指南(持续更新)
  • 服务器时间发生跳变导致hghac中对应主机状态频繁切换为crash或stop
  • 从Transformer到多模态智能,剖析人工智能时代的核心引擎​​
  • Linux服务之lvs集群与dr模式部署
  • Xsens发布专为生物力学打造的全新人体模型
  • centos6.10在Macbook m芯片上使用
  • Android 设置系统默认通话应用,打不开通话界面
  • VSCode python配置
  • 数据结构第七章(二)-树形查找:二叉排序树与平衡二叉树
  • Virtualized Table 虚拟化表格 el-table-v2 表头分组 多级表头的简单示例
  • 编程的本质, 就是创造工具
  • 【网工第6版】第10章 网络规划和设计②
  • Linux 中 open 函数的本质与细节全解析
  • 【爬虫】DrissionPage-2