1、 Nios 系统中 DMA控制器的原理及应用摘要:详细介绍了 nios 系统中 dma控制器的基本原理,数据传输过程以及 dma控制器中各寄存器的作用。重点介绍了与 dma操作有关的 api函数及其使用方法,并通过一个实例描述 nios 系统中如何利用 dma方式将数据从 sdram传输到串口。实践证明,在同等 cpu开销的情况下,利用 dma技术可以将 cpu从繁重的数据搬移操作中释放出来,从而提高 cpu的数据处理能力。关键词:nios ; dma 控制器; dma 技术; sdram引言dma(direct memory access)是计算机学中的一种内存访问技术1 。它允许 cpu内
2、部的某些子系统(存储器和外设)可以独立的直接读写系统存储器而不需要 cpu的干预。在同等程度 cpu负荷下,dma 是一种快速的数据传送方式。现在越来越多的单片机采用 dma技术以提供外设和存储器间或者存储器之间的高速数据传输。但这些单片机中所包含的 dma控制器的数量是有限的,一般为 1到 2个。如果实际系统中需要多个 dma控制器的,那么这些单片机就显得无能为力了。nios 系统是一个用户可配置的通用 32位 risc嵌入式处理器,它是 sopc的核心。处理器以软核的形式实现,具有高度的灵活性和可配置性。nios 系统中所有外设以及外设控制器等都是以可配置的 ip核形式出现的,用户可以根据
3、需要重复多次添加。通过添加可配置的 ip核的方式,可以在 nios 系统中实现一个或者多个 dma控制器,以解决普通单片机中 dma控制器数量有限的问题。1dma控制器的原理1.1dma功能介绍nios 中的 dma控制器包含 2个 avalon mm 类型的主控制器端口(读端口和写端口) ,1 个用于 dma控制 avalon mm 类型的从端口以及内部一些寄存器组所构成,其结构图如图 1所示2 3 。图 1dma控制器的结构图 dma控制器可以将数据从源地址搬移到目的地址。源地址或者目的地址可以是存储器中的一段地址范围也可以是 avalon从控制器的外设。因此,在 nios 系统中,存在
4、3种类型的 dma操作,即存储器到外设,外设到存储器以及存储器到存储器。dma 控制器还具备流处理能力,允许固定或者可变长度的数据传输。当 dma操作结束时,dma 控制器发出中断(irq)请求。典型的 dma数据传输过程如下:(1) cpu通过写控制端口配置 dma控制器用于数据传输;(2) dma控制器向 cpu发出 hold信号请求占用总线;(3) cpu响应 dma控制器的请求,并让出总线,dma 控制器获得总线的控制权;(4) dma控制器读端口从源地址读数据,写端口向目的地址写数据,读写端口间利用 fifo缓存数据;(5) 当传输完指定的数据时,dma 传输结束并向 nios cp
5、u 发出中断请求;(6) cpu响应中断请求,dma 交出总线控制权。1.2dma寄存器组描述dma控制器共有 8个 32位寄存器,其中 5个为当前有效的寄存器,另外 3个为以后扩展所用。寄存器的映射表如表 1所示。表 1dma控制器内部寄存器映射表偏移量寄存器名称功能 0状态寄存器指示 dma控制器内部的详细情况 1源地址寄存器读取数据的起始地址 2目的地址寄存器写入数据的起始地址 3数据长度寄存器从读端口传输到写端口的字节数 6控制寄存器设置 dma的工作方式状态寄存器的每个状态位指示 dma控制器内部的详细情况。状态寄存器各位的含义如表 2所示。表 2状态寄存器位位编号位名称描述 0do
6、nedma传输完成。当检测到数据包结束信号或指定长度的数据传输完成时,done 位为 1。写 0到状态寄存器使 done位为 0。1busy 当 dma传输正在进行时,busy 位为12reop当传输完成事件由读数据包结束信号引起时,reop 位为13weop当传输完成事件由写数据包结束信号引起时,weop 位为14len当长度寄存器递减为 0时,len 位为 1源地址寄存器指定 dma传输的数据源的起始地址;目的地址寄存器指定了 dma传输的目标数据区的起始地址;数据长度寄存器指定从读端口传输到写端口的字节数。如果是字传输,则数据长度寄存器的值需乘以 4;若为半字传输,则需乘以 2。主控制器
7、写端口每写一个字节数据时,数据长度寄存器减 1。当数据长度寄存器为 0时,状态寄存器的 len位置位;控制寄存器每个位设定 dma的工作方式。控制寄存器每个位的意义如表 3所示。dma 传输的数据宽度用字节、半字、字、双字和 4字位指定。这些位只能有一位设置为 1。数据传输的宽度由 2个读/写传输设备中传输宽度窄的一方决定。例如,将数据从 16位的外部 sdram存储器中搬移到内部 32位的片内存储器时,传输数据宽度应该设置为半字。表 3控制寄存器位位编号位名称描述 0byte设置为字节(8 位)方式传输 1hw设置为半字(16 位)方式传输 2word设置为字(32 位)方式传输 3go使能
8、 dma传输。当设置为 1且数据长度寄存器不为 0时,开始 dma传输 4i_en使能中断(irq) 。当 i_en为 1时,若状态寄存器的done位也为 1,则 dma控制器产生中断请求。5reen 终止读数据传输。6ween 终止写数据传输。7leen 数据长度寄存器为 0时传输结束。当 leen位为 1时,若数据长度寄存器达到 0时,则结束 dma传输。8rcon 读地址固定。当 rcon为 0时,读地址在每次数据传输后增加;当 rcon为 1时,读地址在每次数据传输后不增加。9wcon写地址固定。当 wcon为 0时,写地址在每次数据传输后增加;当 wcon为 1时,写地址在每次数据传
9、输后不增加。10doubleword设置为双字(64 位)方式传输。11quadword 设置为4字(128 位)方式传输。1.3软件编程altera 提供了 hal dma设备的驱动程序4 5 ,该驱动程序把 dma传输抽象成 2种数据通道:发送数据通道和接收数据通道。当存储器从外设接收数据时,使用数据接收通道;当存储器向外设发送数据时,使用数据发送通道;当存储器间进行数据传输时,既要使用数据接收通道又要使用数据发送通道。与 dma发送数据通道相关的函数有 alt_dma_txchan_open(),alt_dma_txchan_send(),alt_dma_txchan_space(),a
10、lt_dma_txchan_ioctl(),alt_dma_txchan_close();而与 dma接收数据通道相关的函数有 alt_dma_rxchan_open(),alt_dma_rxchan_prerare(),alt_dma_rxchan_depth(),alt_dma_rxchan_ioctl()。alt_dma_txchan_open()和 alt_dma_rxchan_open()函数分别打开 dma控制器的发送数据通道和接收数据通道,获得 dma控制器的发送数据通道和接收数据通道的句柄,返回非 0值表示成功。调用 alt_dma_txchan_send()函数产生一次 dm
11、a发送数据请求。其函数原型为 int alt_dma_txchan_send(alt_dma_txchan dma,const void* from ,alt_u32 length, alt_ txchan_done* done ,void* handle)。调用此函数时,length 字节长度的数据将从地址 from处被发送。当发送结束时,函数返回值为非负则表示dma传输成功,否则表示传输失败。当传输结束时,回调函数done将被执行,handle 为函数 done的参数。dma接收函数的用法与 dma发送函数的用法大致相同,其函数原型为 int alt_dma_rxchan_prepare(
12、alt_dma_rxchan dma,const void* data ,alt_u32 length, alt_ txchan_done* done ,void* handle)。参数 data表示 dma接收数据存放的起始地址。length表示接收数据的长度,单位为字节。函数返回值为非负表示接收成功。当接收结束时,回调函数 done将被执行,handle 为函数done的参数。另外,与发送通道和接收通道相关的还各有 2个函数。与发送通道相关的函数为 alt_dma_txchan_space()和alt_dma_txchan_ioctl()。alt_dma_txchan_space()返回传
13、送到dma发送信道的发送请求数目。alt_dma_txchan_ioctl()则是执行了与器件相关的控制操作。与接收通道相关的函数为alt_dma_rxchan_depth()和 alt_dma_rxchan_ioctl()。alt_dma_rxchan_depth()函数返回 dma接收通道的最大接收请求数。alt_dma_rxchan_ioctl()执行了与器件相关的控制操作。2dma控制器应用举例在软硬件的调试过程中,有时需要将内存中的一段数据通过串口打印出来,作为调试信息,这时就可利用 dma技术进行数据传输。图 2为在 sopc builder中构建的 dma传输的硬件连接图,实现了
14、 sdram到串口的数据传输6 7 。图 2硬件连接图如下的程序实现了将 sdram中以 chr为起始地址的 20个字节的数据通过 dma方式发送到串口。其实现的核心代码如下:3结语在某雷达信号网络化数字传输系统的研制中,将雷达信号接口单元与网络接口单元分别映射为 nios 系统中的 2个外设,利用外设间的 dma方式进行数据传输。实践证明,利用 dma方式进行数据传输,cpu 可从繁重的数据传输工作中释放出来,提高了 cpu进行数据处理的能力。参考文献1邹逢兴.计算机硬件技术及其应用基础m.长沙:国防科技大学出版社,2001.2周立功.sopc 嵌入式系统基础教程m.北京:北京航空航天大学出
15、版社,2006.3altera corporation. quartus handbook, volume 4 m. s.l.: altera corporation, 2005.4altera corporation. quartus handbook, volume 5 m. s.l.: altera corporation, 2005.5altera corporation. nios software developers handbook m. s.l.: altera corporation, 2008.6覃洪英.基于 nios的 dma传输及调试j.石油仪器,2010(3):21 23.7杨进,邱兆坤.sopc 中自定义 fifo接口与 dma数据传输j.单片机与嵌入式系统应用,2008(8):61 63.