• Stars
    star
    401
  • Rank 107,625 (Top 3 %)
  • Language Batchfile
  • License
    GNU General Publi...
  • Created almost 2 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Xilinx FPGA PCIe 保姆级教程 ——基于 PCIe XDMA IP核

部署

Xilinx FPGA PCIe-XDMA Tutorial

Xilinx FPGA 的 PCIe 保姆级教程 ——基于 PCIe-XDMA IP核

 

引言

PCIe-XDMA (DMA Subsystem for PCIe) 是 Xilinx 提供给 FPGA 开发者的一种免费的、便于使用的 PCIe 通信 IP 核。图1PCIe-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 (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

 

FPGA PCIe 引脚分配方法

详见 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

  } else {

    阅读 doc/intro_pcie_x1_xdma_bram_blockdesign.md

  }

  阅读 doc/FPGA_plug_and_writebitstream.md ,插入 PCIe 并烧录 FPGA

  阅读 doc/load_xdma_driver.md ,在 Linux 主机中编译和加载驱动

  阅读 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

    if ( 你看不懂该工程中的 AXI 相关代码 ) {

      阅读 doc/intro_pcie_x1_xdma_bram.md ,理解如何用 Verilog 编写简单的 AXI-BRAM 存储器

    }

    阅读 doc/FPGA_plug_and_writebitstream.md ,插入 PCIe 并烧录 FPGA

    阅读 doc/load_xdma_driver.md ,在 Linux 主机中编译和加载驱动

    阅读 doc/run_software_xdma_bram.md ,运行C语言程序进行读写测试

 

 

例程三:基于传统开发方式的 PCIe MPEG2 视频编码

该例程的结构如图3 。其中包括:

  • 一个用传统 IP 例化方式例化的 PCIe-XDMA IP核;
  • 一个开源的 MPEG2视频编码器 (mpeg2encoder) ;
  • 编写 Verilog 为该 MPEG2 视频编码器实现一层封装 (axi_mpeg2encoder_wrapper) ,使之能在 AXI 接口的控制下工作;
  • 编写 Verilog 将以上二者连接起来。整体而言实现了一个 PCIe 视频编码卡;
  • 在 Host-PC 上编写 C 语言程序去调用它,向FPGA写入视频原始像素,读取出编码视频流,实现视频压缩。
|------------|            |------------------------------------------------------------------------------|
|            |            |                                                                              |
|            |            |    |---------------|                  |----------------------------------|   |
|            |            |    |               |                  |                                  |   |
|            |            |    |               |                  |              |---------------|   |   |
|   run      |    PCIe    |    |   PCIe-XDMA   |                  |  control --->|               |   |   |
|  C/C++     |<---------->|<-->|    IP core    |       AXI4       |  status  <---|               |   |   |
|  software  |            |    |               |<---------------->|              |  mepg2encoder |   |   |
|            |            |    |  (AXI-master) |Master       Slave|     data --->|               |   |   |
|            |            |    |               | Port        Port |     data <---|               |   |   |
|            |            |    |               |                  |              |---------------|   |   |
|            |            |    |---------------|                  |                                  |   |
|            |            |                                       |     axi_mpeg2encoder_wrapper     |   |
|            |            |                                       |         (AXI slave)              |   |
|            |            |                                       |----------------------------------|   |
|            |            |                                                                              |
|------------|            |------------------------------------------------------------------------------|
  Host-PC                                                        FPGA
                 图3 : PCIe-XDMA + AXI-BRMA 实现 PCIe 内存设备

请按照以下流程学习本例程:

    打开并查看 Vivado 工程 netfpga_pcie_x1_xdma_mpeg2encoder.zip

    if ( 你看不懂该工程中的 AXI 相关代码 ) {

      阅读 doc/intro_pcie_x1_xdma_bram.md ,理解 AXI 总线时序

      阅读 doc/intro_pcie_x1_xdma_mpeg2encoder.md

    }

    阅读 doc/FPGA_plug_and_writebitstream.md ,插入 PCIe 并烧录 FPGA

    阅读 doc/load_xdma_driver.md ,在 Linux 主机中编译和加载驱动

    阅读 doc/run_software_xdma_mpeg2encoder.md ,运行C语言程序进行读写测试

 

 

后续工作

后续我可能再加一个例程:

  • 基于 blockdesign 的 PCIe 算法加速器 :用 HLS 编写一个加速器 (比如 FFT) ,封装为 AXI slave IP ,然后用 blockdesign 将它和 PCIe-XDMA IP 集成起来,实现一个简单的 PCIe 算法加速器。

 

 

参考资料

More Repositories

1

FPGA-USB-Device

An FPGA-based USB full-speed device core to implement USB-serial, USB-camera, USB-audio, USB-hid, etc. It requires only 3 FPGA common IOs rather than additional chips. 基于FPGA的USB full-speed device端控制器,可实现USB串口、USB摄像头、USB音频、U盘、USB键盘等设备,只需要3个FPGA普通IO,而不需要额外的接口芯片。
Verilog
547
star
2

FPGA-FOC

FPGA-based Field Oriented Control (FOC) for driving BLDC/PMSM motor. 基于FPGA的FOC控制器,用于驱动BLDC/PMSM电机。
Verilog
489
star
3

BSV_Tutorial_cn

一篇全面的 Bluespec SystemVerilog (BSV) 中文教程,介绍了BSV的调度、FIFO数据流、多态等高级特性,展示了BSV相比于传统Verilog开发的优势。
Bluespec
487
star
4

USTC-RVSoC

An FPGA-based RISC-V CPU+SoC with a simple and extensible peripheral bus. 基于FPGA的RISC-V CPU+SoC,包含一个简单且可扩展的外设总线。
SystemVerilog
344
star
5

FPGA-ftdi245fifo

FPGA-based USB fast data transmission using FT232H/FT600 chip. 使用FT232H/FT600芯片进行FPGA与电脑之间的高速数据传输。
Verilog
252
star
6

FPGA-SDcard-Reader

An FPGA-based SD-card reader to read files from FAT16 or FAT32 formatted SD-cards. 基于FPGA的SD卡读取器,可以从FAT16或FAT32格式的SD卡中读取文件。
Verilog
244
star
7

FPGA-CAN

An FPGA-based lightweight CAN bus controller. 基于FPGA的轻量级CAN总线控制器。
Verilog
203
star
8

FPGA-JPEG-LS-encoder

An FPGA-based JPEG-LS encoder, which provides lossless and near-lossless image compression with high compression ratios. 基于FPGA的JPEG-LS编码器,可实现高压缩率的无损/近无损图像压缩。
Verilog
193
star
9

FPGA-DDR-SDRAM

An AXI4-based DDR1 controller to realize mass, cheap memory for FPGA. 基于FPGA的DDR1控制器,为低端FPGA嵌入式系统提供廉价、大容量的存储。
Verilog
134
star
10

FPGA-FixedPoint

A Verilog fixed-point lib: custom bit width, arithmetic, converting to float, with single cycle & pipeline version. 一个Verilog定点数库,提供算术运算、与浮点数的互相转换,包含单周期和流水线两种实现。
Verilog
120
star
11

FPGA-MPEG2-encoder

FPGA-based high performance MPEG2 encoder for video compression. 基于FPGA的高性能MPEG2视频编码器,可实现视频压缩。
Verilog
106
star
12

FPGA-SDfake

Imitate SDcard using FPGAs. 使用FPGA模拟和伪装SD卡。
Verilog
103
star
13

FPGA-NFC

Build an NFC (RFID) card reader using FPGA and simple circuit instead of RFID-specfic chip. 用FPGA+分立器件电路搭建一个NFC(RFID)读卡器,不需要专门的RFID芯片。
Verilog
102
star
14

FPGA-UART

Include 3 independent modules: UART receiver, UART transmitter, UART to AXI4 master. 包含3个独立模块:UART接收器、UART发送器、UART转AXI4交互式调试器。
Verilog
99
star
15

FPGA-Gzip-compressor

FPGA-based GZIP (deflate) compressor. Input raw data and output standard GZIP format (as known as .gz file format). 基于FPGA的GZIP压缩器。输入原始数据,输出标准的GZIP格式,即常见的 .gz / .tar.gz 文件的格式。
Verilog
89
star
16

FPGA-PNG-decoder

An FPGA-based PNG image decoder, which can extract original pixels from PNG files. 基于FPGA的PNG图像解码器,可以从PNG文件中解码出原始像素。
Verilog
85
star
17

Zynq-Tutorial

使用 Vivado+PetaLinux 为 Xilinx Zynq7 搭建 Linux 系统 —— 以 Zedboard 为例
C
83
star
18

UH-JLS

FPGA-based Ultra-High Throughput JPEG-LS encoder, which provides lossless image compression. 一个超高性能的FPGA JPEG-LS编码器,用来进行无损图像压缩。
SystemVerilog
82
star
19

FPGA-SATA-HBA

A SATA host (HBA) core based on Xilinx FPGA with GTH to read/write hard disk. 一个基于Xilinx FPGA中的GTH的SATA host控制器,用来读写硬盘。
SystemVerilog
79
star
20

FPGA-SDcard-Reader-SPI

An FPGA-based SD-card reader via SPI bus, which can read files from FAT16 or FAT32 formatted SD-cards. 基于FPGA的SD卡读取器(通过SPI总线),可以从FAT16或FAT32格式的SD卡中读取文件。
Verilog
75
star
21

FPGA-RMII-SMII

An FPGA-based MII to RMII & SMII converter to connect 100M ethernet PHY chip such as LAN8720 or KSZ8041TLI-S. 基于FPGA的MII转RMII和MII转SMII,用来连接LAN8720、KSZ8041TLI-S等百兆以太网PHY芯片。
Verilog
73
star
22

UniPlug-FPGA

一个FPGA核心板设计,体积小、低成本、易用、扩展性强。
Verilog
72
star
23

FPGA-LZMA-compressor

FPGA-based LZMA compressor for generic data compression. 基于FPGA的LZMA压缩器,用于通用数据压缩。
Verilog
68
star
24

TinyPNG-kmeans

效果好于 tinypng.com 的PNG图像压缩器,压缩率&质量可调,摆脱 tinypng.com 的文件数量限制。
Python
64
star
25

FPGA-SHA-Family

Verilog implementation of SHA1/SHA224/SHA256/SHA384/SHA512. 使用Verilog实现的SHA1/SHA224/SHA256/SHA384/SHA512计算器。
Verilog
59
star
26

HEVC-image-encoder-lite

A lightweight H.265/HEVC intra-frame encoder for grayscale image compression, with only 1600 lines of C. 一个轻量级H.265/HEVC帧内编码器,用于进行灰度图像压缩。代码量仅为1600行C语言,易于理解。
C
58
star
27

WangXuan95

48
star
28

TinyLZMA

A minimal LZMA data compressor & decompressor. Only hundreds of lines of C. 一个只有几百行C代码的LZMA通用数据压缩器和解压器。
C
38
star
29

JPEG-LS

A light-weight JPEG-LS (ITU-T T.87) image encoder. 仅400行C语言的JPEG-LS图像编码器。
C
36
star
30

NBLIC

NBLIC is a lossless grayscale image compression algorithm with high compression ratio. 一种高压缩率的灰度图像压缩格式。
C
29
star
31

FPGA-HDMI

FPGA-based HDMI display controller. 基于FPGA的HDMI显示控制器
Verilog
27
star
32

CSharp-SoftKeyboard

C# 软键盘输入框,包括9键和26键,可用于触屏
C#
20
star
33

FPGA-QOI

FPGA-based QOI image compressor and decompressor in Verilog language. 基于FPGA的QOI图像压缩器和解压器。
Verilog
19
star
34

flex_BRAM_FPGA

Verilog module for flexible instantiation of ROM/RAM of arbitrary depth and bit width. Automatically reduce BRAM usage through depth division, bit width division, and bit width folding.
SystemVerilog
6
star
35

Gray8bit-Image-Compression-Benchmark

A comparison of several state-of-the art gray 8-bit lossless image compression formats/methods.
C
6
star
36

QOI

A simple QOI image compressor/decompressor in only 240 lines of C language. 一个只有240行C代码的QOI图像压缩器和解压器实现。
C
3
star
37

wangxuan95.github.io

CSS
2
star