021-64886750

  • 实时目标机

    Simulink模型库

    Demo套件

info@yisuworld.com

Speedgoat FPGA板卡使用系列文章之DMA(上)

网站首页    技术blog和使用技巧    Speedgoat FPGA板卡使用系列文章之DMA(上)

 

l       Speedgoat FPGA板卡的DMA

Speedgoat实时系统中,FPGA板卡与CPU之间通过高速PCIe总线连接二者之间的数据交互有两种形式:PCIe寄存器、DMADirect Memory Access:直接存储器访问)PCIe寄存器使用简单请见本系列文章第一篇,但进行大批量高速数据交互时,CPU引入的读写延迟较大,CPU会长时间保持在忙碌状态,不利于其他任务的实时运行,可能会导致CPU overrun错误。DMA使用稍较复杂,但是数据传输依靠DMA控制器,可以直接将数据从FPGA传输到系统内存,在此期间CPU可以去执行其他任务。相比较PCIe寄存器而言DMA下的数据交互对CPU的占用时间会大大降低,可以保证更好的实时性。因此,DMA对于处理大规模高速数据如视频流数据、图像数据等是非常必要的。

img1

1

1Speedgoat FPGACPU数据交互图,设计程序(DUTDesign under test)与Target CPU之间通过DMA engine作为桥梁实现DMA数据交互。由图可知,DUTDMA engine之间有两种交互途径:DUT直接与DMA engine交互, DUT先与External RAM交互再与DMA engine交互。因此Speedgoat FPGA板卡的DMA实现方式也分为两种形式:

Ø       Stream DMA

此种形式下,DUT需要调用AXI4 Stream接口将数据streamDMA engine中,然后再streamsystem memory中。同样的,DUT也可以调用AXI4 Stream接口从DMA engine中接收从system memory中传输过来的数据流。如下图所示:

img2

2

Ø       RAM Frame Buffer

此种形式下,DUT需要调用AXI4 Master接口实现与external RAMDDR3的数据读或写,external RAM通过DMA实现与system memory之间的数据交互。如下图所示:

img3

3

l       AXI 总线

无论是采用Streaming DMA还是RAM Frame Buffer,在阶段中,都绕不开AXI4总线协议。事实上,在使用Speedgoat FPGA板卡的DMA功能时,主要的工作量就是使用HDL Coder来调用和配置AXI4总线接口。因此对AXI4协议进行说明在这里是非常有必要的。

 

AXIAdvanced eXtensible Interface:高级可拓展接口)是ARM公司提出的一个总线协议,AXI42010年发布的AXI协议的第二个版本。AXI4总线包含5个独立的传输通道,分别是:读地址(read address)、读数据(read data)、写地址(write address)、写数据(write data)以及写回复(write response),各通道的作用顾名思义。这些通道都只支持单向传输。单向传输则意味着通道两端的身份是由差异的,AXI4总线传输中,通道两端分为Master主机和Slave从机,主机总是发起读写请求的一方。

img4

4

每个独立通道都包含多种信号,有的信号是全局的时钟信号ACLK有的信号是为了实现通信握手,有的信号是实现数据和控制信息的传输。下表列举了全局信号和读数据通道中的信号,其他通道的信号请参见AMBA AXI4相关标准文档

信号

信号源

功能描述

全局信号

ACLK

时钟

全局时钟信号

ARESETn

复位源

全局复位信号

读数据通道信号

RID

从机

ID

RDATA

从机

读数据

RRESP

从机

读响应,表明读传输的状态

RLAST

从机

表明读突发的最后一次传输

RUSER

从机

用户自定义

RVALID

从机

表明此通道信号有效

RREADY

主机

表明主机能够接收读数据和响应信息

 

总线通信时,依靠这些信号实现握手、地址、数据和回复等信息的传输。

AXI4总线目前主要包含3种类型的接口:

Ø       AXI4:标准的AXI4总线接口,主要面向高性能地址映射通讯的需求,允许最大256轮的数据突发传输;

Ø       AXI4-Lite:一个轻量级、适用于数据吞吐较少的地址映射传输接口,占用的逻辑单元较少

Ø       AXI4-Stream:面向高速流数据的传输去掉了地址线,允许无限制的数据突发传输模式。

这三种接口都被广泛应用于Xilinx FPGA板卡IP核的连接,HDL Coder也对这些接口做了简化支持。

本系列将对Speedgoat FPGA板卡 DMA中广泛使用的AXI4 MasterAXI4 Stream两种接口的原理及HDL实现方法分上、下两篇文章进行说明。本文为上篇,专门介绍AXI4 Master接口。

l       AXI4 Master

AXI4总线通道两端分为Master主机和Slave从机,使用AXI4 Master接口是将DUT作为Master主机,所有读写请求均由DUT来发起。因此AXI4 Master interface就是将DUT作为Master主机的标准AXI4总线接口。

下面介绍一下标准AXI4总线的通信机制:

ê       握手机制

AXI45个独立传输通道均采用VALID/READY的握手通信机制,握手结束之后才会进行地址、数据以及控制信息通信。这是一种双向流控制机制,主机和从机均可以控制信息在主从之间的传输。信息传输源使用VALID(置高)信号表明地址、数据以及控制信号是有效的,信息接收源使用READY(置高)信号表明自己能够接受信息。仅当VALIDREADY信号都为高时才会发生信息传输。

img5

5

五个通道各包含一个握手信号对:

传输通道

握手信号对

写地址通道

AWVALIDAWREADY

写数据通道

WVALIDWREADY

写回复通道

BVALIDBREADY

读地址通道

ARVALIDAWREADY

读数据通道

RVALIDRREADY

 

在不同的传输过程中,各传输通道的握手信号之间还存在着一定的逻辑关系,如谁先谁后的问题,具体关系这里不再赘述,读者可以去查看AMBA AXI4相关标准文档

握手完成之后即可进行信息传输。

ê       信息传输

AXI4总线协议采用突发传输模式(burst-based),每次突发传输时,master主机将控制信息(如burst长度)第一个数据字节的地址传输到slave从机,随着突发传输的进行,slave从机必须计算突发传输中后续数据字节的地址。AXI4支持的最大突发传输长度(burst length)为256,支持的最大突发传输数据宽度(burst size)为128byte

下图为AXI突发传输时读地址和数据通道的时序:

img6

6

下图为AXI突发传输时写地址数据以及回复通道的时序:

img7

7

由上面读和写突发传输的时序图可以看出,如果要通过AXI4协议实现一次或突发传输时,需要通道的握手信号VALID/READY必要的地址、数据以及回复信号ADDR/DATA/RESP/LAST

l       AXI4 Master HDL 实现

如何在Simulink模型中实现AXI4 Master协议呢?使用HDL Coder搭建FPGA模型时,用户无需自己搭建真实的AXI4 Master协议,只需要调用对应传输过程中要使用的通道信号接口搭建一个简化协议即可模型生成的HDL代码包含一个包装逻辑用来将简化协议翻译为真实协议,HDL CoderIP核生成阶段会自动例化对应的AXI4 Master对协议进行实现。简化版协议的好处是不需要太多的通道信号,而且简化了握手机制,支持任意长的突发传输。

n       AXI4 MasterHDL 实现

ê       写传输

img8

9

使用HDL Coder搭建简化版AXI4协议时,用户只需调用wr_readydatawr_addrwr_len以及wr_valid信号即可实现AXI4 Master写传输。DUT主机等待从机如DDR 发送过来的wr_ready信号变高(表明可以接受写数据)来初始化写请求,wr_ready变高之后,DUT发送有DataWrite Master to Slave bus组成的写请求,Write Master to Slave buswr_len(写数据长度)、wr_addr(写地址)以及wr_valid(写有效)组成。输出传输只有在wr_valid信号为高时才能执行,当wr_ready为低时,DUT必须在一个时钟周期内停止数据发送。简化版AXI4 Master写传输时序图和信号端口调用如上图所示。DUT中需要调用的信号接口说明如下图所示(只有部分接口是必的),用户可以根据此接口说明定义端口的方向和数据类型。

img9

10

ê       读传输

img10

11

 使用HDL Coder搭建简化版AXI4协议时,用户只需调用Data,rd_aready,rd_dvalid,rd_addr,rd_len以及rd_avalid信号即可实现AXI4 Master读传输。DUT主机等待从机如DDR发送过来的rd_aready变高(表明可发送读数据)来初始化读请求。当rd_ready变高后,DUT发送由rd_addr(读地址),rd_len(读长度)以及rd_avalid(读有效)组成的Read Master to Slave bus来进行读请求,从机如DDR通过发送Data数据来进行回应。只要rd_dvalid为高,DUT主机就可以一直接收数据。简化版AXI4 Master读传输时序图和信号端口调用如上图所示。DUT中需要调用的信号接口说明如下图所示(只有部分接口是必需的),用户可以根据此接口说明定义端口的方向和数据类型 

img11

12

ê       HDL实现

Simulink模型中,依照上述接口说明,定义信号接口:

img12

13

接口定义完成之后,在HDL Workflow Advisor 步骤1.3中对这些接口进行映射:

img13

14

如此即完成了简化版协议的接口定义与映射。通过这些接口即可实现DUT主机与DDR从机之间的AXI4 Master通信协议。

接口定义和映射之后,DUT设计中还可以通过对握手信号的处理,对地址和读写数据长度的计算以及读写响应信号的处理来控制总线数据的读和写,如下图15中使用状态机Stateflow来实现读写控制HDL Coder支持Stateflow

img14

15

l       DMA实现

AXI4 Master总线协议可以实现DUTexternal RAMDDR)之间的数据交互,即图3中阶段中的工作。阶段中与System Memory之间实现数据交互和同步该如何实现?

Speedgoat HCIP驱动库提供了现成的驱动接口,用户可以直接通过驱动接口实现数据的发和收,Simulink Real Time驱动库提供了中断模块,通过读取DMA中断来实现数据的同步。

img15

22

FPGA RAM Frame Buffer模块用于和external RAMDDR)进行数据交互,用户可以使用这个模块在Simulnk模型中对System memoryDDR之间的数据读写进行DMA

System memory接收或发送的数据通过DMA中断与FPGA端实现同步,Simulink Real TimeIRQ Source模块可以对DMA中断进行读取,使用该模块的输出来触发包含DMA读和写模块的function-call子系统执行

img16

23

或者对整个模型的执行采用DMA中断来触发

img17

24

 

l       PCIe寄存器 vs DMA

上面详细的介绍了Speedgoat FPGA板卡DMA的实现原理与基于模型的实现方式,那么相比PCIe寄存器, RAM Frame BufferCPUFPGA之间的数据读写延迟到底有多大的优化效?下面我们可以通过一个测试实验来探究一下。

具体实验细节如下:

实验内容

分别用PCIe寄存器、RAM Frame Buffer种方式将1000uint32数据从CPU传输到FPGA DUT然后再回馈至CPU,查看CPU在每个任务周期内的最大和平均执行时间。

实验平台

Speedgoat Performance实时主机(Intel i7-7700k 4.2GHz 4 cores

Speedgoat IO334 FPGA板卡

实验软件

Speedgoat HCIP v1.0

MATLAB 2019b

 

实验结果如下:

img18

26

由实验结果可知,在使用PCIe寄存器实现1000uint32数据的loop-back测试时CPU在每个任务周期内,平均计算时间为87.5us,使用RAM Frame Buffer 时,CPU在每个任务周期,平均计算时间为0.25us。相比较可知,在使用DMA之后,相同的数据传输情况下,CPU的平均任务执行时间下降了99.71%,这为其他任务的执行节省了大量CPU资源。

 

2020年8月27日 16:00
浏览量:0