![部署](https://img.shields.io/badge/部署-vivado-FF1010.svg)
# Xilinx FPGA PCIe-XDMA Tutorial
Xilinx FPGA 的 PCIe 保姆级教程 ——基于 **PCIe-XDMA IP核**
## 引言
**PCIe-XDMA** (**DMA Subsystem for PCIe**) 是 Xilinx 提供给 FPGA 开发者的一种免费的、便于使用的 PCIe 通信 IP 核。**图1**是 **PCIe-XDMA** 应用的典型的系统框图, **PCIe-XDMA IP核** 的一端是 PCIe 接口,通过 FPGA 芯片的引脚连接到 Host-PC 的主板的 PCIe 插槽上;另一端是一个 AXI4-Master Port ,可以连接到 AXI slave 上,这个 AXI slave 可以是:
- 一个 AXI Block RAM (AXI BRAM) 或 AXI DDR controller 上,则整个 FPGA 可以看作一个 PCIe 内存设备,Host-PC 可以读写该内存;
- 一个硬件加速器,则 Host-PC 可以通过 PCIe 调用该加速器;
- AXI 桥 (例如 AXI interconnection) ,下游挂多个 AXI slave ,可以同时实现更多功能。
```
|------------| |---------------------------------------------------------------|
| | | |
| | | |---------------| |-------------------| |
| | | | | | | |
| run | PCIe | | PCIe-XDMA | AXI4 | User Logic | |
| C/C++ |<---------->|<-->| IP core |<---------------->| e.g. | |
| software | | | |Master Slave| HW Accelerator | |
| | | | (AXI-master) | Port Port | (AXI-slave) | |
| | | |---------------| |-------------------| |
| | | |
|------------| |---------------------------------------------------------------|
Host-PC FPGA
图1 : PCIe-XDMA 应用的典型系统框图
```
#### FPGA开发板选择
本库提供了3个例程,都在 Digilent [NetFPGA-sume](https://digilent.com/reference/programmable-logic/netfpga-sume/start) (FPGA 型号为 Xilinx Virtex-7 XC7VX690TFFG1761-3) 上运行。如果你手头有其它的 Xilinx 的 7系列以上的 FPGA PCIe 开发板,也可以跟随该教程,因为它不限于具体的 FPGA 型号。
#### 你能学到什么?
跟随本教程,你可以学会:
- 在任意的 Xilinx FPGA PCIe 开发板中使用 PCIe-XDMA IP
- 包括如何阅读 PCB 的原理图来进行正确的 PCIe 引脚分配 。
- 如何在 Linux 中编写 C 语言程序来调用 PCIe-XDMA ,实现 Host-PC 和 FPGA 的数据交互。
- 初步了解 AXI 总线的时序;以及如何用 Verilog 编写简单的 AXI slave 。
## PCIe 简介
PCIe (PCI Express) 是一种差分信号对的高速外设总线。目前具有五代 (Gen1 \~ Gen5) 、4种总线宽度 (x1, x4, x8, x16) 。详见 [doc/PCIe_intro.md](./doc/PCIe_intro.md)
## FPGA PCIe 引脚分配方法
详见 [doc/FPGA_PCIe_pin_assignment.md](./doc/FPGA_PCIe_pin_assignment.md) (**必读!**),它讲解了**如何阅读原理图并编写 Vivado 工程中的 .xdc 文件,对 PCIe 引脚进行约束**。该方法**对各种 FPGA 开发板是通用的**,不局限于本库使用的 NetFPGA-sume 。
## 例程一:基于 blockdesign 的 PCIe BRAM 读写
该例程的结构框图如**图2** 。其中包括:
- 一个用 blockdesign 例化的 **PCIe-XDMA** IP核;
- 一个用 blockdesign 例化的 **AXI-BRAM** IP核;
- 用 blockdesign 将以上二者连接起来。整体而言实现了一个 PCIe 内存设备;
- 在 Host-PC 上编写 C 语言程序去读写它。
```
|------------| |---------------------------------------------------------------|
| | | |
| | | |---------------| |-------------------| |
| | | | | | | |
| run | PCIe | | PCIe-XDMA | AXI4 | AXI-BRAM | |
| C/C++ |<---------->|<-->| IP core |<---------------->| (AXI-slave) | |
| software | | | |Master Slave| | |
| | | | (AXI-master) | Port Port | | |
| | | |---------------| |-------------------| |
| | | |
|------------| |---------------------------------------------------------------|
Host-PC FPGA
图2 : PCIe-XDMA + AXI-BRMA 实现 PCIe 内存设备
```
请按照以下流程学习本例程:
> ***if*** ( 你熟悉 Vivado blockdesign 的开发流程 ) {
>
> 解压、打开并查看 Vivado 工程 [netfpga_pcie_x1_xdma_bram_blockdesign.zip](./netfpga_pcie_x1_xdma_bram_blockdesign.zip)
>
> } ***else*** {
>
> 阅读 [doc/intro_pcie_x1_xdma_bram_blockdesign.md](./doc/intro_pcie_x1_xdma_bram_blockdesign.md)
>
> }
>
> 阅读 [doc/FPGA_plug_and_writebitstream.md](./doc/FPGA_plug_and_writebitstream.md) ,插入 PCIe 并烧录 FPGA
>
> 阅读 [doc/load_xdma_driver.md](./doc/load_xdma_driver.md) ,在 Linux 主机中编译和加载驱动
>
> 阅读 [doc/run_software_xdma_bram.md](./doc/run_software_xdma_bram.md) ,运行C语言程序进行读写测试
## 例程二:基于 Verilog 的 PCIe BRAM 读写
该例程的结构和**图2**相同,只不过不用 block design ,而是用传统的开发方式。这种方式虽然更麻烦,但灵活性更强、有利于进行细节优化。其中包括:
- 一个用传统 IP 例化方式例化的 **PCIe-XDMA** IP核;
- 一个用 Verilog 编写的 **AXI-BRAM** IP核;
- 编写 Verilog 将以上二者连接起来。整体而言实现了一个 PCIe 内存设备;
- 在 Host-PC 上编写 C 语言程序去读写它。
请按照以下流程学习本例程:
> 解压、打开并查看 Vivado 工程 [netfpga_pcie_x1_xdma_bram.zip](./netfpga_pcie_x1_xdma_bram.zip)
>
> ***if*** ( 你看不懂该工程中的 AXI 相关代码 ) {
>
> 阅读 [doc/intro_pcie_x1_xdma_bram.md](./doc/intro_pcie_x1_xdma_bram.md) ,理解如何用 Verilog 编写简单的 AXI-BRAM 存储器
>
> }
>
> 阅读 [doc/FPGA_plug_and_writebitstream.md](./doc/FPGA_plug_and_writebitstream.md) ,插入 PCIe 并烧录 FPGA
>
> 阅读 [doc/load_xdma_driver.md](./doc/load_xdma_driver.md) ,在 Linux 主机中编译和加载驱动
>
> 阅读 [doc/run_software_xdma_bram.md](./doc/run_software_xdma_bram.md) ,运行C语言程序进行读写测试
## 例程三:基于传统开发方式的 PCIe MPEG2 视频编码
该例程的结构如**图3** 。其中包括:
- 一个用传统 IP 例化方式例化的 **PCIe-XDMA** IP核;
- 一个开源的 [MPEG2视频编码器](https://github.com/WangXuan95/FPGA-MPEG2-encoder) (**mpeg2encoder**) ;
- 编写 Verilog 为该 MPEG2 视频编码器实现一层封装 (**axi\_mpeg2encoder\_wrapper**) ,使之能在 AXI 接口的控制下工作;
- 编写 Verilog 将以上二者连接起来。整体而言实现了一个 PCIe 视频编码卡;
- 在 Host-PC 上编写 C 语言程序去调用它,向FPGA写入视频原始像素,读取出编码视频流,实现视频压缩。
```
|------------| |-------------------------------------------------------------
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Xilinx_FPGA_PCIe_保姆级教程_——基于_PCIe_XDMA_IP核_Xilinx-FPGA-PCIe-XDMA-Tutorial.zip (87个子文件)
Xilinx-FPGA-PCIe-XDMA-Tutorial-main
doc
intro_pcie_x1_xdma_mpeg2encoder.md 5KB
intro_pcie_x1_xdma_bram.md 21KB
PCIe_intro.md 2KB
FPGA_PCIe_pin_assignment.md 11KB
FPGA_plug_and_writebitstream.md 1KB
load_xdma_driver.md 2KB
run_software_xdma_bram.md 4KB
intro_pcie_x1_xdma_bram_blockdesign.md 17KB
figures
bga.png 32KB
AXI
axi_read.png 12KB
axi_write.png 17KB
axi_read_2.png 21KB
pcie_plug.png 480KB
eg1
assign_address.png 20KB
const_conn.png 8KB
create_hdl_wrapper.png 24KB
make_external.png 11KB
axi_conn.png 14KB
validation.png 3KB
xdma_ip_config3.png 24KB
after_auto.png 12KB
add_xdma_ip.png 5KB
add_constant.png 4KB
bram_config.png 18KB
conn_auto.png 16KB
xdma_ip_config2.png 30KB
xdma_ip_config5.png 24KB
xdma_ip_config4.png 27KB
add_bram_ip.png 6KB
const_config.png 6KB
blockdesign.png 16KB
xdma_ip_config1.png 32KB
files.png 12KB
pcie_width.png 29KB
schematic_pcie_perst.png 34KB
schematic_pcie_pin_fpga.png 35KB
create_blockdesign.png 7KB
schematic_pcie_perst_1.png 21KB
schematic_pcie.png 45KB
run_software_xdma_mpeg2encoder.md 2KB
LICENSE 35KB
netfpga_pcie_x1_xdma_bram.zip 24.31MB
netfpga_pcie_x1_xdma_bram_blockdesign.zip 13.83MB
netfpga_pcie_x1_xdma_mpeg2encoder.zip 24.33MB
host_software
app_xdma_mpeg2encode
xdma_mpeg2encode.c 13KB
videos
640x480.mkv 1.52MB
960x960.yuv 12.3MB
get_raw_yuyv_from_video.py 2KB
960x960.mkv 1.39MB
352x640.mkv 5.51MB
app_xdma_rw
random.bin 256B
xdma_rw.c 7KB
driver
load_driver.sh 1KB
xdma
cdev_ctrl.h 2KB
cdev_ctrl.c 7KB
libxdma_api.h 4KB
modules.order 66B
.xdma.mod.o.cmd 28KB
.tmp_versions
xdma.mod 564B
xdma.mod.c 9KB
.xdma_cdev.o.cmd 42KB
Makefile 850B
.cdev_xvc.o.cmd 42KB
.cdev_events.o.cmd 42KB
.cdev_ctrl.o.cmd 42KB
xdma_cdev.c 13KB
.xdma_mod.o.cmd 42KB
.libxdma.o.cmd 40KB
cdev_sgdma.h 2KB
.cdev_sgdma.o.cmd 43KB
version.h 858B
xdma_mod.c 9KB
cdev_sgdma.c 14KB
libxdma.c 114KB
cdev_xvc.c 6KB
cdev_xvc.h 908B
.cdev_bypass.o.cmd 42KB
xdma_cdev.h 1KB
.xdma.o.cmd 681B
cdev_bypass.c 4KB
libxdma.o.ur-safe 240B
Module.symvers 1KB
.xdma.ko.cmd 338B
cdev_events.c 3KB
xdma_mod.h 3KB
libxdma.h 17KB
README.md 11KB
共 87 条
- 1
资源评论
好家伙VCC
- 粉丝: 1929
- 资源: 9137
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功