TXEngine发送器负责发送并传输posted,non_posted和完成包。本参考设计可以产生并传输MWR,MRd和完成包,用来满足存储器读和DMA写请求。消息和错误报告包,如不在支持范围内的请求,完成包超时和中断请求。都由硬核通过一定的信号机制产生。因此不需要用户逻辑去产生与这些类型的TLPs相对应的header;用户逻辑只需要监视这些情况是否发生了,一旦他们其中之一发生了,便通知硬核。完成包超时的逻辑在本参考设计中将不会涉及到。另外,I/O包在本参考设计中也不予支持。数据包依靠来自DMAControl/StatusRegisterFile的请求而产生,它们通过TRN的TX接口被传输到硬核上。PostedPacketGeneratorPosted包生成器接受来自DMAControl/StatusRegisterFile的写DMA请求,并产生可以用来完成本次写DMA操作的header。这些包头被放置在一个小的FIFO中,以便被TRN状态机读取。该生成器由两个模块组成:Posted包分割器Posted合成器Posted包分割器分割器从DMAControl/StatusRegisterFile接受写DMA请求,并根据PCIe总线协议把这些请求分割成多个数据包。实际上,该分割器按照以下两个原则对写DMA请求进行分解:包的有效载荷长度不能超过设备控制寄存器中的Max_Payload_Size。地址/数据的组合不能超过4KB地址界限。分割器利用简单的握手协议把长度(Length[9:0])和地址(dmawad_reg[63:0])传给postedPactetBuilder。源和目的地址必须分布在128字节的地址界限内。ReceiveTRNStateMachine事务层数据接收状态机模块执行以下功能:接收来自PCIe事务层的数据,并在需要的时候把事务层接口throttle传输64位的数据以及字节有效位传输data_valid位,用来对数据和字节使能解码,寄存和验证包头信息在实现中,64bit宽度的数据直接连接到memoryfifo上,并有data_valid信号用来标示数据的可写入性。这样做的原因是因为所有的完成包数据都要被存储到DDR中。在数据含有多重目的地址的情况下,用来驱动数据的额外的解码功能是必需的。例如,在一个SG-DMA或者链式DMA设计中,完成包数据需要被传送到多个地址中。这时候,来自PCIe的bar_hit信号利于数据的路由和写入。//源代码注释//Purpose:ReceiveTRNDataFSM.1、ThismoduleinterfacestotheBlockPlusRXTRN.Itpresentsthe64-bitdatafromcompleterandandforwardsthatdatawithadata_validsignal.这个模块与RX事务层接口相连接。它接收来自完成包的64bit宽的数据,并把它们向后传输,data_valid信号用来标示信号的有效性。2、Thisblockalsodecodespacketheaderinfomationandforwardsittotherx_trn_monitorblock.这个模块还对包头进行解码并把它们传送给模块rx_trn_monitor。ReceiveTRNMonitor事务接收监测模块执行以下功能:读取thereadrequestRAM内容并检测何时读事务完全完成利用thereadrequestRAM中目的地址信息和完成包头中的长度信息计算DDR2的目的地址。计算何时读DMA被完成并通知DMAControl/StatusRegisterFile为每一个完成接收到的完成包向receivememeoryDatafinitStateMachine提供地址和传输大小。//代码注释/Purpose:ReceiveTRNMonitormodule.ThismoduleinterfacestotheDMA//Control/StatusRegisterFileandtheReadRequestFifotodeterminewhena//DMAtransferhascompletedfully.ThismodulecouldalsomonitortheTRN//Interfacetodetermineanyerrors.//Reference:XAPP859//RevisionHistory://Rev1.0-Firstcreated,KraigLund,Apr.12008.//Rev1.1-Changedtherd_dma_done_earlycomparisonnumberto0x0B0(was//0x070)forimproveddatathroughpututilization,KraigLund,June10th,//注释解释该模块连接DMAControl/StatusRegisterFile和thereadRequestFifo并决定一个DMA传输结束;该模块也可以检测TRN接口,判断错误。ReceiveMemoryDataFSMreceivememorydataFSM执行以下两个任务:•ArbitratesforcontroloftheDMA-to-DDR2interfaceblock•ReadsdataandtransfersinformationfromthedataandXferTRNmemoryFIFOsandforwardsittotheDMA-to-DDR2interfaceblockDataTRNMemoryFIFOandXferTRNMemoryFIFODataTRNmemoryFIFO和XferTRNMemoryFIFO一起工作,datamemoryFIFO有两项功能,第一,他把接收到的完成包数据暂存起来,第二,他把64位的数据转换为128位;XferTRNmemory保存着起始地址和传输大小信息。每一个XferTRNmemory的描述行都要有响应的数据与之对应。DMAControlandStatusWrapperDMA控制和状态文件夹是与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的控制接口着两个模块的细节描述如下:DMAControl/StatusRegisterFileDMA控制和状态寄存器组是被映射并与用户应用逻辑相连的存储单元。主处理器通过读写总线来访问这些存储器组。端点模块的基址寄存器有利于访问DMA控制和状态寄存器组。DMA操作被定义在DMA控制和状态寄存器组里。主处理器通过初始化寄存器组来发起一次DMA事务。DMA完成通过状态寄存器通知主处理器。所有寄存器都是32bit可读写的,除非有特殊说明。DMAWAS0x00DMA写操作时,DDR2的源地址;DMAWAD_L0x04DMA写操作时,主存储器的低32bit地址;DMAWAD_U0x08DMA写操作时,主存储器的高32bit地址;DMARAS_L0x0CDMA读操作时,主存储器的低32bit地址;DMARAS_U0x10DMA读操作时,主存储器的高32bit地址;DMARAD0x14DMA读操作时,DDR2的源地址;DMAWXS0X18DMA写操作时,传输大小;DMARXS0x1CDMA读操作时,传输大小;保留位0x20保留;保留位0x24保留;DMACST★0x28DMA控制和状态寄存器,控制位为只写寄存器,状态位为只读。保留位0x2C保留;DMAWRP0x30DMA写操作时,写计数器;DMARDP0x34DMA读操作时,读计数器;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-5LXT//Purpose:ThismoduleistheDMAControlandStatusregisterfile.//ItconnectstotheHostsystembehinda128BPCIBAR.//ItalsodrivestheInternalDMAControlblockbybreaking//largetransferrequestsinto4KBandsmallerrequests.Note,//iftheuserdidnotrequiretransferslargerthan4KB,//thisblockcouldberemovedfromthedesignand//theInternalDMAControlblockcouldbeused(withminor//modificationtothedesigninplace.该模块目的:该模块是DMA控制和状态寄存器文件它通过128B大小的BAR0与主处理器建立连接。它通过把大的数据请求分割成4KB和小的请求。注意,如果用户不要求大于4KB的传输数据,这个模块可以从本设计中移除,而且内部DMA控制块可以使用(适当的修改在某些地方)。ReadRequestWrapperThereadrequestwrapper作为TXEngine