-
实时仿真用户案例
Crank-嵌入式GUI设计和开发用户案例
021-64886750
-
实时目标机
Simulink模型库
Demo套件
info@yisuworld.com
Speedgoat FPGA板卡使用系列文章之DMA (下)
前一篇文章介绍了基于AXI4 Master接口的RAM Frame Buffer DMA的实现原理和方法,相信大家已经对AXI4总线以及RAM Frame Buffer有了更全面的了解。本文将介绍另一种基于AXI4 Stream接口的Stream DMA实现原理及方法。由于AXI4 Stream对AXI4 总线接口进行了简化,因此Stream DMA相较RAM Frame Buffer DMA实现更为简单,使用更加友好。
l AXI4 Stream
AXI4 Stream相比较AXI4标准接口,去掉了地址线,允许长度无限制的数据突发传输,而且只有简单的数据发送和接收,减少了延时,特别适合高速数据流的传输,常用于各IP核之间进行高速数据传输。本系列文章中的第六篇Aurora协议就使用了AXI4 Stream接口来连接DUT和Aurora IP核。
AXI4 Stream接口信号如下:
信号 |
信号源 |
功能描述 |
全局信号 |
||
ACLK |
时钟 |
全局时钟信号 |
ARESETn |
复位源 |
全局复位信号 |
Stream接口信号 |
||
TVALID |
主 |
Stream读写数据有效。为高指示数据有效 |
TREADY |
从 |
Stream读写准备。为高表示从机空闲,准备接收数据;为低表示从机设备忙 |
TDATA |
主 |
Stream读写数据,8到4096位宽 |
TSTRB |
主 |
字节选通信号。用于表示更新存储器的字节通道,对于数据总线的每8位数据有一位选通信号 |
TKEEP |
主 |
字节选通信号。TKEEP未被确认的那些相关的字节是空字节,可以从数据流中去除 |
TLAST |
主 |
表明数据流的边界 |
TID |
主 |
数据流标识符 |
TDEST |
主 |
数据流路由信息 |
TUSER |
主 |
用户定义的边带信息,这些信息能伴随数据流进行发送 |
ê 握手机制
AXI4 Stream的握手机制与AXI4的一样,这里不再复述。
图1
握手完成之后即可进行信息传输。
ê 信息传输
下图为AXI4 Stream的传输时序图:
图2
TREADY信号一直处于高电平,从机已经做好了接收数据的准备。当TVALID信号变为高电平时,信息发送,当TDATA发送最后一个字节数据时,TLAST发送一个高电平表示数据传输边界。数据传输完毕之后,TVALID置低,一次传输完成。
l AXI4 Stream HDL 实现
如何在Simulink模型中实现AXI4 Stream协议呢?使用HDL Coder搭建FPGA模型时,用户无需自己搭建真实的AXI4 Stream协议,只需要调用对应传输过程中要使用的通道信号接口搭建一个简化版协议即可。模型生成的HDL代码中会包含一个包装逻辑用来将简化版协议翻译为真实协议,HDL Coder在IP核生成阶段会自动例化对应的AXI4 Stream IP核对协议进行实现。简化版协议的好处是不需要太多的通道信号,而且简化了握手机制,支持任意长的突发传输。
ê 数据传输
HDL Coder对AXI4 Stream协议的简化要更为彻底,在使用HDL Coder搭建简化版AXI4 Stream协议时,用户只需调用Data,Valid信号即可实现AXI4 Stream数据传输。
图3
HDL Coder在生成HDL代码时会默认生成握手信号Ready,并且在只有一路stream 通道时还会自动使用Ready信号生成背压处理逻辑。
在多路stream通道下,HDL Coder并不会生成背压机制,需要用户自己搭建,因此一般在搭建简化版AXI4 Stream接口时,还是建议手动创建信号Ready:
图4
DUT等待DMA engine发送过来的Ready变高(表明从机可以接收主机发送的数据)来初始化发送请求。当Ready变高后,DUT直接向从机DMA engine发送数据Data以及Valid(说明发送有效)。当DMA engine不能再接收数据时,会将Ready置低,DUT必须在一个时钟周期内将Valid拉低并且停止发送数据,直到Ready又被置高。
在Simulink模型中通过使用HDL FIFO模块来处理背压:
图5
DUT中需要调用的信号接口说明如下图所示(只有部分接口是必需的),用户可以根据此接口说明定义端口的方向和数据类型。
图6
ê HDL 实现
在Simulink模型中,依照上述接口说明,定义信号接口和背压处理:
图7
接口定义完成之后,在HDL Workflow Advisor 步骤1.3中对这些接口进行映射:
图8
如此即完成了简化版协议的接口定义与映射。通过这些接口即可实现DUT与DMA engine之间的AXI4 Stream通信协议。
l DMA实现
图9
AXI4 Stream总线协议可以实现DUT与DMA engine之间的数据交互,即阶段①中的工作。
阶段②中与System Memory之间实现数据交互和同步该如何实现?
Speedgoat HCIP驱动库提供了现成的驱动接口,用户可以直接通过驱动接口实现数据的发和收,Simulink Real Time驱动库提供了中断模块,通过读取DMA中断来实现数据的同步。
图10
DMA read和DMA write模块用于和DMA engine进行数据交互,用户可以使用这两个模块在Simulink模型中对System memory与DMA engine之间的数据读写进行DMA。
System memory接收或发送的数据通过DMA中断与FPGA端实现同步,Simulink Real Time中IRQ Source模块可以对DMA中断进行读取,使用该模块的输出来触发包含DMA读和写模块的function-call子系统执行:
图11
或者对整个模型的执行采用DMA中断来触发:
图12
l PCIe寄存器 vs Stream DMA vs RAM Frame Buffer
上面详细的介绍了Speedgoat FPGA板卡DMA的实现原理与基于模型的实现方式,那么相比PCIe寄存器与RAM Frame Buffer,Stream DMA对CPU与FPGA之间的数据读写延迟到底有多大的优化效?
下面我们可以通过一个测试实验来探究一下。
具体实验细节如下:
实验内容 |
分别用PCIe寄存器、Stream DMA、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 |
实验结果如下:
图13
由实验结果可知,在使用PCIe寄存器实现1000个uint32数据的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)
-
电力电子(含控制器和被控对象模型)
凭借多年在电力电子行业累积的经验和能力,我们为用户提供控制器模型和被控对象模型,包括标准库以及定制化服务。¥ 0.00立即购买
-
轨道交通(含控制器和被控对象模型)
凭借多年在轨道交通行业累积的经验和能力,我们为用户提供控制器模型和被控对象模型,包括标准库以及定制化服务。¥ 0.00立即购买
-
信号调理系统
在HIL测试中,硬件在环设备起到模拟被测ECU被控对象的作用。需要根据ECU的PIN脚信息,模拟相应信号。这类设备的核心为实时系统,实时系统会提供相应IO通道,处理信号的产生和采集。但这类IO通道一般为标准规格,比如数字通道为TTL规格,模拟通道只是测电压等;这与被测ECU所需的信号规格有较大差异,故需要一套信号调理系统,负责两者之间信号的转接。¥ 0.00立即购买
-
电机控制Demo套件
使用Simulink和Speedgoat转动无刷直流电机。¥ 0.00立即购买
实时目标机
实时仿真应用场景
学习与支持
关于我们
关注Speedgoat微信公众号
实时仿真解决方案
I/O接口模块
通讯协议模块
FPGA技术
被控部件仿真
Simulink模型库
Demo套件
Speedgoat实时仿真与测试
Crank嵌入式GUI设计与开发