16.1 - VDMA视频转发实验之TPG

news2025/7/10 4:43:31

文章目录

  • 1 实验任务
  • 2 系统框图
  • 3 硬件设计
    • 3.1 IP核配置
    • 3.2 注意事项
  • 4 软件设计
    • 4.1 注意事项
    • 4.2 工程源码
      • 4.2.1 main.c文件

1 实验任务

基于14.1,使用Xilinx TPG(Test Pattern Generator) IP提供视频源,将视频数据通过VDMA写入PS侧内存,然后再通过VDMA将视频数据从PS侧内存读出来,最后通过HDMI接口发送出去,即实现视频转发的功能。

2 系统框图

基于14.1,添加TPG IP核作为视频源,连接到VDMA的写通道,如下图所示:
在这里插入图片描述

3 硬件设计

3.1 IP核配置

  1. 配置VDMA IP核
    • (1)Basic页面
      • 1)Frame Buffers:选择默认值3,即缓存3帧图像数据
      • 2)Enable Write Channel:勾选,使能写通道
      • 3)Write Burst Size:选择256,最大化传输效率
      • 4)Line Buffer Depth:选择2048,图像分辨率为1920x1080,能够缓存一行像素数据
        在这里插入图片描述
    • (2)Advanced页面
      • 1)保持默认值,采用动态同步锁相模式,写通道为主,读通道为从
        在这里插入图片描述
  2. 配置TGP IP核
    • (1)全部保持默认即可
      在这里插入图片描述

3.2 注意事项

为各个接口自动连线:必须手动指定主从接口和互联模块的时钟

  1. 为VDMA的M_AXI_S2MM接口连线:从接口是PS的S_AXI_HP0接口
    在这里插入图片描述
  2. 为TPG的s_axi_CTRL接口连线:主接口是PS的M_AXI_GP0接口,注意
    • (1)TPG只有一个时钟接口ap_clk,该时钟是AXI4-Stream data interface和AXI4-Lite control interface共用,所以时钟源选择的是Clocking Wizard输出的clk_out1时钟,即视频时钟,使输入视频和输出视频同步
      在这里插入图片描述
  3. 将TPG和VDMA连接起来,为VDMA的s_axis_s2mm_aclk连线,自动识别为Clocking Wizard输出的clk_out1时钟,即视频时钟
    在这里插入图片描述

4 软件设计

4.1 注意事项

  1. TPG IP核生成一个背景为纯白,叠加一个黑色移动小方块的视频
  2. 当VDMA写通道停止时
    • (1)VDMA写通道暂停接收视频数据,TPG暂停产生视频数据
    • (2)VDMA读通道依然在发送数据
      • 1)显示器上小方块停止移动
      • 2)说明VDMA读通道在重复发送同一帧视频数据,该帧视频数据是VDMA写通道在停止前写入的最后一帧
      • 3)符合动态同步锁相模式的工作机制,即读通道(Dynamic Genlock Slave)会操作写通道(Dynamic Genlock Master)上一个周期操作的帧
  3. 当VDMA写通道重启时
    • (1)TPG恢复产生视频数据
    • (2)显示器上小方块继续从停止的位置开始移动

4.2 工程源码

4.2.1 main.c文件

/********************************************************************/

#include "vdma/vdma_api.h"

#include "xparameters.h"
#include "stdio.h"
#include "sleep.h"
#include "xv_tpg.h"

/********************************************************************/

#define TPG_DEVICE_ID		XPAR_V_TPG_0_DEVICE_ID
#define VDMA_DEVICE_ID		XPAR_AXIVDMA_0_DEVICE_ID
#define MEMORY_BASEADDR		XPAR_PS7_DDR_0_S_AXI_BASEADDR

#define IMAGE_WIDTH			1920
#define IMAGE_HEIGHT		1080

/********************************************************************/

/********************************************************************/

XV_tpg TpgInst;
XAxiVdma VdmaInst;

int FrameBufferAddr = (MEMORY_BASEADDR + 0x02000000);

/********************************************************************/

int main()
{
	//
	int Status;
	u32 BackGndPatternId;
	u32 ForeGndPatternId;
	u32 BoxSize;
	u32 BoxColorRed;
	u32 BoxColorGreen;
	u32 BoxColorBlue;

	u32 MotionSpeed;

	//
	printf("Vdma Video Forward Test.\n");

	//
	Status = XV_tpg_Initialize(&TpgInst, TPG_DEVICE_ID);
	if (Status == XST_FAILURE) {
		printf("Error : video test pattern generator initialization failed.\n");
		return XST_FAILURE;
	}

	//
	BackGndPatternId = 0x8;
	ForeGndPatternId = 0x1;

	BoxSize       = 0x20;
	BoxColorRed   = 0x00;
	BoxColorGreen = 0x00;
	BoxColorBlue  = 0x00;

	MotionSpeed = 0x2;

	XV_tpg_Set_width(&TpgInst, IMAGE_WIDTH);
	XV_tpg_Set_height(&TpgInst, IMAGE_HEIGHT);
	XV_tpg_Set_bckgndId(&TpgInst, BackGndPatternId);

	XV_tpg_Set_boxSize(&TpgInst, BoxSize);
	XV_tpg_Set_boxColorR(&TpgInst, BoxColorRed);
	XV_tpg_Set_boxColorG(&TpgInst, BoxColorGreen);
	XV_tpg_Set_boxColorB(&TpgInst, BoxColorBlue);
	XV_tpg_Set_motionSpeed(&TpgInst, MotionSpeed);
	XV_tpg_Set_ovrlayId(&TpgInst, ForeGndPatternId);

	XV_tpg_Start(&TpgInst);
	XV_tpg_EnableAutoRestart(&TpgInst);


	// 启动VDMA读写操作
	Status = run_vdma_frame_buffer(&VdmaInst, VDMA_DEVICE_ID, IMAGE_WIDTH, IMAGE_HEIGHT, FrameBufferAddr, 0, 0, BOTH);
	if (Status == XST_FAILURE) {
		printf("Error : run vdma frame buffer failed.\n");
		return XST_FAILURE;
	}

	//
    while (1) {
    	//
    	sleep(10);

    	printf("Stop vdma channel.\n");
//    	XAxiVdma_DmaStop(&VdmaInst, XAXIVDMA_READ);
    	XAxiVdma_DmaStop(&VdmaInst, XAXIVDMA_WRITE);

    	//
    	sleep(5);

    	printf("Start vdma channel.\n");
//		XAxiVdma_DmaStart(&VdmaInst, XAXIVDMA_READ);
		XAxiVdma_DmaStart(&VdmaInst, XAXIVDMA_WRITE);
    }

	//
	return XST_SUCCESS;
}

/*****************************************************************************/

/*****************************************************************************/

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

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

相关文章

cocos creator 3.8 下的 2D 改动

在B站找到的系统性cocos视频教程,纯2D开发入门,链接如下: zzehz黑马程序员6天实战游戏开发微信小程序(Cocos2d的升级版 CocosCreator JavaScript)_哔哩哔哩_bilibili黑马程序员6天实战游戏开发微信小程序(Cocos2d的升级版 CocosCreator Ja…

Unity光照笔记

问题 在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题,不得不研究一下光照。先放出官方文档。 Lighting 窗口 - Unity 手册 播放中切换场景后地面阴影是纯黑 只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。 相关文章&#xff1a…

嵌入式学习的第二十天-数据结构-调试+链表的一般操作

一、调试 1.一般调试 2.找段错误 二、链表的一般操作 1.单链表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.单链表的销毁 int D…

家具制造行业的现状 质检LIMS如何赋能家具制造企业质检升级

在家具制造行业,从原木切割到成品出厂,质检环节贯穿始终 —— 木材含水率是否达标、板材甲醛释放量是否合规、涂层耐磨性能否通过标准…… 这些看似琐碎的检测项目,实则是企业把控产品品质、规避市场风险的核心关卡。传统人工质检模式在效率、…

idea整合maven环境配置

idea整合maven 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每个知识点,都是写出代码…

无偿帮写毕业论文(看不懂的可以私信博主)

以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行,脱产学习这么多年,终于熬出头了,完成毕设后有空就去多看看亲人好友,祝好! 一、找一个论文模板 废话不多说,先上干货Ov…

小白成长之路-vim编辑

文章目录 Vim一、命令模式二、插入模式3.a:进入插入模式,在当前光标的后一个字符插入![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在当前光标的下一行插入5.i:在当前光标所在字符插入,返回命令模…

【常用算法:排序篇】7.算法魔法与面试秘籍:从趣味排序到实战通关

一、趣味排序算法:突破常规的思维火花 1. 睡眠排序(Sleep Sort)—— 时间维度的魔法 核心思想:利用多线程休眠时间模拟数值大小,自然输出有序结果。Python示例:import threading import timedef sleep_so…

Android | IOS — Solox性能测试

文章目录 Solox性能测试1. 前置条件2. 软件图片 Solox性能测试 1. 前置条件 安装Python:3.10.0以上版本: Windows:Python官网 安装 SoloX python -m solox2. 软件图片 软件图片 报告分析:

Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】

引言 在人工智能图像生成领域,Midjourney 凭借其强大的艺术表现力和灵活的创作模式,已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”,我将结合多年实战经验,系统分享 Midjourney 的创作方法论&#x…

工具篇-扣子空间MCP,一键做游戏,一键成曲

一、登陆扣子空间 地址如下: 扣子空间 打开,然后登陆扣子 登陆之后快速开始: 二、生成游戏 小试牛刀,我们让它做一个打地鼠的游戏: 已经开始设计制作: 制作完成: 三、制作音乐 新…

5.6 - 5.9 MySQL

数据库:存储和管理数据的仓库DB。 数据库管理系统:操纵和管理数据库的大型软件DBMS。 关系型数据库 一个数据库内可以创建多张表,在一个表内能存放多个数据。 SQL语句: DDL: 存储字符串用varchar。(类似于…

C# WinForm 如何高效地将大量数据从 CSV 文件导入 DataGridView

如果你有非常多的csv文件,每个文件包含N多行与M多列,如:18000 行和 27 列。现在,想制作一个 Windows 窗体应用程序,导入它们并在 datagridview 中显示,然后进行一些数学运算。可是,发现数据导入…

SQLPub:一个提供AI助手的免费MySQL数据库服务

给大家介绍一个免费的 MySQL 在线数据库环境:SQLPub。它提供了最新版本的 MySQL 服务器测试服务,可以方便开发者和测试人员验证数据库功能,也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址: https://sqlpub.com/ SQLP…

URP相机如何将场景渲染定帧模糊绘制

1)URP相机如何将场景渲染定帧模糊绘制 2)为什么Virtual Machine会随着游戏时间变大 3)出海项目,打包时需要勾选ARMv7吗 4)Unity是手动还是自动调用GC.Collect 这是第431篇UWA技术知识分享的推送,精选了UWA社…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC (BarneyICC) https://wago.io/BarneyICC/69 全量英文字符串: !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

FramePack - 开源 AI 视频生成工具

🎬 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库,专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现,能够显著提升动画资源的处理效率。 此 AI 视频生成项目,旨在通过低显…

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用

说明:v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果: 1、在状态管理中创建文件,统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…

FPGA: UltraScale+ bitslip实现(方案+代码)

收获 一晃五年~ 五年前那个夏夜,我对着泛蓝的屏幕敲下《给十年后的自己》,在2020年的疫情迷雾中编织着对未来的想象。此刻回望,第四届集创赛的参赛编号仍清晰如昨,而那个在家熬夜焊电路板的"不眠者",现在…

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》

摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此,研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同,传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本,而新方法则…