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(&