PIO 例程设计概述
PIO example设计在终端模式的IP核生成时已经包括在IP核中了。该设计属于简单的典型应用,与终端模式的PCIe IP核的事务层接口(AXI4-Stream接口)进行通讯,用户可以通过使用已经成熟的设计方便构建系统,进而验证通讯链路和功能的正确性。该设计功能如下:
- 使用Xilinx FPGA的块RAM(block RAM)建立的4个事务专用的2KB的目标区域。(共计8192bytes)。
- 通过完成型TLP包来支持单个DW数据负载的读写事务(32/64bit地址的存储空间和I/O空间)。
- 利用IP核(rx_bar_hit[7:0])m_axis_rx_tuser[9:2]信号来区分TLP的目标BAR(基地址寄存器)。
- 提供对32-bit,64-bit和128-bit AXI4-Stream接口的实现的优化。
下图为PCIe系统架构的组成,包括一个Root Complex,一个PCIe交换机设备和一个终端模式的PCIe。
PIO操作包括:从Root Complex中读取数据流到终端,以及从终端传递数据流到Root Complex。
不管哪种操作,都是首先从主机CPU发起的请求。当CPU请求写PCIe终端板卡的存储寄存器时,Root Complex通常会产生一个写存储的TLP包,其中有MMIO(存储映射输入输出)本地地址和将写入寄存器的数据。该TLP包发送到终端PCIe,终端PCIe接收TLP包,更新寄存器数据。
当CPU请求读PCIe终端板卡的寄存器时,Root Complex通常会产生一个读存储的请求,其中有MMIO的本地地址。终端在接收该TLP包后,读取寄存器数据,并产生一个带数据负载的Cpl响应包,并传递给Root Complex。
2.4.2 PIO 硬件设计的配置
PIO设计通过在一种终端PCIe后的一个8192bytes的FPGA块RAM的目标空间来实现。该32-bit的目标空间支持单DW的I/O读写,64bit或32bit的存储读写TLP来访问。PIO设计产生一个带1个DW的数据负载的响应TLP包,来响应读存储和读I/O的请求。对于写I/O的请求,PIO产生一个不带数据负载的响应TLP包。PIO设计产生一个带1-DW数据负载的响应TLP包,来响应读存储的请求,同时将对应地址的FPGA的块RAM空间对应的数据进行更新为收到的TLP的数据负载中的数据。
PIO设计支持4个离散的目标空间。每个空间由一个单独的基地址寄存器(BAR)表示的2KB的块RAM实现。
默认的配置产生的PIO设计包括:
- 一个64-bit可寻址的存储空间BAR
- 一个32-bit可寻址的存储空间BAR。
当IP核接收到了事务包,IP核对地址进行解码,然后决定4个区域的哪个为请求访问的目标。IP核将TLP包传递给PIO设计,并根据请求访问的BAR置位(rx_bar_hit[7:0])m_axis_rx_tuser[9:2]信号。
双端口块RAM,对应的TLP包的BAR以及(rx_bar_hit[7:0])m_axis_rx_tuser[9:2]信号如下图所示。