news 2026/1/24 23:05:12

ZYNQ实现PL与PS端通过DDR3的AXI_DMA数据交互博文

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ZYNQ实现PL与PS端通过DDR3的AXI_DMA数据交互博文

ZYNQ 工程源代码 功能:实现PL和PS端通过ddr3的axi_dma读和写进行数据交互,PS端可通过gpio控制axi_dma读写模块的使能,PS端可通过axi_lite寄存器配置dma的读和写的地址范围或数据长度,PL端的dma写完成后通过中断信号通知PS端。 用户可通过该例程比较快速的搭建自己的更丰富的应用,节省您的开发周期。

在ZYNQ开发中,实现PL(可编程逻辑)和PS(处理系统)端通过DDR3的AXI_DMA进行数据交互是一个常见且重要的任务。今天咱们就来聊聊如何实现它,并且通过GPIO控制读写使能,以及通过AXI - Lite寄存器配置地址范围和数据长度,同时PL端写完成后通过中断信号通知PS端。

一、功能概述

我们要做的这个工程,核心就是在PL和PS之间搭建起一座数据交互的桥梁,借助DDR3和AXIDMA来完成高效的数据传输。而且PS端能够像指挥官一样,通过GPIO控制AXIDMA读写模块的开启和关闭,还能通过AXI - Lite寄存器精准配置DMA读和写的地址范围以及数据长度。最后,当PL端的DMA写操作完成时,会给PS端发送一个中断信号,就像完成任务后汇报一样。

二、代码部分及分析

1. AXI_DMA相关代码

// 假设这里是AXI_DMA初始化相关代码 void axi_dma_init(void) { // 配置AXI_DMA的控制寄存器等操作 XAxiDma_Config *CfgPtr; CfgPtr = XAxiDma_LookupConfig(XPAR_AXI_DMA_0_DEVICE_ID); if (!CfgPtr) { xil_printf("AXI DMA config error\n"); return; } int Status; Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr); if (Status!= XST_SUCCESS) { xil_printf("Initialization failed %d\n", Status); return; } // 这里进行了AXI_DMA的基本配置,查找对应的配置信息并初始化 // 如果查找不到配置或者初始化失败,都会打印相应错误信息并返回 }

在这段代码里,我们首先使用XAxiDmaLookupConfig函数查找AXIDMA的配置信息,这就像是给AXIDMA找使用说明书一样。如果找不到配置信息,就打印错误并返回,因为没有说明书可没法正确工作。接着,使用XAxiDmaCfgInitialize函数基于找到的配置信息对AXI_DMA进行初始化,如果初始化失败,同样打印错误并返回。

2. GPIO控制代码

// 假设这里是GPIO控制AXI_DMA使能相关代码 void gpio_control_axi_dma(u32 gpio_value) { if (gpio_value) { // 使能AXI_DMA读写模块 XAxiDma_WriteReg(XPAR_AXI_DMA_0_BASEADDR, XAXIDMA_CR_OFFSET, XAXIDMA_CR_RESET_MASK); XAxiDma_WriteReg(XPAR_AXI_DMA_0_BASEADDR, XAXIDMA_CR_OFFSET, 0); } else { // 禁用AXI_DMA读写模块 XAxiDma_WriteReg(XPAR_AXI_DMA_0_BASEADDR, XAXIDMA_CR_OFFSET, XAXIDMA_CR_RESET_MASK); } // 根据传入的gpio_value值来决定是否使能AXI_DMA读写模块 // 如果gpio_value为真,先复位AXI_DMA控制寄存器,再清除复位位来使能 // 如果为假,就直接复位,也就是禁用 }

这里的gpiocontrolaxidma函数,根据传入的gpiovalue值来控制AXIDMA读写模块。如果gpiovalue为真,就先对AXIDMA控制寄存器进行复位操作,这就像是把模块先停下来做个准备,然后再清除复位位,让模块可以正常工作,也就是使能。如果gpiovalue为假,那就只进行复位操作,模块就被禁用了。

3. AXI - Lite寄存器配置代码

// 假设这里是通过AXI - Lite寄存器配置DMA地址和长度相关代码 void axi_lite_config_dma(u32 write_addr, u32 read_addr, u32 length) { // 配置写地址 XAxiDma_WriteReg(XPAR_AXI_DMA_0_BASEADDR + XAXIDMA_S2MM_ADDR_OFFSET, write_addr); // 配置读地址 XAxiDma_WriteReg(XPAR_AXI_DMA_0_BASEADDR + XAXIDMA_MM2S_ADDR_OFFSET, read_addr); // 配置数据长度 XAxiDma_WriteReg(XPAR_AXI_DMA_0_BASEADDR + XAXIDMA_S2MM_LENGTH_OFFSET, length); XAxiDma_WriteReg(XPAR_AXI_DMA_0_BASEADDR + XAXIDMA_MM2S_LENGTH_OFFSET, length); // 通过AXI - Lite寄存器分别配置DMA的写地址、读地址和数据长度 // 写地址配置到S2MM_ADDR_OFFSET对应的寄存器,读地址配置到MM2S_ADDR_OFFSET对应的寄存器 // 数据长度同时配置到S2MM_LENGTH_OFFSET和MM2S_LENGTH_OFFSET对应的寄存器 }

axiliteconfigdma函数用于通过AXI - Lite寄存器来配置DMA的读和写地址范围以及数据长度。通过向特定偏移地址对应的寄存器写入相应的值来完成配置。比如,写地址被写入到XPARAXIDMA0BASEADDR + XAXIDMAS2MMADDROFFSET这个地址对应的寄存器,读地址和数据长度同理。

4. 中断处理代码

// 假设这里是中断处理相关代码 void pl_dma_write_complete_handler(void *CallBackRef) { // 处理PL端DMA写完成中断的逻辑 XAxiDma *AxiDmaInst = (XAxiDma *)CallBackRef; u32 IrqStatus; IrqStatus = XAxiDma_IntrGetIrq(AxiDmaInst, XAXIDMA_DMA_TO_DEVICE); if (IrqStatus & XAXIDMA_IRQ_ALL_MASK) { XAxiDma_IntrClear(AxiDmaInst, IrqStatus, XAXIDMA_DMA_TO_DEVICE); // 这里可以添加完成写操作后的具体处理逻辑,比如通知上层应用 xil_printf("PL DMA write completed\n"); } // 获取AXI_DMA从设备到主机方向的中断状态 // 如果有中断,清除相应中断并打印写完成信息 // 这里还可以进一步扩展,比如通知其他模块写操作已完成 }

pldmawritecompletehandler函数就是用来处理PL端DMA写完成中断的。首先获取AXIDMA从设备到主机方向的中断状态,如果检测到有中断(IrqStatus & XAXIDMAIRQALLMASK为真),就清除这个中断,然后可以在这里添加具体的处理逻辑,比如打印写完成信息,或者通知其他模块写操作已经完成。

三、工程意义

用户通过这个例程,能够比较快速地搭建自己更丰富的应用。就像搭积木一样,有了这个基础的“积木块”,可以在它之上构建各种复杂的功能。比如在图像数据处理、高速数据采集等场景下,都可以基于这个数据交互框架进行拓展,极大地节省了开发周期。

希望这篇博文对大家在ZYNQ开发中实现类似功能有所帮助,大家可以在评论区一起交流探讨遇到的问题和心得。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/27 10:36:27

快速掌握SMUDebugTool:5个步骤彻底解决AMD平台电源调试难题

你是否曾经在调试Ryzen系统时,面对复杂的电源管理问题感到束手无策?😩 当系统频繁出现莫名其妙的崩溃、超频后稳定性堪忧,或是供电参数难以精准控制时,一款专业的调试工具就显得尤为重要。SMUDebugTool——这款专为AMD…

作者头像 李华
网站建设 2026/1/25 8:19:20

小红书直播智能录制:告别地址失效的终极解决方案

你是否曾经因为小红书直播地址频繁失效而错过心仪主播的精彩内容?每次都要手动更新直播间链接,不仅效率低下,还经常因为忘记更新而错过直播?今天,我将为你揭秘一套完美解决方案,让你彻底摆脱这些烦恼。 【免…

作者头像 李华
网站建设 2026/1/24 23:04:44

手机号逆向查询QQ号:3步搞定完整操作指南

手机号逆向查询QQ号:3步搞定完整操作指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 还在为忘记QQ号而烦恼吗?手机号转QQ号查询工具为你提供快速解决方案。这款基于Python3开发的免费开源工具&#xff0c…

作者头像 李华
网站建设 2026/1/15 22:38:57

M3U8下载工具终极指南:从零到精通的实战教程

还在为无法保存在线视频而苦恼吗?今天我要带你解锁一个超级实用的M3U8下载工具,让你轻松搞定各类网络视频下载!无论你是自媒体创作者、教育工作者还是普通用户,这款工具都能让你的下载体验变得简单高效。 【免费下载链接】N_m3u8D…

作者头像 李华
网站建设 2026/1/22 5:30:59

LED显示屏安装(户外广告)实战案例解析

户外LED广告大屏安装实战:从结构安全到智能运维的全链路拆解你有没有经历过这样的场景?一个本该在黄金时段点亮城市夜空的户外广告大屏,突然黑屏;或是刚下完一场暴雨,屏幕出现局部闪烁甚至跳闸;又或者维修工…

作者头像 李华
网站建设 2026/1/25 1:27:37

DeepSeek对《停止嵌套数据库系统》文章的总结

原文地址 这篇cedardb发表的文章题为《停止嵌套数据库系统》,作者 Christian Winter 批评了近年来在事务型数据库(如 PostgreSQL)中嵌套分析型数据库(如 DuckDB、ClickHouse)的趋势,认为这种做法虽然表面上…

作者头像 李华