【【VDMA彩条显示实验之四 含C语言代码】】

news2024/11/15 4:42:27

VDMA彩条显示实验之四 含C语言代码

VTC 手册简介

所有的视频都需要有时序 有时序的地方就需要有 时序控制器
VTC的 主要作用是 产生 视频时序

相对于上一节 在这里 我们会理解的更多
在这里插入图片描述

观察 这个 HB 信号 其实这个和上一节的图片差不多
在 行同步信号 前面就是前沿 在 行同步信号的后侧 就是 后沿

在这里插入图片描述

VTC 还可以最多支持 16 个 帧同步信号

在这里插入图片描述

我们来配置 VTC
首先观察我们需要配置的 各项参数 设置
在这里插入图片描述

这是 LCD 时序参数
我们需要做的是将 这个参数 与 VTC的 配置 关联起来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面我们来配置 帧时序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最终设计的block design

在这里插入图片描述

我们观察一下 像素时钟接到了 哪几个端口上
在这里插入图片描述

我们会发现 由 PLL 锁相环产生 的 像素时钟 连接到 了 VTC 模块 Video out的 一个 clk 还有 连接到了 lcd_clk 上
其他上用的大多是 100M的时钟
int run_triple_frame_buffer(XAxiVdma* InstancePtr , int DeviceId , int hsize, int vsize, int buf_base_addr, int number_frame_count, int enable_frm_cnt_intr)
第一个参数是 XAxiVdma* InstancePtr ----> VDMA 数据结构的 句柄
第二个参数是 int DeviceId -------> VDMA 器件 的 ID
第三个参数是 int hsize --------> 一帧水平方向上的大小
第四个参数是 int vsize ----------> 竖直方向上的大小
第五个参数是 int buf_base_addr ----------> VDMA 起始帧缓存的地址
第六个参数 是 int number_frame_count ----------> 指定了经过多少帧之后 会迎来中断
第七个参数是 int enable_frm_cnt_intr --------> 告诉我们是否需要使能帧计数器这样的 一个中断
因为在本次实验中 我们并不是很需要中断 所以最后两个参数可以不用去考虑

下面展示整个C语言代码

#include "stdio.h"
#include"xparameters.h"
#include "xaxivdma.h"
#include "vdma_api.h"
#define VDMA_ID            XPAR_AXIVDMA_0_DEVICE_ID
#define DDR_BASE_ADDR      XPAR_PS7_DDR_0_S_AXI_BASEADDR  // DDR存储空间 的起始地址
//这个是 DDR的基地址 我们是需要写一个彩条图案 但是 彩条图案总不能从基地址
//开始,因为我们程序 也是 从基地址 开始运行的 。 如果彩条图案是从基地址开始
//运行的话 ,就会给我们程序带来冲突  所以我们要重新定义一个帧缓存的地址
// 把宏定义的形式 改写成 变量的形式 这样在 后续可以更方便使用
int frame_buffer_addr  = (DDR_BASE_ADDR + 0x1000000)  ;// VDMA 帧缓存的地址
#define WIDTH   800  // 图像的宽度
#define HEIGHT  480  // 图像的高度
int main()
{
int i , j ;
u8* vdma_buffer_addr ;
vdma_buffer_addr = (u8*) frame_buffer_addr ;


XAxiVdma vdma_inst;


// 配置并启动 VDMA

run_triple_frame_buffer(
&vdma_inst,        // vdma驱动实例
VDMA_ID,           // VDMA 的 ID信息
WIDTH,             //  图像的水平尺寸  宽度
HEIGHT,            //  图像的高度
frame_buffer_addr,   //  VDMA 究竟从DMA的哪个地址开始读取图像// VDMA 帧缓存的起始地址
0,
0);
//  往 VDMA 的帧缓存里面 写入 图案
for(j=0;j<HEIGHT ; j++){
for(i=0 ; i<WIDTH ; i++)
{
// 因为我们用的是 RGB 888 相当于 占据了 3个字节
// 我们使用的是 u8* 类型的 所以就如同下面写的那样 三个才表示一个数据
//
(vdma_buffer_addr + jWIDTH3 + i3+0 ) = 0xff ; //往像素的红色通道写入FF
(vdma_buffer_addr + jWIDTH3 + i3+1 ) = 0x00 ; //往像素的绿色通道写入00
(vdma_buffer_addr + jWIDTH3 + i3+2 ) = 0x00 ; //往像素的蓝色通道写入00
}
}
return 0  ;
}

我们在上电之后发现现象不对 开始修改
一个是红色和蓝色 的不对 还有一个是 只显示了一部分的颜色

为什么会没写好呢 是因为 我们 PS端的DDR控制器 会缓存一部分数据
我们需要把缓存的数据强行冲出来
void Xil_DCacheFlush(void); 添加 函数
下面是修改之后的代码

#include "stdio.h"
#include"xparameters.h"
#include "xaxivdma.h"
#include "vdma_api.h"
#include "xil_cache.h"
#define VDMA_ID            XPAR_AXIVDMA_0_DEVICE_ID
#define DDR_BASE_ADDR      XPAR_PS7_DDR_0_S_AXI_BASEADDR  // DDR存储空间 的起始地址
//这个是 DDR的基地址 我们是需要写一个彩条图案 但是 彩条图案总不能从基地址
//开始,因为我们程序 也是 从基地址 开始运行的 。 如果彩条图案是从基地址开始
//运行的话 ,就会给我们程序带来冲突  所以我们要重新定义一个帧缓存的地址
// 把宏定义的形式 改写成 变量的形式 这样在 后续可以更方便使用
int frame_buffer_addr  = (DDR_BASE_ADDR + 0x1000000)  ;// VDMA 帧缓存的地址
#define WIDTH   800  // 图像的宽度
#define HEIGHT  480  // 图像的高度
int main()
{
int i , j ;
u8* vdma_buffer_addr ;
vdma_buffer_addr = (u8*) frame_buffer_addr ;


XAxiVdma vdma_inst;


// 配置并启动 VDMA

run_triple_frame_buffer(
&vdma_inst,        // vdma驱动实例
VDMA_ID,           // VDMA 的 ID信息
WIDTH,             //  图像的水平尺寸  宽度
HEIGHT,            //  图像的高度
frame_buffer_addr,   //  VDMA 究竟从DMA的哪个地址开始读取图像// VDMA 帧缓存的起始地址
0,
0);
//  往 VDMA 的帧缓存里面 写入 图案
for(j=0;j<HEIGHT ; j++){
for(i=0 ; i<WIDTH ; i++)
{
// 因为我们用的是 RGB 888 相当于 占据了 3个字节
// 我们使用的是 u8* 类型的 所以就如同下面写的那样 三个才表示一个数据
//
(vdma_buffer_addr + jWIDTH3 + i3+0 ) = 0x00 ; //往像素的蓝色通道写入FF
(vdma_buffer_addr + jWIDTH3 + i3+1 ) = 0x00 ; //往像素的绿色通道写入00
(vdma_buffer_addr + jWIDTH3 + i3+2 ) = 0xff ; //往像素的红色通道写入00
}
}
//将cache缓存的数据冲出来
Xil_DCacheFlush();
return 0  ;
}

纯色模块显示完毕 下面展示彩条代码的书写

#include "stdio.h"
#include"xparameters.h"
#include "xaxivdma.h"
#include "vdma_api.h"
#include "xil_cache.h"
#define VDMA_ID            XPAR_AXIVDMA_0_DEVICE_ID
#define DDR_BASE_ADDR      XPAR_PS7_DDR_0_S_AXI_BASEADDR  // DDR存储空间 的起始地址
//这个是 DDR的基地址 我们是需要写一个彩条图案 但是 彩条图案总不能从基地址
//开始,因为我们程序 也是 从基地址 开始运行的 。 如果彩条图案是从基地址开始
//运行的话 ,就会给我们程序带来冲突  所以我们要重新定义一个帧缓存的地址
// 把宏定义的形式 改写成 变量的形式 这样在 后续可以更方便使用
int frame_buffer_addr  = (DDR_BASE_ADDR + 0x1000000)  ;// VDMA 帧缓存的地址
#define WIDTH   800  // 图像的宽度
#define HEIGHT  480  // 图像的高度
int main()
{
int i , j ;
u8* vdma_buffer_addr ;
vdma_buffer_addr = (u8*) frame_buffer_addr ;


XAxiVdma vdma_inst;


// 配置并启动 VDMA

run_triple_frame_buffer(
&vdma_inst,        // vdma驱动实例
VDMA_ID,           // VDMA 的 ID信息
WIDTH,             //  图像的水平尺寸  宽度
HEIGHT,            //  图像的高度
frame_buffer_addr,   //  VDMA 究竟从DMA的哪个地址开始读取图像// VDMA 帧缓存的起始地址
0,
0);
//  往 VDMA 的帧缓存里面 写入 图案
for(j=0;j<HEIGHT ; j++){
for(i=0 ; i<WIDTH ; i++)
{
// 因为我们用的是 RGB 888 相当于 占据了 3个字节
// 我们使用的是 u8* 类型的 所以就如同下面写的那样 三个才表示一个数据
//
if(i < WIDTH/3) {
(vdma_buffer_addr + jWIDTH3 + i3+0 ) = 0x00 ; //往像素的蓝色通道写入FF
(vdma_buffer_addr + jWIDTH3 + i3+1 ) = 0x00 ; //往像素的绿色通道写入00
(vdma_buffer_addr + jWIDTH3 + i3+2 ) = 0xff ; //往像素的红色通道写入00
}
else if( i <(2WIDTH)/3   ){(vdma_buffer_addr + jWIDTH3 + i3+0 ) = 0x00 ; //往像素的蓝色通道写入FF(vdma_buffer_addr + jWIDTH3 + i3+1 ) = 0xff ; //往像素的绿色通道写入00(vdma_buffer_addr + jWIDTH3 + i3+2 ) = 0x00 ; //往像素的红色通道写入00}else{(vdma_buffer_addr + jWIDTH3 + i3+0 ) = 0xff ; //往像素的蓝色通道写入FF(vdma_buffer_addr + jWIDTH3 + i3+1 ) = 0x00 ; //往像素的绿色通道写入00(vdma_buffer_addr + jWIDTH3 + i*3+2 ) = 0x00 ; //往像素的红色通道写入00
}
 }

}
//将cache缓存的数据冲出来
Xil_DCacheFlush();
return 0  ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构初阶】单链表SLlist

描述 不同于顺序表&#xff0c;顺序表的数据是存储在一个连续的空间里的 而链表它是链接起来的结构体地址。 所以我们不用像顺序表一样先创建一块空间出来&#xff0c;而是创建一个能存数据节点和节点与下一个节点之间的连接&#xff1b; 所以&#xff1a;“一个能存数据节点…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(六)

新增菜品 1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新增菜品实现 2.3 功能测试 1.1 需求分析与设计 1.1.1 产品原型 后台系统中可以管理菜品信息&#xff0c;通过 新增功能来添加一个新的菜品&#xff0c;在添加菜品…

BUUCTF [BJDCTF2020]just_a_rar 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 来源&#xff1a;https://github.com/BjdsecCA/BJDCTF2020 密文&#xff1a; 下载附件&#xff0c;解压得到一个.rar压缩包。 解题思路&#xff1a; 1、根据压缩包的名字提示我们使用4位纯数字进行破解。使用ARCH…

006 OpenCV腐蚀膨胀

目录 一、环境 二、形态学原理 三、代码演示 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、形态学原理 在图像处理中&#xff0c;腐蚀和膨胀是两种基本的形态学操作&#xff0c;它们可以有效地用于图像的噪声减少、形状分析和…

目标检测 Faster RCNN全面解读复现

Faster RCNN 解读 经过R-CNN和Fast RCNN的积淀&#xff0c;Ross B. Girshick在2016年提出了新的Faster RCNN&#xff0c;在结构上&#xff0c;Faster RCNN已经将特征抽取(feature extraction)&#xff0c;proposal提取&#xff0c;bounding box regression(rect refine)&…

红海云签约广州无线电集团,头部国企人力资源数字化转型全面加速

广州无线电集团创立于1995年2月28日&#xff0c;是在1960年&#xff08;国家第二个五年计划期间&#xff09;隶属于国家第四机械工业部&#xff08;后国家电子工业部&#xff09;的国营第七五〇厂的基础上整体注册而成&#xff0c;其历史可以追溯至1956年在公私合营背景下组建的…

JDY蓝牙注意事项

波特率设置&#xff1a;9600&#xff0c;不接受115200&#xff0c;或者38400. 不同于WiFi测试&#xff0c;jdy蓝牙不接受AT"指令&#xff0c;可以使用“ATVERSION"指令测试 安信可公司的那个蓝牙指令在这里没有用&#xff0c;不知道是不是生产的公司不一样

宽瞬时带宽放大器SKY66051-11、SKY66052-11、SKY66041-11、SKY66317-11(RF)适用于通讯网络

一、2300至2700 MHz宽瞬时带宽高增益线性驱动放大器&#xff1a;SKY66051-11 SKY66051-11是一款具有高增益和高线性度的宽瞬时带宽、完全输入/输出匹配驱动放大器。通过使用外部元件&#xff0c;增益可在30dB至36dB范围内调整。紧凑型33 mm PA专为工作频率为2300至2700 MHz的4…

终结痛点!超级素材中转站,轻松实现素材跨设备使用

华为升级HarmonyOS 3系统后&#xff0c;更新了“中转站”功能。该功能允许各种类型的文件在华为设备间无缝流动&#xff0c;包括但不限于图片、视频和文档等。借助"中转站"&#xff0c;你可以毫不费力地将文件从一个华为设备传送到另一个华为设备&#xff0c;避免了电…

服务器IPMI管理操作

简介&#xff1a;智能平台管理界面&#xff08;IPMI&#xff0c;Intelligent Platform Management Interface)是管理基于 Intel 结构的企业系统中所使用的外围设备采用的一种工业标准&#xff0c;用户可以利用IPMI监视服务器的物理健康特征&#xff0c;如温度、电压、风扇工作状…

分享职业技术培训类型

职业技术培训类型包括&#xff1a;Python技术应用、人工智能应机器学习、大数据分析、机器学习。 一、“Python技术应用工程师” “Python技术应用工程师”职业技术认证是由工业和信息化部教育与考试中心推出一套专业化、科学化、系统化的人才考核标准&#xff0c;涉及在互…

thinkphp8 DB_PREFIX 属性

设计表的时候使用**_user, **就是前缀&#xff0c;DB_PREFIX就是默认把前缀给去掉 在config/database.php prefix&#xff0c;改成你的前缀&#xff0c;数据库的表重命名‘ltf_user’ 代码调用 $user Db::name("user")->select();return json($user);之前是使用…

智慧校园烟火识别及预警解决方案,保障校园消防安全

一、方案背景 校园消防安全一直以来是社会各界备受关注的问题。为了保障师生的人身安全和财产安全&#xff0c;越来越多的学校开始引入AI智能检测技术&#xff0c;通过运用AI智能烟火检测技术&#xff0c;对学校的周界、教室、走廊、公共区域、教学楼、食堂等场所进行安全监测…

redis非关系型数据库(缓存型数据库)——中间件

【重点】redis为什么这么快&#xff1f;&#xff08;应届&#xff09; ①redis是纯内存结构&#xff0c;避免磁盘I/O的耗时 ②redis核心模块是一个单进程&#xff0c;减少线程切换和回收线程资源时间 ③redis采用的是I/O的多路复用机制&#xff08;每一个执行线路可以同时完…

Sqlserver 多行合并为一行

多行合并为一行 表结构 子表结构如下&#xff1a; 父表结构如下&#xff1a; 由图可以看出子表和父表是通过父表ID进行关联的。 我们要实现的效果如下&#xff0c;查询父表数据的同时&#xff0c;增加一列来展示父表下子商品信息。 完整代码如下 select top {0} * from (…

java基础练习缺少项目?看这篇文章就够了(上)!

公众号&#xff1a;全干开发 。 专注分享简洁但高质量的动图技术文章&#xff01; 项目概述 本教程适合刚学习完java基础语法的同学&#xff0c;涉及if语句、循环语句、类的封装、集合等基础概念&#xff0c;使用大量gif图帮助读者演示代码操作、效果等&#xff0c;是一个非常…

【LeetCode刷题-字符串】--6.N字形变换

6.N字形变换 方法&#xff1a;使用二维矩阵模拟 根据题意&#xff0c;当在矩阵中填写字符时&#xff0c;会向下填写r个字符&#xff0c;然后向右继续填写r - 2个字符&#xff0c;最后回到第一行&#xff0c;因此Z字形变换的周期是t r r - 2 2r - 2&#xff0c;是|/,每个周期…

Cesium点位弹窗

1.弹窗没法向加入点位一样加入到地图内部&#xff0c;entity没法实现 2.使用绝对定位&#xff0c;将地图组件通过定位加入到地图上&#xff0c;注意弹窗层级一定在地图上 3.通过判断点击位置是否是点位来获取entity信息&#xff0c;将信息显示在弹窗 4.将点击处点位的经纬度转为…

在Vue3中使用Element-Plus分页(Pagination )组件

开发过程中数据展示会经常使用到&#xff0c;同时分页功能也会添加到页面中。 记&#xff1a;在Vue3中使用Element-Plus分页组件与表格数据实现分页交互。 开始实现 引入表格和分页组件的H5标签。 <strong>Element-Plus分页组件使用</strong> <div><el-t…

视频监控管理平台EasyCVR告警查询拖动条无法显示,该如何解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…