DMA硬件实现——寄存器配置
队伍编号:CICC2136
队伍名称:芯如止水
DMA,Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只需要向DMA控制器下达指令(配置DMA寄存器),传输数据由DMA来完成,数据传送完再把信息反馈给CPU,这样能够减少CPU的资源占有率。
这里在蜂鸟核中添加了DMA模块,使得通过DMA将数据直接从SRAM1中搬移至SRAM2。硬件实现主要分成三个部分:DMA寄存器的配置、读写模块和fifo。
这里主要分享对DMA寄存器配置的分析讨论。
寄存器配置
在开始传输前,DMA控制器接收CPU对于源地址,目的地址,搬运数据长度的配置信息,当这些寄存器信息更新后,DMA开始自行进行数据搬运。搬运结束后,将DMA中断拉高。
这里主要对四个寄存器进行维护:
源地址寄存器,指示搬运的起始地址,可读可写;
目的地址寄存器,指示搬运的目的地址,可读可写;
数据长度寄存器,指示搬运的数据长度,可读可写;
状态寄存器,只读,指示配置完成,搬运完成等。
当CPU对DMA进行配置时会拉高valid信号,此时如果DMA发出ready的高电平信号,即此时握手完成,才可以进行配置。对于DMA而言,当ready的判定条件是CPU是否发出valid信号以及dma是否空闲。
源地址寄存器、目的地址寄存器和长度寄存器都为32位,它们的配置条件类似:握手成功、相应寄存器地址相符合、且之前未对相应寄存器进行过配置。
而状态寄存器是DMA根据其他三个寄存器的配置情况由DMA自己进行配置。源地址寄存器、目的地址寄存器和长度寄存器都为32位,状态寄存器为3位,每一位都代表其他三个寄存器的状态。
还未配置寄存器时,状态寄存器state_reg的初始状态为3个1,如果配置源地址寄存器,那么状态寄存器state_reg[0]为0,如果配置目的地址寄存器,那么将状态寄存器state_reg[1]为0,如果配置数据长度寄存器,那么将状态寄存器state_reg[2]为0。当状态寄存器的三位均为0时表示配置完成。
当状态寄存器为0时,即开始进行数据搬移。
如上图为这一部分实现的时序图。