021-64886750

  • 实时目标机

    Simulink模型库

    Demo套件

info@yisuworld.com

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

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

 

前一篇文章介绍了基于AXI4 Master接口的RAM Frame Buffer DMA的实现原理和方法,相信大家已经对AXI4总线以及RAM Frame Buffer有了更全面的了解。本文将介绍另一种基于AXI4 Stream接口Stream DMA实现原理及方法。由于AXI4 StreamAXI4 总线接口进行了简化,因此Stream DMA相较RAM Frame Buffer DMA实现更为简单,使用更加友好。

  l     AXI4 Stream

AXI4 Stream相比较AXI4标准接口,去掉了地址线,允许长度无限制的数据突发传输,而且只有简单的数据发送和接收,减少了延时,特别适合高速数据流的传输,常用于各IP核之间进行高速数据传输。本系列文章中的第六篇Aurora协议使用了AXI4 Stream接口来连接DUTAurora IP核。

AXI4 Stream接口信号如下:

信号

信号源

功能描述

全局信号

ACLK

时钟

全局时钟信号

ARESETn

复位源

全局复位信号

Stream接口信号

TVALID

Stream读写数据有效。为高指示数据有效

TREADY

Stream读写准备。为高表示从机空闲,准备接收数据;为低表示从机设备忙

TDATA

Stream读写数据,84096位宽

TSTRB

字节选通信号。用于表示更新存储器的字节通道,对于数据总线的每8位数据有一位选通信号

TKEEP

字节选通信号。TKEEP未被确认的那些相关的字节是空字节,可以从数据流中去除

TLAST

表明数据流的边界

TID

数据流标识符

TDEST

数据流路由信

TUSER

用户定义的边带信息,这些信息能伴随数据流进行发送

 

ê       握手机制

AXI4 Stream的握手机制与AXI4的一样这里不再复述。

img1

1

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

ê       信息传输

下图为AXI4 Stream的传输时序图:

img2

2

TREADY信号一直处于高电平,从机已经做好了接收数据的准备。TVALID信号变为高电平时,信息发送,当TDATA发送最后一个字节数据时,TLAST发送一个高电平表示数据传输边界。数据传输完毕之后,TVALID置低,一次传输完成。

l       AXI4 Stream HDL 实现

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

 

ê       数据传输

HDL CoderAXI4 Stream协议的简化要更为彻底,在使用HDL Coder搭建简化版AXI4 Stream协议时,用户只需调用DataValid信号即可实现AXI4  Stream数据传输。

img3

3

HDL Coder在生成HDL代码时会默认生成握手信号Ready并且在只有一路stream 通道时还会自动使用Ready信号生成背压处理逻辑。

在多路stream通道下,HDL Coder并不会生成背压机制,需要用户自己搭建,因此一般在搭建简化版AXI4 Stream接口时,还是建议手动创建信号Ready

img4

4

DUT等待DMA engine发送过来的Ready变高(表明从机可以接收主机发送的数据)来初始化发送请求。当Ready变高后,DUT直接向从机DMA engine发送数据Data以及Valid(说明发送有效)。当DMA engine不能再接收数据时,会将Ready置低,DUT必须在一个时钟周期内将Valid拉低并且停止发送数据,直到Ready又被置高。

 

Simulink模型中通过使用HDL FIFO模块来处理背压:

img5

5

 

DUT中需要调用的信号接口说明如下图所示(只有部分接口是必需的),用户可以根据此接口说明定义端口的方向和数据类型。

img6

6

ê       HDL 实现

Simulink模型中,依照上述接口说明,定义信号接口和背压处理

img7

7

 

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

img8

8

如此即完成了简化版协议的接口定义与映射。通过这些接口即可实现DUTDMA engine之间的AXI4 Stream通信协议。

l       DMA实现

img9

9

 

AXI4 Stream总线协议可以实现DUT与DMA engine之间的数据交互,即阶段中的工作。

阶段中与System Memory之间实现数据交互和同步该如何实现?

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

img10

10

DMA readDMA write模块用于和DMA engine进行数据交互,用户可以使用这两个模块在Simulink模型中对System memoryDMA engine之间的数据读写进行DMA

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

img11

11

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

img12

12

 

l       PCIe寄存器 vs Stream DMA vs RAM Frame Buffer

上面详细的介绍了Speedgoat FPGA板卡DMA的实现原理与基于模型的实现方式,那么相比PCIe寄存器RAM Frame BufferStream DMACPUFPGA之间的数据读写延迟到底有多大的优化效?

下面我们可以通过一个测试实验来探究一下。

具体实验细节如下:

实验内容

分别用PCIe寄存器、Stream DMARAM 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

 

实验结果如下:

img13

13

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

 

参考资料:

1.       HCIP documentation (AXI4-Stream)

2.       HDL Coder documentation (AXI4-Stream)

3.       HCIP documentation (AXI4 Master)

4.       HDL Coder documentation (AXI4 Master)

 

 

2020年8月31日 14:53
浏览量:0