基于Xilinx XDMA 的PCIE通信

本文详述了基于Xilinx XDMA的PCIe通信实现过程,包括读写BRAM和DDR实例,涉及PCIe BAR空间访问,通过CMD命令进行数据传输并验证正确性。
摘要由CSDN通过智能技术生成

基于Xilinx XDMA 的PCIE通信

概述:
  想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。实践实践!!!

说明:
参考文档:
PCI Express Base Specification Revision 3.0
PCI Express Base Specification Revision 5.0
pg195-pcie-dma
PCI Express体系结构导读

环境:Vivado2019.2。

第一篇:基于Xilinx XDMA 的PCIE通信
第二篇:基于XDMA 的PCIE读写DDR

直通☛ 200页+ FPGA/IC秋招面试笔试题


一、读写BRAM实例

读写文件:

1、PC通过CMD执行以下命令,将 pc2fpga.bin 文件下的4096Byte写入FPGA 起始地址为0x00000000:

xdma_rw.exe h2c_0 write 0x0000000 -b -f pc2fpga.bin -l 4096

pc2fpga.bin文件内容如下所示:
在这里插入图片描述
PC通过CMD执行以下命令(TX):
在这里插入图片描述
FPGA数据接收(RX):
在这里插入图片描述

2、PC通过CMD执行以下命令,从FPGA读取4096Byte写入到PC的 fpga2pc.bin 文件里:

xdma_rw.exe c2h_0 read 0x0000000 -b -f fpga2pc.bin -l 4096

PC通过CMD执行以下命令(RX):
在这里插入图片描述
观察在cmd访问的文件夹下,接收并创建了fpga2pc.bin文件,大小为4KB
在这里插入图片描述
接收到的数据fpga2pc.bin 如下所示:
在这里插入图片描述

FPGA端正在上传的数据(TX):
在这里插入图片描述
FPGA上传的数据是怎么产生的?
PC端接收到的数据是FPGA提前写入BRAM的数据,当PC下发读取指令时即读取的为BRAM的数据,那我们BRAM提前写入的是什么呢?提前通过RTL代码将一下数据写入BRAM0。
在这里插入图片描述
则BRAM中的数据为:

0123456789abcdef
00h0000000004040404080808080c0c0c
10h1010101014141414181818181c1c1c
20h2020202024242424282828282c2c2c

再对比读回来的数据,无误。

读写数据:

3、PC通过CMD执行以下命令,写32Byte

0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f

的数据到FPGA:

xdma_rw.exe h2c_0 write 0x0000008  -l 32 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f

PC端 cmd输入(TX):
在这里插入图片描述
FPGA数据接收(RX):
在这里插入图片描述

4、PC通过CMD执行以下命令,读取32Byte的数据到PC:

xdma_rw.exe c2h_0 read 0x0000000  -l 32

PC端 cmd输入(RX):
在这里插入图片描述
FPGA正在上传的数据(TX):
在这里插入图片描述

2.5.2 BAR空间的访问

对应的是对BAR_PORT的操作。

在这里插入图片描述

1、PC通过CMD执行以下命令,通过PCIe BAR空间将4Byte数据映射到AXI_Lite寄存器:

xdma_rw.exe control write 0x08 -l 32 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f

PC端 cmd输入(TX):
在这里插入图片描述

FPGA接收的数据(RX):
在这里插入图片描述

2、PC通过CMD执行以下命令,PCIe BAR空间访问AXI_Lite寄存器读取4Byte的数据:

xdma_rw.exe user read 0x08 -l 4

PC端 cmd输入(RX):
在这里插入图片描述
观察接收到FPGA返回的数据为0x08080808.
观察FPGA正在上传的数据(TX):
在这里插入图片描述
无误。

二、读写DDR实例

1、PC通过CMD执行以下命令,将 pc2fpga.bin 文件下的4096Byte写入DDR起始地址为0x00000000:

xdma_rw.exe h2c_0 write 0x0000000 -b -f pc2fpga.bin -l 4096

pc2fpga.bin文件内容如下所示:
在这里插入图片描述
PC通过CMD执行以下命令(TX):
在这里插入图片描述
验证数据是否写入DDR,我们通过逻辑代码进行DDR数据的读取:
从地址0000_0000h读取大小为4096Byte的数据。
在这里插入图片描述
观察源文件其实就是斜坡数据。
在这里插入图片描述

观察第一个256bit数据为:
在这里插入图片描述
最后一个256bit数据为:
在这里插入图片描述
在PC CMD端输入以下指令也读取DDR数据,与用户读取的数据进行对比,无误。

xdma_rw.exe c2h_0 read 0x0000000  -l 4096

CMD读取的数据:
在这里插入图片描述
在这里插入图片描述

2、通过VIO输入地址和数据大小,进行相应的DDR数据读取。
从地址0000_0080读取64Byte的数据,即512bit数据。
在这里插入图片描述

对比PC端读取DDR0000_0080读取64Byte的数据,一样的✌
在这里插入图片描述

3、FPGA端通过VIO实现从DDR任意地址,任意地址大小数据的读取。
user_raddr:通过VIO写入要读取DDR数据的地址。
user_rsize:通过VIO写入要读取DDR数据的大小(单位为Byte)。
user_rexe:点击一次,执行一次读操作。
请添加图片描述

5.2 BAR空间的访问

1、PC通过CMD执行以下命令,通过PCIe BAR空间将4Byte数据映射到AXI_Lite寄存器:

xdma_rw.exe control write 0x08 -l 32 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f

PC端 cmd输入(TX):
在这里插入图片描述

FPGA接收的数据(RX):
在这里插入图片描述

2、PC通过CMD执行以下命令,PCIe BAR空间访问AXI_Lite寄存器读取4Byte的数据:

xdma_rw.exe user read 0x08 -l 4

PC端 cmd输入(RX):
在这里插入图片描述
观察接收到FPGA返回的数据为0x08080808.
观察FPGA正在上传的数据(TX):
在这里插入图片描述
无误。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字硬鉴

你的鼓励就是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值