-
应用场景
行业解决方案
-
实时仿真用户案例
Crank-嵌入式GUI设计和开发用户案例
021-64886750
-
实时目标机
Simulink模型库
Demo套件
info@yisuworld.com
Speedgoat FPGA板卡使用系列文章之DMA(上)
l Speedgoat FPGA板卡的DMA
Speedgoat实时系统中,FPGA板卡与CPU之间通过高速PCIe总线连接,二者之间的数据交互有两种形式:PCIe寄存器、DMA(Direct Memory Access:直接存储器访问)。PCIe寄存器使用简单(请见本系列文章第一篇),但进行大批量高速数据交互时,对CPU引入的读写延迟较大,且CPU会长时间保持在忙碌状态,不利于其他任务的实时运行,可能会导致CPU overrun错误。DMA使用稍较复杂,但是数据传输依靠DMA控制器,可以直接将数据从FPGA传输到系统内存,在此期间CPU可以去执行其他任务。相比较PCIe寄存器而言,DMA下的数据交互对CPU的占用时间会大大降低,可以保证更好的实时性。因此,DMA对于处理大规模高速数据如视频流数据、图像数据等是非常必要的。
图1
图1为Speedgoat FPGA与CPU数据交互图,设计程序(DUT:Design under test)与Target CPU之间通过DMA engine作为桥梁实现DMA数据交互。由图可知,DUT与DMA engine之间有两种交互途径:① DUT直接与DMA engine交互,② DUT先与External RAM交互再与DMA engine交互。因此Speedgoat FPGA板卡的DMA实现方式也分为两种形式:
Ø Stream DMA
此种形式下,DUT需要调用AXI4 Stream接口将数据stream到DMA engine中,然后再stream到system memory中。同样的,DUT也可以调用AXI4 Stream接口从DMA engine中接收从system memory中传输过来的数据流。如下图所示:
图2
Ø RAM Frame Buffer
此种形式下,DUT需要调用AXI4 Master接口实现与external RAM如DDR3的数据读或写,external RAM通过DMA实现与system memory之间的数据交互。如下图所示:
图3
l AXI 总线
无论是采用Streaming DMA还是RAM Frame Buffer,在阶段①中,都绕不开AXI4总线协议。事实上,在使用Speedgoat FPGA板卡的DMA功能时,主要的工作量就是使用HDL Coder来调用和配置AXI4总线接口。因此对AXI4协议进行说明在这里是非常有必要的。
AXI(Advanced eXtensible Interface:高级可拓展接口)是ARM公司提出的一个总线协议,AXI4是2010年发布的AXI协议的第二个版本。AXI4总线包含5个独立的传输通道,分别是:读地址(read address)、读数据(read data)、写地址(write address)、写数据(write data)以及写回复(write response),各通道的作用顾名思义。这些通道都只支持单向传输。单向传输则意味着通道两端的身份是由差异的,在AXI4总线传输中,通道两端分为Master主机和Slave从机,主机总是发起读写请求的一方。
图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 Master和AXI4 Stream两种接口的原理及HDL实现方法分上、下两篇文章进行说明。本文为上篇,专门介绍AXI4 Master接口。
l AXI4 Master
AXI4总线通道两端分为Master主机和Slave从机,使用AXI4 Master接口是将DUT作为Master主机,所有读写请求均由DUT来发起。因此AXI4 Master interface就是将DUT作为Master主机的标准AXI4总线接口。
下面介绍一下标准AXI4总线的通信机制:
ê 握手机制
AXI4的5个独立传输通道均采用VALID/READY的握手通信机制,握手结束之后才会进行地址、数据以及控制信息通信。这是一种双向流控制机制,主机和从机均可以控制信息在主从之间的传输。信息传输源使用VALID(置高)信号表明地址、数据以及控制信号是有效的,信息接收源使用READY(置高)信号表明自己能够接受信息。仅当VALID和READY信号都为高时才会发生信息传输。
图5
五个通道各包含一个握手信号对:
传输通道 |
握手信号对 |
写地址通道 |
AWVALID,AWREADY |
写数据通道 |
WVALID,WREADY |
写回复通道 |
BVALID,BREADY |
读地址通道 |
ARVALID,AWREADY |
读数据通道 |
RVALID,RREADY |
在不同的传输过程中,各传输通道的握手信号之间还存在着一定的逻辑关系,如谁先谁后的问题,具体关系这里不再赘述,读者可以去查看AMBA AXI4相关标准文档。
握手完成之后即可进行信息传输。
ê 信息传输
AXI4总线协议采用突发传输模式(burst-based),每次突发传输时,master主机将控制信息(如burst长度)和第一个数据字节的地址传输到slave从机,随着突发传输的进行,slave从机必须计算突发传输中后续数据字节的地址。AXI4支持的最大突发传输长度(burst length)为256,支持的最大突发传输数据宽度(burst size)为128个byte。
下图为AXI突发传输时读地址和数据通道的时序:
图6
下图为AXI突发传输时写地址、数据以及回复通道的时序:
图7
由上面读和写突发传输的时序图可以看出,如果要通过AXI4协议实现一次或多次突发传输时,需要通道的握手信号VALID/READY和必要的地址、数据以及回复信号ADDR/DATA/RESP/LAST。
l AXI4 Master HDL 实现
如何在Simulink模型中实现AXI4 Master协议呢?使用HDL Coder搭建FPGA模型时,用户无需自己搭建真实的AXI4 Master协议,只需要调用对应传输过程中要使用的通道信号接口搭建一个简化版协议即可。模型生成的HDL代码中会包含一个包装逻辑用来将简化版协议翻译为真实协议,HDL Coder在IP核生成阶段会自动例化对应的AXI4 Master核对协议进行实现。简化版协议的好处是不需要太多的通道信号,而且简化了握手机制,支持任意长的突发传输。
n AXI4 Master的HDL 实现
ê 写传输
图9
使用HDL Coder搭建简化版AXI4协议时,用户只需调用wr_ready,data,wr_addr,wr_len以及wr_valid信号即可实现AXI4 Master写传输。DUT主机等待从机如DDR 发送过来的wr_ready信号变高(表明可以接受写数据)来初始化写请求,wr_ready变高之后,DUT发送有Data、Write Master to Slave bus组成的写请求,Write Master to Slave bus由wr_len(写数据长度)、wr_addr(写地址)以及wr_valid(写有效)组成。输出传输只有在wr_valid信号为高时才能执行,当wr_ready为低时,DUT必须在一个时钟周期内停止数据发送。简化版AXI4 Master写传输时序图和信号端口调用如上图所示。DUT中需要调用的信号接口说明如下图所示(只有部分接口是必需的),用户可以根据此接口说明定义端口的方向和数据类型。
图10
ê 读传输
图11
图12
ê HDL实现
在Simulink模型中,依照上述接口说明,定义信号接口:
图13
接口定义完成之后,在HDL Workflow Advisor 步骤1.3中对这些接口进行映射:
图14
如此即完成了简化版协议的接口定义与映射。通过这些接口即可实现DUT主机与DDR从机之间的AXI4 Master通信协议。
接口定义和映射之后,DUT设计中还可以通过对握手信号的处理,对地址和读写数据长度的计算以及读写响应信号的处理来控制总线数据的读和写,如下图15中使用状态机Stateflow来实现读写控制,HDL Coder支持Stateflow:
图15
l DMA实现
AXI4 Master总线协议可以实现DUT与external RAM(DDR)之间的数据交互,即图3中阶段①中的工作。阶段②中与System Memory之间实现数据交互和同步该如何实现?
Speedgoat HCIP驱动库提供了现成的驱动接口,用户可以直接通过驱动接口实现数据的发和收,Simulink Real Time驱动库提供了中断模块,通过读取DMA中断来实现数据的同步。
图22
FPGA RAM Frame Buffer模块用于和external RAM(DDR)进行数据交互,用户可以使用这个模块在Simulnk模型中对System memory于DDR之间的数据读写进行DMA。
System memory接收或发送的数据通过DMA中断与FPGA端实现同步,Simulink Real Time中IRQ Source模块可以对DMA中断进行读取,使用该模块的输出来触发包含DMA读和写模块的function-call子系统执行:
图23
或者对整个模型的执行采用DMA中断来触发:
图24
l PCIe寄存器 vs DMA
上面详细的介绍了Speedgoat FPGA板卡DMA的实现原理与基于模型的实现方式,那么相比PCIe寄存器, RAM Frame Buffer对CPU与FPGA之间的数据读写延迟到底有多大的优化效?下面我们可以通过一个测试实验来探究一下。
具体实验细节如下:
实验内容 |
分别用PCIe寄存器、RAM Frame Buffer两种方式将1000个uint32数据从CPU传输到FPGA DUT然后再回馈至CPU,查看CPU在每个任务周期内的最大和平均执行时间。 |
实验平台 |
Speedgoat Performance实时主机(Intel i7-7700k 4.2GHz 4 cores) Speedgoat IO334 FPGA板卡 |
实验软件 |
Speedgoat HCIP v1.0 MATLAB 2019b |
实验结果如下:
图26
由实验结果可知,在使用PCIe寄存器实现1000个uint32数据的loop-back测试时,CPU在每个任务周期内,平均计算时间为87.5us,使用RAM Frame Buffer 时,CPU在每个任务周期,平均计算时间为0.25us。相比较可知,在使用DMA之后,相同的数据传输情况下,CPU的平均任务执行时间下降了99.71%,这为其他任务的执行节省了大量CPU资源。
-
电力电子(含控制器和被控对象模型)
凭借多年在电力电子行业累积的经验和能力,我们为用户提供控制器模型和被控对象模型,包括标准库以及定制化服务。¥ 0.00立即购买
-
轨道交通(含控制器和被控对象模型)
凭借多年在轨道交通行业累积的经验和能力,我们为用户提供控制器模型和被控对象模型,包括标准库以及定制化服务。¥ 0.00立即购买
-
信号调理系统
在HIL测试中,硬件在环设备起到模拟被测ECU被控对象的作用。需要根据ECU的PIN脚信息,模拟相应信号。这类设备的核心为实时系统,实时系统会提供相应IO通道,处理信号的产生和采集。但这类IO通道一般为标准规格,比如数字通道为TTL规格,模拟通道只是测电压等;这与被测ECU所需的信号规格有较大差异,故需要一套信号调理系统,负责两者之间信号的转接。¥ 0.00立即购买
-
电机控制Demo套件
使用Simulink和Speedgoat转动无刷直流电机。¥ 0.00立即购买
实时目标机
仿真测试应用场景
学习与支持
关注熠速微信公众号
仿真测试解决方案
I/O接口模块
通讯协议模块
FPGA技术
被控部件仿真
Simulink模型库
Demo套件
测量测试解决方案