在所从事的项目中需要用到PCIE和DMA,经过再三研究,反复查看相关资料,终于弄懂了**alon_MM DMA Interface for PCIe的使用方法。
PCIE在fpga和上位机之间起着中间桥梁的作用,具有双向传输数据的功能。以下是**alon_MM DMA Interface for PCIe结构图,后面再分别详细介绍。
该ip可以使用Internal Descriptor Controller和External Descriptor Controller,下文所做介绍以Internal Descriptor Controller为基础。
接口介绍:
Read DMA **alon-MM Master Port:主要完成两方面的工作:1、该模块发送读请求从host memory中取descriptor table,并将descriptor table通过**alon-MM Master 写入Descriptor Controller FIFO
2、从source address读取诗句之后,将数据写入**alon-MM 地址映射的外部DDR中。
Write DMA **alon-MM Master Port:该模块向**alon-MM 地址映射的外部DDR发送读请求,将读取的数据写入系统内存中。
RX Master Module:将从pcie接收到的读和写信号发送给**alon-MM ,request给连接在internnect的component.当Descriptor Controller在内部建立时,BAR0在内部使用,不能用作外部使用。上位机通过RXM给Descriptor Controller的寄存器进行编程,包括descriptor table的地址和大小。
descriptor controller 指示Read Data Mover 取descriptor table,并存在fifo中,controller取table并指导DMA在**alon-MM 和 PCIe之间传输数据。
TX Sl**e Module:将**alon-MM Master的读和写请求发送给PCI Express TLPs;当DMA完成时,descriptor controller利用此接口向上位机中的descriptor data写DMA status,并发送MSIinterrupts.
DMA Descriptor Controller Registers
上位机通过bar0来配置DMA Descriptor Controller Registers,read controller的地址偏置为0x0000,write controller的地址偏置为0x1000
DMA Descriptor Controller Registers for Read DMAs
RD_RC_LOW_SRC_ADDR = 0x0000 (The base address for the read descriptor table in the Root Port
RD_RC_HIGH_SRC_ADDR = 0x0004
以上寄存器的值表示将descriptor table和status存在系统内存中的地址
RD_CTLR_LOW_DEST_ADDR 0x0008
d. RD_CTLR_HIGH_DEST_ADDR = 0x000C
以上寄存器的值表示将descriptor table和status存在fpga 中onchip memory中的地址
RD_DMA_LAST_PTR = 0x0010
以上寄存器的值表示将最后一个descriptor table的ID,当配置该寄存器时,用来触发DMA工作。
WR_TABLE_SIZE=0x0014
该寄存器表示一共有多少个descriptor table
WR_CONTROL =0x0018
该寄存器[0]表示done ,当dma完成时,向descriptor table中的status写done bit。
DMA Descriptor Controller Registers for Write DMAs
同上
Read DMA and Write DMA Descriptor Table Format
0x00,0x04:源地址
0x08,0x0c:目的地址
0x10:[24:18],对应descriptor的ID号,[17:0],DMA发送的数据量。
完成一次DMA操作的步骤
1、计算需要分配的内存大小:描述一个descriptor 的status需要的内存为32bit,即4bytes,描述一个descriptor table需要的内存32bytes。一共最多有128个descriptor,存放status需要的内存为512bytes,存放descriptor table 需要32bytes*128 (针对 read DMA,write DMA同样),分配内存起始地址base_address。
2、给存放数据分配内存,
3、descriptor table存在descriptor status之后,存放第一个descriptor table的起始地址为base_address+0x200
4、创建descriptor table,按照Descriptor Table Format的格式
5、通过编程配置DMA Descriptor Controller register,配置status and descriptor table地址的寄存器,0x0,0x4
6、配置存放status and descriptor table的on_chip fifo address,对应的是**alon-MM address,internal on-chip FIFO是Descriptor Controller的一部分,就是RX Master看到的大小。
7、编程配置RD_DMA_LAST_PTR register,用来触发DMA。
如果只需要得到所有的descriptor 都完成后得到done的信号,只需要写最后一个descriptor id给0x10;
如果每一个descriptor完成后都返回done,需要对每一个descriptor都配置0x10。
8、软件可以监测到done信号。