Xilinx PCIe XDMA使用指南

1. 为什么使用pcie传输
在fpga需要和处理器打交道时,无论是x86,还是powerpc,以及一些嵌入式的arm等,对外的接口常见如下表。
其中,usb需要外部的phy对接fpga,而且需要firmware;以太网走到tcp才会保证不丢数据;pci逐渐淘汰了,占用引脚多,而且带宽有限;sata侧重存储,其协议的局限性比较高;rapidio在一些场合使用,结构可以做到full mesh结构,但是这些年发展速度比较慢。
而pcie具备如下优点:
a. 带宽高,目前fpga有pcie gen3 x16,或者pcie gen4 x8,链路速度可以达到128gbps;
b. fpga直连,不需要外部phy;
c. 协议保证数据无误传输,两级crc,重传机制,保证数据无误;
d. 软件生态丰富,各种系统原生支持,通过简单的驱动就可以完成数据交互;
e. 在pcie之上的协议逐渐增多,例如nvme是基于pcie的上层协议;
xilinx从15年前,v4系列开始,一直在pcie的解决方案上深耕,提供众多的应用方案级的解决方案,方便用户专注于自己的应用。早期,xilinx提供的有application notes,例如xapp859,xapp1052等,构建了基本的双向数据传输。当时一些第三方公司,类似于plda,nwlogic也出针对xilinx fpga的pcie传输方案。
后来,xilinx团队2017年附近推出xdma解决方案,并持续增加功能、修正bug,到目前为止,xdma已经成为一个功能强大、成熟稳定的xilinx fpga解决方案。功能上涵盖了sg功能,axi-lite功能,多通道分离,axi-mm和axi-stream支持等。稳定性上,经过4年的逐步完善,目前已经有众多的客户基于这套方案实现产品,涵盖医疗、电力、通讯、数据中心等各种应用。
最重要的是,xdma是免费的!!!
2. xdma ip配置实例
xilinx xdma支持的系列包括7系列,ultrascale系列,ultrascale+系列各种系列,界面配置基本相同。这里以ku040的一个板子做例程,其他系列可以参考。vivado使用2018.3,vivado的版本,做xdma,建议尽量使用新一些的版本。详细的说明,参考xilinx的文档pg195,下面主要摘取影响使用的关键部分。
配置ip
第一页,ip基本配置。
红色框根据实际板卡硬件来选择,lane width是物理的位宽;link speed是希望运行在那个速率。速率和位宽越高,最终的带宽就越高,对应fpga内的资源和频率也相对多一些。
绿色框是选择接口方式,axi memory mapped选择用户接口是axi内存映射的接口,常见用于对接ddr、ram等有地址寻址的外设。axi stream的用户接口是流接口,类似于一段数据包,fifo流等。ip只能支持其中一种选择,不能说多通道混合使用不同的用户接口,所以用户需要分析自己的数据接入方式,慎重选择。
常见的,例如adc采集,如果带ddr,则可以把adc暂存在ddr中,xdma使用axi-mm的方式读取ddr数据;也可以adc通过fifo缓存后,xdma使用axi-stream读取fifo,不过需要注意adc速度非常高的时候容易溢出。
例如,读取外部网络报文,报文长短不一,使用axi-stream接口方式比较合适。
第二页,vid,did,class等选择。
如果没有特殊的需要,这一页可以不变。尤其是vendor id,device id,尽量不修改,因为xilinx提供的驱动是对应这些vid,did的。
第三页,pcie bar空间。
红色框,pcie to axi lite master interface可以选择上。通常,这个接口可以用作寄存器接口。上位机需要控制板卡内的用户寄存器,可以通过这个接口扩展。
通常来说,寄存器接口尽量对齐,比如常用32bit寄存器。
第四页,杂项
需要关注的是用户中断数量,是从用户层通知cpu的中断。注意,xdma本身的操作中断不算在内,这里是用户产生的中断。
第五页,dma通道选择
需要关注的是红色框,读写通道数量选择,根据实际的业务来选择。例如有4路adc数据传输,可以选择c2h为4,当然,也可以4路adc数据在fpga内合并后成1路,然后只选择c2h为1 。
生成example design例程
上一步ip配置后,在生成的ip上,右键点击,选择打开open example design。
生成的例程,如果选择是axi-mm的用户接口,那么这个接口对接的是axi接口形式的block ram,上位机可以读/写这片ram。如果选择的是axi-stream接口,例程中将stream读写环回,上位机写下去的内容再读回去。
此外,第三页bar空间如果勾选了pcieto axi lite master interface,例程中会额外多出来一个axi接口的block ram。如果需要,可以将这块修改为寄存器接口。
修改约束引脚后,生成bit文件,下载到fpga中,并重启电脑,注意这里说的是重启电脑,不是关机再开机。电脑重启的开始,bios会重新扫描pcie设备,才能被cpu枚举。
3. block design下快速构建xdma subsystem
上面的例程,例化一个ip,然后打开example design的方式。实际使用,可以用block design快速构建xdma的设计。
下面举例,快速构建一个xdma到ddr4传输的设计。
1. 新建block design,加入xdma ip和ddr4 mig ip。xdma配置参考上面描述的内容,ddr4根据板卡实际的选择配置。
2. 连接关系很简单,xdma的m_axi接口通过axi_interconnect连接ddr4,这里axi_interconnect起到时钟域转换的作用。
3. 地址分配,将ddr4的空间分配到xdma中即可。
4. 生成block design的wrapper,修改正确的引脚约束后,生成bit文件。下载到fpga后重启电脑。
block design的方式,适用于快速构建比较复杂的设计,例如包含ddr4,datamover等各种基于axi互联的ip。
4. 驱动和软件应用
通过pci utility查看设备
pci utility工具,用于查看pcie设备各种属性的工具。linux系统默认自带了pci utility工具,windows下也有对应版本,在github上搜索。
lspci命令,列举所有pci和pcie设备:
红色框,即上面配置的xdma example design。
lspci -vv -s 02:00.0 命令,详细列出位于02:00.0槽位的xilinx设备详细信息。
这里把一些信息列举下来:
a. region 0,这个是上面pcie to axi lite master interface选择的空间。region 1,这个是xdma ip自身内部寄存器空间,不用关心。
b. maxpayload size是256字节,是系统协商的,不能修改。maxreadreq是最大请求字节,协商后是512字节。
c. lnkcap字段,是协商后的pcie链路状态,上面写的速度是8g,位宽是x4。pcie ip上选择的是8g,这个目前协商到了。位宽选择x8,实际是x4,因为这个机箱用的一个x4pcie延长线,限制了适配到x8位宽。
d. lnkctl2,显示设备最大能支持到8g的链路速度。
5. 驱动安装,linux环境
linux的驱动在github上,https://github.com/xilinx/dma_ip_drivers,下载到宿主机。
readme.txt中有驱动使用说明,目录结构、安装使用等。tests目录下有安装脚本,测试脚本等。
5.1. 驱动安装
tests目录下,sh load_driver.sh即安装驱动,安装成功会提示。
安装完毕,查看/dev目录下,多出来一些xdma0开头的设备。
文件目录分别说明下
a. _c2h_x,是card to host的设备,板卡向cpu传输数据的时候使用这个设备;
b. _h2c_x,是host to card的设备,cpu向板卡发送数据的时候使用这个设备;
c. _control,是xdma的内部寄存器控制设备,一般用户不需要使用;
d. _user,是pcie to axi lite master interface选择的空间;
e. _event_x,是ip配置第四页,选择的用户层中断对应的设备;
5.2 软件测试,linux环境
如果ip配置选择axi-memory map,参考dma_memory_mapped_test.sh,这个脚本写入一段数据到blockram中,然后读出对比。
如果ip配置选择axi-stream接口,参考dma_streaming_test.sh,脚本写入一段数据,回环后读回校验。
上述两个例子,用下面的命令测试。
sh dma_memory_mapped_test.sh 1024 1 1 1
block design下,ddr4显示已经校准完毕。使用dma_memory_mapped_test.sh测试,数据写入ddr4,然后再从ddr4读回。
faq
1. windows下安装驱动,安装后驱动有一个感叹号,不能正常使用。
windows从win764bit开始,安装驱动必须的签名,win7的签名和win10的签名还不同。xilinx提供的windows驱动不包括驱动签名,安装的时候就出现感叹号。
这个问题可以百度下,开机的时候选择禁止驱动签名。或者购买微软的签名即可。
例如下图,是一个公司购买了签名,签名这个驱动后的状态,可以直接安装好驱动。
2. linux下,stream模式接收溢出。
ip设置为stream模式,默认linux上有循环buffer来处理接收的数据。如果stream接收的速率太高,超过驱动和应用能处理的范围,就会出现溢出的问题。出现溢出后,驱动里做了错误恢复,一段数据就丢掉了。


集思宝北斗高精度手持机-G659
刷脸技术受瞩目 创新创业成焦点 2015中国(成都)电子展开幕
国产AD+全志T3开发案例,为能源电力行业排忧解难!8/16通道
温度测量处理变送器设计
新松多可协作机器人助力汽车生产自动化率再提升
Xilinx PCIe XDMA使用指南
自研芯片能给格力带来什么?
我国物联网发展面临五大瓶颈
预计2022年,电动汽车制造商特斯拉的交付量将超100万辆
G-MRCO-001磁传感器检测好坏的方法
天猫精灵CC评测 699元价位搭配这样的硬件配置是非常具有诱惑的
普通快充和氮化镓充电器哪个比较好
10月22日,意法半导体推出STM32WB35和STM32WB30超值产品线
认识增强现实抬头显示中色彩饱和度和色域的重要性
iOS11开发者预览版 Beta2有什么变化值得升级吗?iOS11描述文件下载
调谐MAX2009/MAX2010射频预失真器以获得最佳性能
Apple Silicon基于ARM指令集打造自研芯片将成为Mac主运算平台
智能电容器抗谐波的原理
光感技术集成----血氧仪灯珠
ROG游戏手机2评测 2无疑是一款追求极致手游体验的“硬核”旗舰