当前位置: 首页 > news >正文

ZYNQ MPSOC之PL与PS数据交互DMA方式

ZYNQ MPSOC之PL与PS数据交互DMA方式

1 摘要

XILINX ZYNQ 以及 ZYNQ MPSOC主要优势在于异构 ARM+FPGA。其中非常关键的一点使用了 AXI 总线进行高速互联。而且这个 AXI 总线是开放给我们用户使用的。在前面的文章中我们详解了使用了AXI-HP方式PL到PS端进行数据交互。本文主要涉及到DMA访问方式,实现PL端到PS端数据互访,并测试在当前数据总线位宽和PL端频率下DMA方式的带宽速度。

2 DMA(Direct Memory Access)接口

DMA 是一种高效的数据传输技术,广泛应用于需要大量数据传输的计算机系统中。通过允许外设直接访问内存,DMA 可以显著提高系统的性能和资源利用率。
(1)DMA 的工作原理
请求 DMA 传输:外部设备(如硬盘、网络适配器或其他外设)通过控制器发出 DMA 请求,表明它需要进行数据传输。
•DMA 控制器响应:系统的 DMA 控制器接收到请求后,向 CPU 发送信号,通知它暂时停止处理任务,允许 DMA 控制器接管总线。
•设置传输参数:DMA 控制器配置数据传输的源地址、目的地址和数据传输的大小。
•数据传输:DMA 控制器直接从源地址读取数据并写入到目的地址。此过程不需要 CPU 的参与,从而提高了效率。
•完成传输:当数据传输完成后,DMA 控制器向 CPU 发送中断信号,通知其传输已完成,CPU 可以继续执行其他任务。
在这里插入图片描述
可以看到 DMA 的数据传输经 S_AXI_HP 接口。ZYNQ MPSOC 拥有 4 个S-AXI HP 接口,提供了 ZYNQ 内最大的总带宽。每一个 HP 接口都包含控制和数据 FIFO。这些 FIFO 为大数据量突发传输提供缓冲,让 HP 接口成为理想的高速数据传输接口。
在这里插入图片描述

(2)DMA 的类型
•Burst Mode DMA:在这种模式下,DMA 控制器在传输数据时占用总线,直到传输完成。此模式适合于大块数据传输。
•Cycle Stealing DMA:DMA 控制器在每个数据传输周期中占用总线的一部分时间,允许 CPU 和 DMA 控制器交替访问总线。此模式适合于小块数据传输。
•Transparent DMA:DMA 控制器在 CPU 不使用总线时进行数据传输,从而不会影响 CPU 的操作。
•Demand Mode DMA:DMA 控制器在设备请求时才进行数据传输,适合于不定时的数据传输需求。

(3)DMA 的应用场景
•音频和视频处理:在音频和视频流的传输中,DMA 可以实现高效的数据传输,减少延迟。
•网络数据传输:网络适配器通常使用 DMA 将数据包直接传输到内存中,提高网络通信性能。
•大数据量的存储操作:在硬盘和内存之间进行大规模数据传输时,DMA 可以显著提高传输效率。

3 DMA FPGA设计

3.1 block design设计

采用FPGA block design 设计MPSOC DMA接口,顶层通过axis-data-fifo控制写数据操作,SOC端通过DMA中断将DMA通道接收的数据缓存至DDR中,完成PL端到PS端DDR的读写访问。
在这里插入图片描述
在位宽为32bit,PL端频率为150MHz测试DMA速率如下,可以适当提高PL端时钟频率以提高传输速度
在这里插入图片描述

3.2 顶层模块

`timescale 1 ps / 1 ps
module system_wrapper();reg [31:0]S_AXIS_tdata;wire S_AXIS_tlast;wire S_AXIS_tvalid = 1'b1; wire pl_clk0;wire s_axis_aclk;wire s_axis_aresetn;wire [3:0]S_AXIS_tkeep;wire S_AXIS_tready;wire [0:0]gpio_rtl_tri_o;wire [0:0]peripheral_aresetn;assign S_AXIS_tkeep = 4'b1111;  
assign s_axis_aclk =  pl_clk0;
assign s_axis_aresetn = peripheral_aresetn&&gpio_rtl_tri_o;always@(posedge pl_clk0)beginif(s_axis_aresetn == 1'b0)beginS_AXIS_tdata <= 0;endelse beginif(S_AXIS_tready&&S_AXIS_tdata<511)S_AXIS_tdata <= S_AXIS_tdata + 1'b1; else if(S_AXIS_tready)S_AXIS_tdata <= 0;  endendassign  S_AXIS_tlast = (S_AXIS_tdata == 511)&&S_AXIS_tready&&S_AXIS_tvalid;system system_i(.S_AXIS_tdata(S_AXIS_tdata),.S_AXIS_tkeep(S_AXIS_tkeep),.S_AXIS_tlast(S_AXIS_tlast),.S_AXIS_tready(S_AXIS_tready),.S_AXIS_tvalid(S_AXIS_tvalid),.gpio_rtl_tri_o(gpio_rtl_tri_o),.peripheral_aresetn(peripheral_aresetn),.pl_clk0(pl_clk0),.s_axis_aclk(s_axis_aclk),.s_axis_aresetn(s_axis_aresetn));
endmodule

4 SOC设计

4.1 硬件导出

在工程中导出硬件平台及bit文件
在这里插入图片描述
生成VITIS工程
在这里插入图片描述)

4.2 PSU_A53控制代码

#include "dma_intr.h"
#include "ttc_intr.h"
#include "sys_intr.h"
#include "xgpio.h"
volatile u32 RX_success;
volatile u32 TX_success;volatile u32 RX_ready=1;
volatile u32 TX_ready=1;
int Tries = NUMBER_OF_TRANSFERS;
int i;
int Index;
u8 *TxBufferPtr= (u8 *)TX_BUFFER_BASE;
u8 *RxBufferPtr= (u8 *)RX_BUFFER_BASE;
u8 Value=0;
float speed_tx;
float speed_rx;
static XGpio Gpio;
XAxiDma AxiDma;
XScuGic Intc; //GIC
#define AXI_GPIO_DEV_ID	        XPAR_AXI_GPIO_0_DEVICE_IDint axi_dma_test()
{int Status;char speed_r[100];TxDone = 0;RxDone = 0;Error = 0;xil_printf( "----DMA Test----\r\n");XTtcPs_Start(&

相关文章:

  • MCP 服务器搭建【sse 类型】实现上市公司年报查询总结, 127.0.0.1:8000/sse直接配置配合 Cherry Studio使用简单
  • 讯飞星辰焕新发布!Agent规模化应用的通关密码
  • 学习笔记——《Java面向对象程序设计》-常用实用类
  • 复刻低成本机械臂 SO-ARM100 材料齐活篇
  • 欧拉计划 Project Euler61(循环的多边形数)题解
  • Java中的多态与继承
  • 共筑数字经济新生态 共绘数字中国新蓝图 ——思特奇受邀出席2025年第八届数字中国建设峰会
  • 动画震动效果
  • Java 未来技术栈:从云原生到 AI 融合的企业级技术演进路线
  • PCB设计工艺规范(四)安规要求
  • 1254. 【动态规划】单词的划分
  • 动态规划 -- 子数组问题
  • Java大师成长计划之第8天:Java线程基础
  • 农产品园区展示系统——仙盟创梦IDE开发
  • Kotlin与Jetpack Compose的详细使用指南
  • React 第三十六节 Router 中 useParams 的具体使用及详细介绍
  • 力扣hot100——98.验证二叉搜索树
  • Python 数据智能实战 (4):智能用户分群 - 融合行为
  • libevent详解
  • Kubernetes Service 详解
  • 见证历史与未来共舞:上海西岸“蝶变共生”对话讲坛圆满举行
  • 五一首日出沪高峰,G1503高东收费站上午车速约30公里/小时
  • 金砖国家外长会晤主席声明(摘要)
  • 司法服务保障西部陆海新通道建设,最高法专门发文
  • 蔡澜回应“入ICU观察”称未至于病危,助理:只是老毛病
  • 李铁案二审驳回上诉,维持一审有期徒刑20年的判决