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)begin
    if(s_axis_aresetn == 1'b0)begin
        S_AXIS_tdata <= 0;
    end
    else begin
       if(S_AXIS_tready&&S_AXIS_tdata<511)
            S_AXIS_tdata <= S_AXIS_tdata + 1'b1; 
        else if(S_AXIS_tready)
            S_AXIS_tdata <= 0;  
    end
 end

assign  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_ID

int axi_dma_test()
{
   
	int Status;
	char speed_r[100];

	TxDone = 0;
	RxDone = 0;
	Error = 0;

	xil_printf( "----DMA Test----\r\n");
	XTtcPs_Start(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值