news 2026/5/1 10:42:54

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/5/1 3:49:09

工业传感器数据采集的IAR软件实现方案

用 IAR 打造工业级传感器数据采集系统:从代码优化到实时调度的实战路径在工厂车间、能源站或智能制造产线中,每秒钟都有成千上万的温度、压力和振动数据被采集、处理并上传。这些看似简单的“读数”,背后却是一套高实时性、低延迟、长期稳定运…

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

5分钟玩转Florence2视觉AI:从零到精通完整实战指南

5分钟玩转Florence2视觉AI:从零到精通完整实战指南 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 还在为复杂的视觉AI应用而烦恼吗?微软Florence2视觉语…

作者头像 李华
网站建设 2026/5/1 3:23:03

企业级CRM核心能力横向对比:从销售流程到ERP协同的全维度拆解

在数字化转型背景下,CRM已从“客户信息管理工具”升级为“全流程业务协同平台”。企业选择CRM的核心诉求,是通过销售漏斗精细化、项目协同高效化、客户价值分层、流失风险预判、工作流自动化及ERP数据打通,实现“获客-转化-留存-复购”的闭环…

作者头像 李华
网站建设 2026/5/1 4:58:15

告别截图拼接烦恼:Chrome全网页截图工具深度体验

告别截图拼接烦恼:Chrome全网页截图工具深度体验 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …

作者头像 李华
网站建设 2026/5/1 3:35:50

AMD硬件调试利器:SMUDebugTool实战全攻略

AMD硬件调试利器:SMUDebugTool实战全攻略 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.com/gh…

作者头像 李华
网站建设 2026/5/1 4:56:49

Steam成就管理完全指南:如何安全快速解锁游戏成就

Steam成就管理完全指南:如何安全快速解锁游戏成就 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 你是否曾经对着Steam库中那个永远无法达成的…

作者头像 李华