news 2026/2/22 6:37:08

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/17 16:14:37

Full Page Screen Capture:Chrome浏览器长网页完整截图终极指南

在日常浏览网页时,你是否经常遇到这样的困扰:一篇精彩的长文无法完整保存,重要资料只能分段截图,拼接时又出现错位失真?Full Page Screen Capture作为专为Chrome浏览器设计的智能截图扩展,通过一键操作即可…

作者头像 李华
网站建设 2026/2/21 23:21:06

防休眠工具终极攻略:让电脑永不锁屏的智能解决方案

你是否曾经因为系统自动休眠而中断了重要的演示?或者在大文件下载过程中电脑突然进入睡眠模式?今天我要为你介绍一款真正实用的防休眠工具,它能彻底解决这些困扰。作为一款轻量级Windows实用程序,NoSleep专门设计用于阻止系统自动…

作者头像 李华
网站建设 2026/2/18 4:27:45

Java毕设项目推荐-基于springboot的受灾救援物资管理系统|物资管控系统的设计基于springboot的救援物资管理系统的设计与实现【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/21 17:27:38

手机号查QQ号完整教程:3分钟快速找回关联账号

手机号查QQ号完整教程:3分钟快速找回关联账号 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录?或者需要确认某个手机号是否绑定过QQ账号?现在,通过ph…

作者头像 李华
网站建设 2026/2/22 0:41:08

超强掌控!AlienFX工具让你的Alienware设备管理变得如此简单

还在为Alienware设备的灯光控制和散热优化烦恼吗?🤔 别担心!AlienFX工具套件为你带来了全新的Alienware设备管理体验,让灯光控制随心所欲,散热优化精准到位! 【免费下载链接】alienfx-tools Alienware syst…

作者头像 李华