分享

pcie基本结构、概念和原理介绍

 charlie_linux 2022-11-22 发布于广东

一、驱动代码介绍:

zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C
.
├── COPYING
├── include
│   └── libxdma_api.h
├── LICENSE
├── readme.txt
├── RELEASE
├── tests
│   ├── data
│   │   ├── datafile0_4K.bin
│   │   ├── datafile1_4K.bin
│   │   ├── datafile2_4K.bin
│   │   ├── datafile_256K.bin
│   │   ├── datafile_32M.bin
│   │   ├── datafile3_4K.bin
│   │   └── datafile_8K.bin
│   ├── dma_memory_mapped_test.sh
│   ├── dma_streaming_test.sh
│   ├── load_driver.sh
│   ├── perform_hwcount.sh
│   └── run_test.sh
├── tools
│   ├── \001
│   ├── dma_from_device.c
│   ├── dma_to_device.c
│   ├── dma_utils.c
│   ├── Makefile
│   ├── performance.c
│   ├── perform_hwcount.sh
│   └── reg_rw.c
└── xdma
    ├── cdev_bypass.c
    ├── cdev_ctrl.c
    ├── cdev_ctrl.h
    ├── cdev_events.c
    ├── cdev_sgdma.c
    ├── cdev_sgdma.h
    ├── cdev_xvc.c
    ├── cdev_xvc.h
    ├── libxdma.c
    ├── libxdma.h
    ├── Makefile
    ├── version.h
    ├── xdma_cdev.c
    ├── xdma_cdev.h
    ├── xdma_mod.c
    ├── xdma_mod.h
    ├── xdma_thread.c
    └── xdma_thread.h

5 directories, 43 files
zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$

二、查看驱动源码里面的介绍:

<project_root>/
|__ build/                - Generated directory containing build output binaries.
|__ exe/                  - Contains sample client application source code.
|  |__ user_events/       - Sample code demonstrating access to user event interrupts. 
|  |__ xdma_info/         - Utility application which prints out the XDMA core ip 
|  |                        configuration.
|  |__ xdma_rw/           - Utility for reading/writing to/from xdma device nodes such 
|  |                        as control, user, bypass, h2c_0, c2h_0 etc. 
|  |__ xdma_test/         - Basic test application which performs H2C/C2H transfers on 
|                           all present channels. 
|__ inc/                  - Contains public API header file for XDMA driver.
|__ sys/                  - Contains the XDMA driver source code.
|__ README.md             - This file.
|__ XDMA.sln              - Visual Studio Solution.

三、主要节点

比如使用user来读取我工程的用户寄存器。即AXI_LITE控制的bram上的数据。

例如:

xdma_rw.exe user(操作模式) read(读or写) 0x00(操作地址) -l(读出的形式文件或者字节)4(读出的字节数)

四、XDMA IP介绍:

DMA Interface,在XDMA IP核中,DMA接口设置部分有两个选项,一个就是 AXI Memory Mapped,而另外一个就是AXI Stream。

提到上述两个选项,看到的时候也是很莫名,这两个选项究竟有何区别,让我们通过AXI总线协议来说明他们的相同与不同。

  • AXI4.0总线协议,主要是AXI4.0(AXI4.0-full),AXI4.0-lite,AXI4.0-stream三种协议。

  • AXI4.0-lite是AXI4.0-full的简化版。用于简单、低吞吐量的内存映射通信。

    由于没有突发传输相关的信号线,所以不能进行突发传输,因此每次传输只能传输一个数据(数据的宽度取决于带宽)。比如对于32位宽度的总线,那么一次就能传输4个字节。

  • AXI4.0-full用于高性能内存映射需求。

    包含突发控制信号,所以可以进行突发传输,在指定一次地址后,可以一次传输多达256个数据(数据的宽度取决于带宽)。

  • AXI_stream用于高速流数据。由于没有地址总线,所以用于数据流传送,允许无限制的数据突发传输规模。

应用场景

AXI4.0-lite主要用于内核和外设寄存器之间的通信。AXI4.0-lite就特别合适。

AXI4.0-full主要用于往DDR或者OCM中写入大量数据时使用。

AXI_stream主要用于往FIFO等没有地址的数据缓冲区传送大量数据时使用

根据上述对AXI总线协议的介绍,需要根据使用环境来选择协议类型,通过DDR进行大量数据读写时,会使用AXI-full总线模式,也就是在IP核设置中的AXI Memory Mapped选项。AXI Stream协议是不包含地址线的,所以在读写FIFO等没有地址的数据缓存区时,可以使用AXI Stream协议,也就是AXI Stream选项。上位机通常会通过PCIE接口向下位机发送各种控制或者配置指令,此时就需要使用添加AXI-Lite选项,可以勾选下图中所示选项进行添加,AXI-lite可以说是简化版的AXI-full。在使用WDK进行读写时,有BAR0和BAR1两个空间,一个就是勾选的PCIe to AXI Lite Master Interface接口,用于设置寄存器。另一个就是默认勾选的PCIe to DMA Interface接口,用于数据的读写。

PCIe to AXI Lite Master Interface

在BARs页面中,会有PCIe to AXI Lite Master Interface一栏,众所周知主机访问地址与下位机实际控制地址是不一样的,所以PCIe to AXI Lite Master Interface这个接口就是将上位机地址与下位机地址进行一个映射,将两部分联系起来,比如在这一栏中设置0x80000000,那么实际的意义就是bar的0地址对应的是外设的0x80000000地址,当上位机对0地址进行操作的时候实际是对下位机的0x80000000地址进行操作。

握手过程

每个通道进行数据的交互时,需要进行双向握手操作即VALID和READY信号均为高时,写入的数据才会有效。在握手过程中可能会出现,1.VALID先有效,然后READY再有效,在两者均有效的时候写入数据有效。2.READY先有效,然后VALID再有效,在两者均有效的时候写入数据有效。3.恰好READY有效,VALID也有效,在两者均有效的时候写入数据有效。

就好像有两个人做工作,彼此的工作是相关的,A对B说,我已经弄完了,等你弄完告诉我一声,我们联合测试。基本就是这个道理。

可以通过下图来看到三种握手协议。


AXI4内存映射接口

首先,测试用例启动H2C引擎,H2C引擎从Host内存中读取数据然后写到用户端的Block RAM。然后,测试用例启动C2H引擎,从Block RAM 中读取数据然后写到Host 内存中。

五、FPGA仿真的步骤:

  • 测试用例为H2C引擎设置一个描述符。

  • H2C描述符给出数据长度64字节、源地址(Host)和目的地址(Card)。

  • 将数据(增量数据)写入源地址空间。

  • 测试用例也为C2H引擎设置了一个描述符。

  • C2H描述符提供数据长度64字节、源地址(Card)和目的地址(Host)。

  • PIO写入H2C描述符启动寄存器。

  • PIO写入H2C控制寄存器以启动H2C传输。

  • DMA传输将数据从host源地址传输到block RAM目的地址。

  • 然后测试用例启动C2H传输。

  • PIO写入C2H描述符启动寄存器。

  • PIO写入C2H控制寄存器以启动C2H传输。

  • DMA传输将数据从block RAM源地址传输到host目的地址。

  • 测试用例比较数据的正确性。

  • 测试用例检查 H2C和C2H描述符完成计数(值为1)。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多