发明内容
本发明要解决的技术问题是提供一种控制数据传输的方法及DMA控制器,以提高不同数据宽度之间的传输效率。
为了解决上述技术问题,本发明提供了一种控制数据传输的方法,应用于存储器直接访问控制器,包括:
接收CPU的配置信息,对所述配置信息进行解析,所述配置信息包括传输宽度转换参数;
从源外设读取数据,根据所述传输宽度转换参数将读取到的数据转换成相应的数据宽度后写入目的外设。
进一步地,上述方法还具有下面特点:
所述从源外设读取数据是通过所述源外设与所述存储器直接访问控制器之间的接口实现的;
所述将数据写入目的外设是通过所述目的外设与所述存储器直接访问控制器之间的接口实现的。
进一步地,上述方法还具有下面特点:
所述接收的配置信息还包括:源起始地址和目的起始地址;
所述传输宽度转换参数包括源外设数据宽度和目的外设所需的数据宽度;
所述从源外设读取数据,根据所述传输宽度转换参数将读取到的数据转换成相应的数据宽度后写入所述目的外设,包括:根据所述传输宽度转换参数,按照所述源外设的接口时序从所述源起始地址开始读取源外设数据宽度的数据,将读取到的数据转换成所述目的外设所需的数据宽度后,按照所述目的外设的接口时序,从所述目的起始地址开始写入所述目的外设。
进一步地,上述方法还具有下面特点:
所述源外设支持的数据宽度包括以下的任一种:8比特、16比特和32比特;
所述目的外设支持的数据宽度包括以下的任一种:8比特、16比特和32比特。
进一步地,上述方法还具有下面特点:
所述传输宽度转换参数为0时,表示数据宽度从8bits转换为8bits;
所述传输宽度转换参数为5时,表示数据宽度从16bits转换为16bits;
所述传输宽度转换参数为a时,表示数据宽度从32bits转换为32bits;
所述传输宽度转换参数为1时,表示数据宽度从16bits转换为8bits;
所述传输宽度转换参数为2时,表示数据宽度从32bits转换为8bits;
所述传输宽度转换参数为6时,表示数据宽度从32bits转换为16bits;
所述传输宽度转换参数为4时,表示数据宽度从8bits转换为16bits;
所述传输宽度转换参数为8时,表示数据宽度从8bits转换为32bits;
所述传输宽度转换参数为9时,表示数据宽度从16bits转换为32bits。
为了解决上述问题,本发明还提供了一种存储器直接访问控制器,其中,所述存储器直接访问控制器具有数据接口直接与源外设和目的外设连接,包括:
配置模块,用于接收CPU的配置信息,对所述配置信息进行解析,所述配置信息包括传输宽度转换参数;
控制模块,用于从源外设读取数据,根据所述传输宽度转换参数将读取到的数据转换成相应的数据宽度后写入目的外设。
进一步地,上述存储器直接访问控制器还具有下面特点:
所述控制模块,从源外设读取数据是通过所述源外设与所述存储器直接访问控制器之间的接口实现的;将数据写入目的外设是通过所述目的外设与所述存储器直接访问控制器之间的接口实现的。
进一步地,上述存储器直接访问控制器还具有下面特点:
所述配置模块,接收的配置信息还包括:源起始地址和目的起始地址;所述传输宽度转换参数包括源外设数据宽度和目的外设所需的数据宽度;
所述控制模块,具体用于根据所述传输宽度转换参数,按照所述源外设的接口时序从所述源起始地址开始读取源外设数据宽度的数据,将读取到的数据转换成所述目的外设所需的数据宽度后,按照所述目的外设的接口时序,从所述目的起始地址开始写入所述目的外设。
进一步地,上述存储器直接访问控制器还具有下面特点:
所述源外设支持的数据宽度包括以下的任一种:8比特、16比特和32比特;
所述目的外设支持的数据宽度包括以下的任一种:8比特、16比特和32比特。
进一步地,上述存储器直接访问控制器还具有下面特点:
所述传输宽度转换参数为0时,表示数据宽度从8bits转换为8bits;
所述传输宽度转换参数为5时,表示数据宽度从16bits转换为16bits;
所述传输宽度转换参数为a时,表示数据宽度从32bits转换为32bits;
所述传输宽度转换参数为1时,表示数据宽度从16bits转换为8bits;
所述传输宽度转换参数为2时,表示数据宽度从32bits转换为8bits;
所述传输宽度转换参数为6时,表示数据宽度从32bits转换为16bits;
所述传输宽度转换参数为4时,表示数据宽度从8bits转换为16bits;
所述传输宽度转换参数为8时,表示数据宽度从8bits转换为32bits;
所述传输宽度转换参数为9时,表示数据宽度从16bits转换为32bits。
综上,本发明提供一种控制数据传输的方法及DMA控制器,本发明的DMA控制器采取的传输方式,为作用于存储器之间、存储器与外设之间、外设与外设之间直接交换数据,不执行CPU读写指令,且不需要经过CPU缓存,减少了中间环节。只要完成配置DMA控制器,所有读写时序全部由硬件执行,因此大大提高了传送数据的速率。本发明可以处理不同宽度数据互通的问题,使之互通方便、传输速度较快、系统连接简单,且不占用系统总线。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下文中将结合附图对本发明的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
图2为本发明实施例的DMA系统结构框图。CPU工作模式中:通过系统总线(SYS_BUS),CPU也可以单独访问DMA控制器、源存储器或外设(Src)、目的存储器或外设(Dst)。Src和Dst均有一数据接口直接与DMA控制连接。DMA工作模式中:通过SYS_BUS,CPU也是先配置DMA内部功能寄存器,使能打开后,DMA开始工作。
图3为本实施例的DMA控制器的框图。DMA模块分为两个部分:配置模块(Dma_sfr)和控制模块(Dma_ctrl)。Dmac_sfr接收CPU配置信息(Sys_dat),对配置信息(Sys_dat)进行解析,将配置信息(Configure)发送至Dmac_ctrl模块。Dma_ctrl作为控制模块实现数据传输,从Src读出数据(Src_rd_dat),向Dst写入数据(Dst_wr_dat)。
图4为本发明实施例的DMA控制器的工作原理图,CPU对Dma寄存器配置:传输长度(len),传输宽度转换参数(width),源起始地址(Base_src_addr),目的起始地址(Base_dst_addr),最后配置控制使能(en)完成后,Dma开始工作。
图5为本发明实施例的一种控制数据传输的方法的流程图,如图5所示,本实施例的方法包括以下步骤:
S11、接收CPU的配置信息,对所述配置信息进行解析,所述配置信息包括传输宽度转换参数;
S12、从源外设读取数据,根据所述传输宽度转换参数将读取到的数据转换成相应的数据宽度后写入目的外设。
其中,所述从源外设读取数据是通过所述源外设与所述存储器直接访问控制器之间的接口实现的;
所述将数据写入目的外设是通过所述目的外设与所述存储器直接访问控制器之间的接口实现的。
以现有技术相比,本发明实施例的方法具有以下优点:
首先,解决数据宽度匹配问题,支持数据宽度从Src到Dst的8/16/32bits之中的任意比特宽度互通。DMA工作时,遵循Src接口的时序,从源地址读出的数据(8/16/32bits)通过DMA内部将数据转换成Dst所需宽度(8/16/32bits),按照Dst接口时序,直接写入目的地址。硬件自动匹配宽度,转换时序,系统连接简单,数据传输快速。
其次,本发明实施例的DMA控制器工作时,不占用系统总线。DMA工作时,CPU可以通过系统总线访问其他从模块(除了DMA工作传输涉及的Src和Dst),实现进程两线运行,并且可及时处理外设或其他模块的中断信号,使用方便。
本实施例的数据传输,采用“先读后写”的时序。
首先,读指针(Rd)指向源起始地址(Base_src_addr),读取数据进入DMA,DMA内部进行数据宽度转换(8/16/32bits),源地址增加量(Src_addr_inc)增加;然后,写指针(Wr)指向目的起始地址(Base_dst_addr),写入存储器相应地址。
本实施例的传输宽度转换参数(Dmac_width)表示源外设数据宽度与目的外设数据宽度的对应关系如下表1所示.
本实施例的传输宽度转换参数用4Bits表示,低两位表示源外设的数据宽度,例如,表1中[1:0]=00表示源外设的数据宽度(src_width)为8bits,[1:0]=01表示src_width为16bits,[1:0]=10表示src_width为32bits;高两位表示目的外设的数据宽度,例如,表1中[3:2]=00表示目的外设的数据宽度(dst_width)为8bits;[3:2]=01表示dst_width为16bits;[3:2]=10表示dst_width为32bits。
表1
完成写操作之后,目的地址增加量(Dst_addr_inc)增加,下一次读操作,Rd指向源地址(Base_src_addr+Src_addr_inc);下一次写操作,Wr指向目的地址(Base_dst_addr+Dst_addr_inc),完成数据读写。
依此,后面每次数据传输Src_addr_inc和Dst_addr_inc都会递增。直到数据传输长度等于len,表示所有数据传输结束,Dma停止工作。
以下以几个具体实施例对本发明的方法进行详细的说明。
实施例一
图6为本发明实施例的数据宽度传输:8—>8bits的仿真图。配置信息:源起始地址Dmac_src_addr=32’h1000,目的起始地址Dmac_dst_addr=32’h2000,传输长度Dmac_len=“3”(表示传输4次),传输宽度转换参数Dmac_width=“0”(表示从源—>目的宽度为8—>8bits),当使能Dmac_en=“1”时,DMA开始工作。
源地址(Src_addr)从“1000”开始,当读信号(Src_rd)与读正确应答信号(rd_dack)都为“1”时,读出数据(Src_rd_data)“12”。读操作之后,目的地址(Dst_addr)从“2000”开始,写读信号(Dst_wr)与写正确应答信号(wr_dack)都为“1”时,写入数据(Dst_wr_data)“12”,且Src_addr、Dst_addr增加,至此完成一次读写。
此次读写各操作4次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
本实施例中,DMA模块读、写操作,要保证源、目的模块接口的时序正确;并且需要“握手”机制,在数据读出之前,不允许发出下一次写操作。下面电路仿真波形,也遵循此说明。
实施例二
图7为本发明实施例的数据宽度传输:16—>16bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“5”(表示从源—>目的宽度为16—>16bits),当使能Dmac_en=“1”时,DMA开始工作。
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“3412”。读操作之后,Dst_addr从“2000”开始,Dst_wr与wr_dack都为“1”时,写入数据Dst_wr_data为“3412”,且Src_addr、Dst_addr增加。至此完成一次读写。
此次读写各操作2次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
实施例三
图8为本发明实施例的数据宽度传输:32—>32bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“a”(表示从源—>目的宽度为32—>32bits),当使能Dmac_en=“1”时,DMA开始工作。
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“7856_3412”。读操作之后,Dst_addr从“2000”开始,Dst_wr与wr_dack都为“1”时,写入数据Dst_wr_data为“7856_3412”,且Src_addr、Dst_addr增加。至此完成一次读写。
此次读写各操作1次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
实施例四
图9为本发明实施例的数据宽度传输:16—>8bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“1”(表示从源—>目的宽度为16—>8bits),当使能Dmac_en=“1”时,DMA开始工作。
16—>8bits传输时,从Src读出数据宽度为16bits,而写入Dst数据宽度为8bits,所以需要写2次,每次写8bits,写入Dst_addr。
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“3412”。读操作之后,Dst_wr与wr_dack都为“1”时,将数据的[7:0]为“12”写入Dst_addr(从“2000”开始),Dst_wr_data为“12”。然后Src_addr不变,再读出“3412”,并将数据的[15:8]为“34”写入下一个Dst_addr(“2001”),Dst_wr_data为“34”,且Src_addr、Dst_addr增加。这样完成了一次数据转换。
此次读写各操作4次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
实施例五
图10为本发明实施例的数据宽度传输:32—>8bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“2”(表示从源—>目的宽度为32—>8bits),当使能Dmac_en=“1”时,DMA开始工作。
32—>8bits传输时,从Src读出数据宽度为32bits,而写入Dst数据宽度为8bits,所以需要写4次,每次写8bits,写入Dst_addr。
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“7856_3412”。读操作之后,Dst_wr与wr_dack都为“1”时,将数据“[7:0]”为“12”写入Dst_addr(从“2000”开始),Dst_wr_data为“12”。然后Src_addr不变,再读出“7856_3412”,并将数据“[15:7]”为“34”写入下一个Dst_addr(“2001”),Dst_wr_data为“34”。再读出“7856_3412”,并将数据“[23:15]”为“56”写入下一个Dst_addr(“2002”),Dst_wr_data为“56”。再读出“7856_3412”,并将数据“[31:24]”为“78”写入下一个Dst_addr(“2003”),Dst_wr_data为“78”。且Src_addr、Dst_addr增加。这样完成了一次数据转换。
此次读写各操作4次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
实施例六
图11为本发明实施例的数据宽度传输:32—>16bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“6”(表示从源—>目的宽度为32—>16bits),当使能Dmac_en=“1”时,DMA开始工作。
32—>16bits传输时,从Src读出数据宽度为32bits,而写入Dst数据宽度为16bits,所以需要写2次,每次写16bits,写入Dst_addr。
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“7856_3412”。读操作之后,Dst_wr与wr_dack都为“1”时,将数据“[15:0]”为“3412”写入Dst_addr(从“2000”开始),Dst_wr_data为“3412”。然后Src_addr不变,再读出“7856_3412”,并将数据“[31:16]”为“7856”写入下一个Dst_addr(“2001”),Dst_wr_data为“7856”,且Src_addr、Dst_addr增加。这样完成了一次数据转换。
此次读写各操作2次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
实施例七
图12为本发明实施例的数据宽度传输:8—>16bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“4”(表示从源—>目的宽度为8—>16bits),当使能Dmac_en=“1”时,DMA开始工作。
8—>16bits传输时,从Src读出数据宽度为8bits,而写入Dst数据宽度为16bits,所以需要读2次,每次读8bits,一次写入Dst_addr为16bits。`
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“12”。读操作之后,Dst_wr与wr_dack都为“1”时,虽然此时将数据“12”放在[7:0],写入Dst_addr(从“2000”开始),Dst_wr_data为“12”。但之后Src_addr增加为“1001”,再读出“34”放在[15:8],并将数据“3412”一并写入Dst_addr(“2000”)”,Dst_wr_data为“3412”,且Src_addr、Dst_addr增加。这样完成了一次数据转换。
此次读写各操作4次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
实施例八
图13为本发明实施例的数据宽度传输:8—>32bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“8”(表示从源—>目的宽度为8—>32bits),当使能Dmac_en=“1”时,DMA开始工作。
8—>32bits传输时,从Src读出数据宽度为8bits,而写入Dst数据宽度为32bits,所以需要读4次,每次读8bits,一次写入Dst_addr为32bits。
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“12”。读操作之后,Dst_wr与wr_dack都为“1”时,虽然此时将数据“12”放在[7:0],写入Dst_addr(从“2000”开始),Dst_wr_data为“12”。之后Src_addr增加为“1001”,再读出“34”放在[15:8],并将数据“3412”写入Dst_addr(“2000”)”,Dst_wr_data为“3412”。之后Src_addr增加为“1002”,再读出“56”放在[23:16],并将数据“56_3412”写入Dst_addr(“2000”)”,Dst_wr_data为“56_3412”。之后Src_addr增加为“1003”,再读出“78”放在[31:24],并将数据“7856_3412”一并写入Dst_addr(“2000”)”,Dst_wr_data为“7856_3412”,且Src_addr、Dst_addr增加。这样完成了一次数据转换。
此次读写各操作4次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
实施例九
图14为本发明实施例的数据宽度传输:16—>32bits的仿真图。配置信息:Dmac_src_addr=32’h1000,Dmac_dst_addr=32’h2000,Dmac_len=“3”(传输4字节),Dmac_width=“9”(表示从源—>目的宽度为16—>32bits),当使能Dmac_en=“1”时,DMA开始工作。
16—>32bits传输时,从Src读出数据宽度为16bits,而写入Dst数据宽度为32bits,所以需要读2次,每次读16bits,一次写入Dst_addr为32bits。
Src_addr从“1000”开始,当Src_rd与rd_dack都为“1”时,Src_rd_data为“3412”。读操作之后,Dst_wr与wr_dack都为“1”时,虽然此时将数据“3412”放在[15:0],写入Dst_addr(从“2000”开始),Dst_wr_data为“3412”。但之后Src_addr增加为“1002”,再读出“7856”放在[31:16],并将数据“7856_3412”一并写入Dst_addr(“2000”)”,Dst_wr_data为“7856_3412”,且Src_addr、Dst_addr增加,这样完成了一次数据转换。
此次读写各操作2次,传输4字节。数据传输完毕,结束标志信号Dmac_end置“1”,使能信号Dmac_en置“0”,DMA模块工作完毕。
本发明实施例可以解决数据宽度匹配问题,例如,支持数据宽度从Src到Dst的8/16/32bits之中的任意比特宽度互通。硬件自动匹配宽度,转换时序,系统连接简单,数据传输快速。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本发明不限制于任何特定形式的硬件和软件的结合。
以上仅为本发明的优选实施例,当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。