RISC-V MCU中文社区

【分享】 蜂鸟内核中DMA的硬件实现——寄存器配置

发表于 开源蜂鸟E203 2023-05-18 19:23:05
0
1564
1

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时,即开始进行数据搬移。

如上图为这一部分实现的时序图。

喜欢1
用户评论
zzzjy

zzzjy 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板