欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > ZYNQ MPSOC之PL与PS数据交互DMA方式

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

2025/5/2 4:35:06 来源:https://blog.csdn.net/toonyhe/article/details/147501378  浏览:    关键词: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(&

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词