PCIe学习笔记系列:
- PCIe基础知识及Xilinx相关IP核介绍
概念了解:简单学习PCIe的数据链路与拓扑结构,另外看看有什么相关的IP核。 - 【PG054】7 Series Integrated Block for PCI Express IP核的学习
基础学习:关于Pcie IP核的数据手册,学习PCIe相关的IP核的配置参数及其对应的含义。 - Xilinx PCIe IP核示例工程代码分析与仿真
基础学习:关于PCIe IP核的仿真,学习PCIe的配置流程以及应用过程。 - Xilinx XDMA 例程代码分析与仿真结果
应用学习:关于Xilinx PCIe DMA IP核的仿真,学习 PCIe DMA 的配置过程以及具体的数据传输流程。 - XDMA linux平台调试过程记录
应用学习:关于XDMA的实际调试过程,可在此基础上定制自己的需求。
目录
1 IP核说明
结构:

主要的接口:
- 系统接口(SYS)。
- PCIe接口(PCI_EXP)。
- 配置接口(CFG)。
- 事务接口(AXI-Stream)。
- 物理层控制与状态接口(PL)。
该模块以数据包的形式与各模块进行通信。从发送到接收组件,携带信息(指的是用户的信息)的数据包在事务层以及数据链路层形成。在发送的过程中加了一些其他的必要的信息(各层处理数据包需要的信息)。在接收端,接收单元的每一层处理进入的包,剥离相关信息并将包转发给下一层。
1.1 遵循的标准
《PCI Express Base Specification, rev. 2.1 》
《PCI Express Card Electromechanical (CEM) v2.0》
《PCI Industrial Computer Manufacturers Group (PICMG) 3.4 specifications》
1.3 IP核的接口
2 设计例程
2.1 集成块Endpoint配置概览
PCI Express设备需要在上电后进行设置,然后系统中的设备才能开始与其他设备进行特定于应用程序的通信。通过PCI Express Link连接的至少两个设备必须初始化其配置空间并被枚举以进行通信。
Root Port通过给【像Endpoint或Switch这样的下游设备】发送【Configuration Read(CfgRd)和Write(CfgWr) TLP 并进行配置空间的设置】来实现【PCI Express枚举和配置】。当此过程完成时,才可以在PCI Express系统内发生更高级别的交互,如内存读取(MemRd TLPs)和写入(MemWr TLPs) 。
配置器示例设计 完成 枚举和配置单个连接的PCIe Endpoint配置空间 所需的配置事务,允许应用程序特定的交互发生。
Endpoint配置的示例的仿真设计包含两个部分:
- Root Port模型:生成、使用和检查PCI Express总线数据流的testbench。
- 可编程的输入输出(Programmed Input/Output ,PIO)示例设计:一个完整的PCI Express应用。PIO示例设计响应对其内存空间的读和写请求,可以在硬件测试中是可综合的。
仿真设计概览
在仿真设计中,事务从Root Port模型中发送到被配置为Endpoint的IP核中,示例设计的结构:

对应的文件结构:

2.2 Programmed Input/Output: Endpoint 示例设计
Programmed Input/Output (PIO) 事务一般由PCI Express系统host CPU来访问内存映射输入/输出(Memory Mapped Input/Output,MMIO)和配置映射PCI Express逻辑中的输入/输出(Configuration Mapped
Input/Output,CMIO)位置。PCI Express的Endpoint通过【完成数据事务】来 【接受内存和I/O写事务】 和 【响应内存和I/O读事务】 。
一般PIO是包含在IP核中的,但在7 Series FPGAs Integrated Block for PCI Express 、Endpoint Block Plus for PCI Express、Endpoint PIPE for PCI Express IP核中共享PIO设计端口模型,也就是pcie_app_7x中的PIO模块。可以在实际的板子中使用PIO设计来验证板的链路和功能。
2.2.1 系统概览
PIO设计是一个简单的应用程序,它连接【PCIe核心事务(AXI4-Stream)接口】与【Endpoint】,也可以作为构建用户设计的起点。特点包括:
- 使用Xilinx FPGA内部的block RAM 实现 四个特定事务的2 KB目标区域,提供8192个字节的总目标空间。
- 支持【单DWORD载荷】的到32/64位地址的内存空间或I/O空间的PCIe读写事务,并支持完成事务层包(TLPs)。
- 利用IP核的(rx_bar_hit[7:0]) m_axis_rx_tuser[9:2]信号来区分TLP目的基地地址寄存器。
- 提供针对单独实现32位、64位和128位优化的AXI4-Stream接口。
PCI Express系统架构组件如下图,包括一个Root Complex,一个PCIe switch器件,一个PCIe Endpoint。【PIO操作】将数据从 Root Complex(CPU寄存器)向下移动(downstream)到Endpoint,或者从端点向上移动(upstream)到 Root Complex((CPU寄存器)。无论哪种情况,移动数据的PCI Express协议请求都是由主机CPU发起的。

当CPU发出向【内存映射输入/输出(MMIO)地址】写寄存器 命令时,数据就下行移动。Root Complex通常生成一个Memory Write TLP,其中含MMIO单元的地址、字节使能和寄存器内容。当Endpoint接收到Memory Write TLP并更新相应的本地寄存器时,事务终止。
当CPU发出从一个MMIO地址读寄存器的命令时,数据就上行移动。Root Complex通常生成一个Memory Read TLP,其中包含MMIO单元的地址,以及字节使能。Endpoint 在收到 Memory Read TLP 后产生一个 Completion with Data TLP 。 Completion被发送到Root Complex,有效负载被加载到目标寄存器中,完成事务。
2.2.2 PIO硬件
PIO设计在FPGA block RAM中实现了一个8192字节的目标空间,在PCIe Endpoint 之后。这个32位目标空间可以通过single DWORD I/O Read,I/O Write, Memory Read 64, Memory Write 64, Memory Read 32, 以及 Memory Write 32 TLP 进行访问。
PIO设计生成一个有效负载为一个DWORD的Completion,用来响应有效的Memory Read 32 TLP, Memory Read 64 TLP, or I/O Read TLP 请求。此外,PIO设计为I/O Write TLP请求返回一个没有数据且状态成功的ComCpletion。
PIO设计通过更新载荷到FPGA block RAM空间的目标地址来处理一个【有一个DWORD载荷的 Memory 或 I/O Write TLP】。
2.2.3 支持基地址寄存器(Base Address Register,BAR)
PIO设计支持4个不连续的目标空间,每个空间由一个独立的Base Address Register(BAR)表示的2KB内存块组成。使用默认参数时,Vivado IDE生成一个配置为配合PIO设计使用的IP核,它包括:
- 一个64位可寻址内存空间BAR
- 一个32位可寻址内存空间BAR
可以改变PIO设计使用的默认参数,但是,在某些情况下,可能需要根据系统更改用户应用程序。
BAR表示的四个2KB地址空间与PIO设计中的四个2kb地址区域对应。每个2kB区域都使用一个2KB 双端口 block RAM 来实现。当IP核收到事务时,IP核解码出地址以及确定四个区域中哪个时目标区域。IP核将TLP传递到PIO设计并断言相应的bitm_axis_rx_tuser[9:2](rx_bar_hit[7:0])。这些位的定义如下:
| Block RAM | TLP事务类型 | 默认BAR | rx_bar_hit[7:0] |
|---|---|---|---|
| ep_mem0 | I/O TLP 事务 | 禁用 | 禁用 |
| ep_mem1 | 32-bit address Memory TLP事务 | 0 | 0000_0001b |
| ep_mem2 | 64-bit address Memory TLP事务 | 禁用 | 禁用 |
| ep_mem3 | 指定EROM(Expansion ROM)的32-bit address Memory TLP事务 | 扩展ROM | 0100_0000b |
2.2.3.1 改变默认的BAR设置
可以改变参数然后继续使用PIO设计来创建自定义的HDL源文件来匹配选择的BAR设置。然而,由于PIO设计参数比IP核参数限制更大,在更改默认参数时,需要考虑以下示例设计限制:
- 示例设计支持一个I/O空间BAR,一个32位内存空间(不是外部ROM空间),以及一个64位内存空间。如果超出了这些限制,则只有给定类型的第一个空间是有效的,这意味这对其他空间的访问不会导致completion。
- 每个空间都有2KB内存的大小限制。如果相应的BAR配置为更大的大小,超过2kb限制的访问将与2kb内存空间交叠。
- PIO设计支持一个I/O空间BAR,默认情况下是禁用的,但如果需要可以更改。
尽管PIO设计有局限性,但提供了Verilog或VHDL源代码,以便可以根据自己的具体需求定制示例设计。

本文深入探讨PCIe基础知识,重点关注Xilinx提供的PCIe IP核,包括7Series Integrated Block for PCI Express。内容涵盖PCIe数据链路与拓扑结构,IP核配置参数,以及如何通过示例设计进行仿真和应用。文中详细阐述了PCIe IP核的接口,配置流程,以及与Endpoint的交互,特别是Programmed Input/Output (PIO)事务的处理,包括读写操作和基地址寄存器(BAR)的管理。此外,还介绍了RootPort Model Test Bench的架构和测试用例,用于验证PCIe Endpoint配置和功能。
最低0.47元/天 解锁文章
1906





