1 测试工程
使用Vivado创建的XDMA测试工程如下图所示,XDMA IP的设置如下,其它保持默认。XDMA的AXI、AXI Lite和AXI Bypass都接BRAM,每个BRAM的地址设置如下图。该工程可从Github下载,使用的FPGA板卡为浪潮的F37X加速器,运行工程目录下的run.sh执行run.tcl即可完成工程的创建和编译。注意AXI Lite接口需要连接,如果不连接重启失败,可能是系统重启时XDMA的驱动需要通过AXI Lite接口读取配置信息。
- PCIe Block Location: PCIE4C X1Y0
- Lane Width: X16
- Maximum Link Speed: 8.0GT/s
- Reference Clock Frequency: 100MHz
- AXI Data Width: 512bit
- AXI Clock Frequency: 250
- Vendor ID: 10EE
- Device ID: 903F
- 勾选PCIe to AXI Lite Master Interface和64bit Enable
- 勾选PCIe to DMA Interface和64bit Enable
- 勾选PCIe to DMA Bypass Interface和64bit Enable
2 驱动安装
本节主要介绍XDMA驱动的源文件、编译和安装过程。
2.1 源文件说明
1.下载地址:DMA驱动下载
2.文件说明
文件 | 说明 |
---|---|
include | 编译依赖文件 |
tests | 测试文件 load_driver:加载驱动 run_test.sh:执行DMA测试 dma_memory_mapped_test:MM测试调用的脚本 dma_streaming_test.sh:Stream测试调用的脚本 data:测试数据 |
tools | 工具文件 reg_rw.c:AXI Lite和AXI Bypass通道读写寄存器工具 dma_to_device.c:AXI通道写寄存器工具 dma_from_device.c:AXI通道读寄存器工具 |
xdma | 驱动源文件 xdma_mod.c:添加新设备的Vendor ID和Device ID |
readme.txt | 说明文件 |
RELEASE | 版本说明 |
COPYING | 权限 |
LICENSE | 证书 |
2.2 驱动编译安装
1.驱动编译:在xdma中执行sudo make install
命令编译驱动,生成xmda.ko文件。
2.编译工具:在tools中执行make
命令编译工程,生成reg_rw、dma_to_device、dma_from_device可执行文件。
3.驱动加载:在tests中执行sudo ./load_driver.sh
加载驱动
4.如果需要增加设备ID,需要修改xdma/xdma_mod.c文件,在”pci_device_id“结构体下增加PCI_DEVICE的Vendor ID和Device ID。
3 测试说明
本节介绍XDMA的测试结果。
3.1 设备管理
1.下载FPGA程序,重新启动系统,执行sudo ./load_driver.sh
加载驱动,显示如下说明驱动加载和设备识别成功。执行rmmod xdma
可卸载驱动。
2.执行lsmod | grep xdma
查看xdma驱动是否成功加载。
3.执行ls /dev/xdma*
查看xdma设备是否存在。xdma0_h2c_0是AXI主机到卡的通道,xdma0_c2h_0是AXI卡到主机的通道,因为XDMA IP中只启用了一个H2C和C2H通道,所以这儿只有一个。xdma0_user是AXI Lite通道,xdma0_bypass是AXI Bypass通道,xdma0_contorl是PCIe 配置空间的读写通道,xdma0_event_*是16个用户中断,在IP核配置时使能了才有用。
4.当主机系统中有两块加速卡,都下载了XDMA工程,执行ls /dev/xdma*
会列出如下两个设备,直接使用脚本run_test.sh
进行测试会失败。
5.使用命令lspci -vd 1bd4:
可查看设备的信息,其中1bd4是XDMA IP设置时设置的Vendor ID。“Memory at e0000000…”指示BAR0上AXI Lite通道的存储空间,可以在IP设置时进行修改。“Memory at f0000000…”指示BAR2上AXI通道的存储空间。不同设置下各通道占据的BAR空间位置如下图所示。
3.2 数据读写
1.reg_rw工具,执行reg_rw -h
可查看使用说明
reg_rw <device> <address> <type> <data>
--<device>: ls /dev/xdma*中的设备
--<address>: 寄存器地址
--<type>: 数据类型:b(byte)-8字节;h(halfword)-16字节;w(word)-32字节
--<data>: 写入数据,如果没有这一项,则表示读取数据
1.1 写入数据
1.2读出数据
2.dma_to_device,执行./dma_to_device -h
可查看使用说明
dma-to-device [OPTIONS]
-d:ls /dev/xdma*中的设备
-f:发送给卡的数据文件
-w:从卡中读数据写入的文件
-s:发送数据的字节数
-a:寄存器地址
-c:传输次数
-o:offset
-k:aperture
3.dma_from_device,执行./dma_from_device -h
可查看使用说明
dma-from-device [OPTIONS]
-d:ls /dev/xdma*中的设备
-f:发送给卡的数据文件
-w:从卡中读数据写入的文件
-s:发送数据的字节数
-a:寄存器地址
-c:传输次数
-o:offset
-k:aperture
文章来源:https://www.toymoban.com/news/detail-419827.html
3.3 测试结果
执行tests文件夹下的脚本run_test.sh
完成对XDMA的测试,整个测试流程包括查询使能通道、确定接口方式(MM or ST),根据接口方式调用脚本dma_memory_mapped_test.sh或者dma_streaming_test。dma_memory_mapped_test.sh和dma_streaming_test脚本首先使用dma_to_device命令发送测试数据到BRAM,然后使用dma_from_device命令从BRAM中取出数据,最后对比两个文件的数据是否一致。测试记过如下图所示。
文章来源地址https://www.toymoban.com/news/detail-419827.html
到了这里,关于Xilinx XDMA说明和测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!