PCIe - XAPP859 - 学习笔记(1) - 待更新

更新时间:2023-12-08 07:31:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

TX Engine 发送器负责发送并传输posted,non_posted和完成包。本参考设计可以产生并传输MWR,MRd和完成包,用来满足存储器读和DMA写请求。

消息和错误报告包,如不在支持范围内的请求,完成包超时和中断请求。都由硬核通过一定的信号机制产生。因此不需要用户逻辑去产生与这些类型的TLPs相对应的header;用户逻辑只需要监视这些情况是否发生了,一旦他们其中之一发生了,便通知硬核。完成包超时的逻辑在本参考设计中将不会涉及到。另外,I/O包在本参考设计中也不予支持。

数据包依靠来自 DMA Control/Status Register File的请求而产生,它们通过 TRN的TX接口被传输到硬核上。

Posted Packet Generator

Posted包生成器接受来自DMA Control/Status Register File的写DMA请求,并产生可以用来完成本次写DMA操作的header。这些包头被放置在一个小的FIFO中,以便被TRN状态机读取。该生成器由两个模块组成:

? ?

Posted包分割器 Posted合成器 Posted包分割器 分割器从DMA Control/Status Register File 接受写DMA请求,并根据PCIe总线协议把这些请求分割成多个数据包。实际上,该分割器按照以下两个原则对写DMA请求进行分解: ? 包的有效载荷长度不能超过设备控制寄存器中的Max_Payload_Size。 ? 地址/数据的组合不能超过4KB地址界限。 分割器利用简单的握手协议把长度(Length[9:0])和地址(dmawad_reg[63:0])传给posted Pactet Builder。源和目的地址必须分布在128字节的地址界限内。

Receive TRN State Machine 事务层数据接收状态机模块执行以下功能:

? 接收来自PCIe事务层的数据,并在需要的时候把事务层接口throttle ? 传输64位的数据以及字节有效位

? 传输 data_valid位,用来对数据和字节使能 ? 解码,寄存和验证包头信息

在实现中,64bit宽度的数据直接连接到 memory fifo 上,并有data_valid信号用来标示数据的可写入性。这样做的原因是因为所有的完成包数据都要被存储到DDR中。

在数据含有多重目的地址的情况下,用来驱动数据的额外的解码功能是必需的。例如,在一个 SG-DMA或者链式DMA设计中,完成包数据需要被传送到多个地址中。这时候,来自PCIe的 bar_hit信号利于数据的路由和写入。

//源代码注释 // Purpose: Receive TRN Data FSM.

1、 This module interfaces to the Block Plus RX TRN. It presents the 64-bit data from completer and and forwards that data with a data_valid signal.

这个模块与RX 事务层接口相连接。它接收来自完成包的64bit宽的数据,并把它们向后传输,data_valid信号用来标示信号的有效性。

2、 This block also decodes packet header infomation and forwards it to the rx_trn_monitor block.

这个模块还对包头进行解码并把它们传送给模块 rx_trn_monitor。

Receive TRN Monitor 事务接收监测模块执行以下功能:

? 读取the read request RAM内容并检测何时读事务完全完成

? 利用the read request RAM中目的地址信息和完成包头中的长度信息计算DDR2的目的

地址。

? 计算何时读DMA被完成并通知DMA Control/Status Register File

? 为每一个完成接收到的完成包向receive memeory Data finit State Machine提供地

址和传输大小。 //代码注释

/ Purpose: Receive TRN Monitor module. This module interfaces to the DMA

// Control/Status Register File and the Read Request Fifo to determine when a // DMA transfer has completed fully. This module could also monitor the TRN // Interface to determine any errors. // Reference: XAPP859 // Revision History:

// Rev 1.0 - First created, Kraig Lund, Apr. 1 2008.

// Rev 1.1 - Changed the rd_dma_done_early comparison number to 0x0B0 (was // 0x070) for improved data throughput utilization, Kraig Lund, June 10th, //注释解释

该模块连接DMA Control/Status Register File和the read Request Fifo并决定一个DMA传输结束;该模块也可以检测TRN接口,判断错误。

Receive Memory Data FSM receive memory data FSM执行以下两个任务:

? Arbitrates for control of the DMA-to-DDR2 interface block

? Reads data and transfers information from the data and Xfer TRN memory FIFOs and forwards it to the DMA-to-DDR2 interface block

Data TRN Memory FIFO and Xfer TRN Memory FIFO Data TRN memory FIFO 和 Xfer TRN Memory FIFO一起工作,data memory FIFO 有两项功能,第一,他把接收到的完成包数据暂存起来,第二,他把64位的数据转换为128位; Xfer TRN memory 保存着起始地址和传输大小信息。

每一个Xfer TRN memory的描述行都要有响应的数据与之对应。

DMA Control and Status Wrapper DMA控制和状态文件夹是与PC处理器通信和对DMA操作进行控制的主要模块。 该文件夹有以下两个逻辑块组成: ? DMA控制/状态寄存器组 ? 内部控制逻辑

本参考设计中的逻辑单元支持在一次DMA传输中最多传输4KB数据。它包括posted包分割器,non_posted包分割器和DMA-DDR2接口模块。想要通过该硬件实现传输大小超过4KB的数据量,必须把较大的DMA数据块进行分割,分割成DMA传输可以支持的数据大小。DMA控制状态寄存器组和内部控制模块共同合作来完成传输大小超过4KB的数据块。

DMA控制/状态寄存器组提供以下功能:

? 利用一个基址寄存器(BAR0),以一个简单的寄存器文件的形式,提供了一个内存映射到主系统的接口。

? 接收读/写DMA传输请求最大数据量为1MB。

? 把DMA传输大于4KB的数据量分解成小的DMA传输块,并把这些小的传输块送到内部控制块中。

内部控制块提供以下功能:

? 接收来自DMA控制/状态寄存器组模块的最大数据量为4KB 的DMA读写请求。 ? 提供与RX和TX的控制接口 着两个模块的细节描述如下:

DMA Control/Status Register File DMA控制和状态寄存器组是被映射并与用户应用逻辑相连的存储单元。 主处理器通过读写总线来访问这些存储器组。端点模块的基址寄存器有利于访问DMA控制和状态寄存器组。

DMA操作被定义在DMA控制和状态寄存器组里。主处理器通过初始化寄存器组来发起一次DMA事务。DMA完成通过状态寄存器通知主处理器。

所有寄存器都是32bit可读写的,除非有特殊说明。 ? DMAWAS 0x00 DMA写操作时,DDR2的源地址; ? DMAWAD_L 0x04 DMA写操作时,主存储器的低32bit地址; ? DMAWAD_U 0x08 DMA写操作时,主存储器的高32bit地址; ? DMARAS_L 0x0C DMA读操作时,主存储器的低32bit地址;

? ? ? ? ? ? ? ? ? ?

DMARAS_U DMARAD DMAWXS DMARXS 保留位 保留位 DMACST★ 保留位 DMAWRP DMARDP 0x10 DMA读操作时,主存储器的高32bit地址; 0x14 DMA读操作时,DDR2的源地址; 0X18 DMA写操作时,传输大小; 0x1C DMA读操作时,传输大小; 0x20 保留; 0x24 保留;

0x28 DMA控制和状态寄存器,控制位为只写寄存器,状态位为只读。 0x2C 保留;

0x30 DMA写操作时,写计数器; 0x34 DMA读操作时,读计数器;

PC主处理器做以下操作用来执行DMA写操作: ? 验证DMA写操作开始位DMACST[0]为0;

? 根据用户在ML555GUI上填入的DMA传输请求选项,向寄存器DMAWAS,DMAWAD_L,DMAWAD_U和DMAWXS写入合适的值。 ? 向DMACST[0]位写入1,用来启动DMA写传输。

? 监测写DMA完成位DMACST[1],确定当前写DMA过程何时完成。 ? 根据用户要求的传输大小和寄存器组中只读计数器的值,计算DMA写过程的效率。并把结果输出到GUI窗口上。

PC主处理器做以下操作用来执行DMA读操作: ? 验证DMA读操作开始位DMACST[2]为0;

? 根据用户在ML555GUI上填入的DMA传输请求选项,向寄存器DMARAS_L,DMARAS_U,DMARAD和DMARXS写入合适的值。 ? 向DMACST[2]位写入1,用来启动DMA读传输。

? 监测读DMA完成位DMACST[3],确定当前读DMA过程何时完成。 ? 根据用户要求的传输大小和寄存器组中只读计数器的值,计算DMA读过程的效率。并把结果输出到GUI窗口上。

全双工的DMA传输可以通过同时向DMACST[0]和DMACST[2]写入1来实现。为了保持传输和接收链路一直为满,硬件需要一直监测链路状态。对于全双工传输4KB或者以下的大小,典型的做法是,FPGA端硬件要执行8个non_posted读接着执行8个posted写。当数据量大于4KB时,全双工的传输的方式就变得不固定。

PC主处理器监测寄存器组的状态,显示读写完成的方式,这也都会在本设计中影响传输层的吞吐量。在开始一次DMA操作之后,PC处理器会等到一段预先设定好的时间,然后才去检测端点设备寄存器组,从未确定DMA传输是否完成。这段等待的时间对于完成这次DMA传输是足够长的。DMA传输完成后的检测对本设计中事务层传输的吞吐量没有影响。

状态机自动的进行源地址、目的地址和DMA传输大小的参数的累加,并把这些参数传输到内部控制模块上去。 //源代码注释

// Device: Virtex-5 LXT

// Purpose: This module is the DMA Control and Status register file. // It connects to the Host system behind a 128B PCI BAR. // It also drives the Internal DMA Control block by breaking

// large transfer requests into 4KB and smaller requests. Note, // if the user did not require transfers larger than 4KB, // this block could be removed from the design and

// the Internal DMA Control block could be used (with minor // modification to the design in place.

该模块目的:该模块是DMA控制和状态寄存器文件 ? 它通过128B大小的BAR0与主处理器建立连接。 ? 它通过把大的数据请求分割成4KB和小的请求。 ? 注意,如果用户不要求大于4KB的传输数据,这个模块可以从本设计中移除,而且内部DMA控制块可以使用(适当的修改在某些地方)。

Read Request Wrapper The read request wrapper作为TX Engine 和RX Engine的通信端口,TX Engine把待处理的non_posted读请求发送给RX Engine。这些信息被存储在32*32的双端口RAM中,这个RAM是由ISE的软件Core Generator产生的。每一条信息包括如下信息: ? [21:0] = DDR2目的地址。 ? [31:22]=读请求要求的DW数。

双端口的RAM利用从发出的non_posted的读请求和输入的完成包tag进行定位。 TX Engine把每一个non_posted读请求的初始信息写进去,RX Engine利用这个信息把完成包放到相应的DDR内存中去。另外RX Engine在接收到每一个完成包之后,对双端口RAM的中DDR目的地址进行更新。

除了双端口RAM,read request wrapper还包含单端32*1的RAM,每一位对应双端RAM中的一条信息。1代表该条信息有效且是待处理的请求,该位由TX Engine在写read request wrapper时设置,在最后一个完成包接收到之后,由RX Engine复位。

本文来源:https://www.bwwdw.com/article/y43t.html

Top