Nios II中DMA设备的使用

        Nios II的标准设备软IP中有一个DMA设备,在SoPC系统开发中是一个非常常用的设备。但在Nios II的文档对该设备的说明里,一些概念和说明方式跟一般有些不同,容易造成初次接触的人一些理解上的混乱。
        DMA的概念其实挺简单,无非就是把一定长度的数据从源地址传送到目标地址。其中有一点比较重要的是对于地址的操作方式,一种是地址自增,另一种是地址固定。就是说DMA控制器读或写完一个数据后,对地址是自动增加,下次读写下一个地址,还是不变,下次还是读写同一个地址。由于地址固定模式一般是用在外设,所以在Nios的文档中,使用地址固定模式的一方就称为设备(Peripheral),而使用地址自增模式的一方则称为内存(Memory)。
        在HAL的API中,对于地址自增一方,需要打开一个接收或发送的Channel,然后配置地址;而如果是地址固定的一方,则不需要打开一个Channel,只需要用alt_dma_rxchan_ioctl()的ALT_DMA_RX_ONLY_ON或ALT_DMA_TX_ONLY_ON参数设置,并配置地址即可。下面是三种方式的代码例子。
        1、Memory to Memory传送,即是源和目标都是地址自增模式的:

                  tx = alt_dma_txchan_open("/dev/dma_0");
                 dma_res = alt_dma_txchan_send(tx, tx_buf, 32, NULL, NULL);  // tx_buf是源地址
                 rx = alt_dma_rxchan_open("/dev/dma_0");
                dma_res = alt_dma_rxchan_prepare(rx, rx_buf, 32, dma_done, NULL); // rx_buf是目标地址,dma_done()是DMA完成后被调用的回调函数。

        2、Peripheral to Memory传送,叫做Receive,即源地址是固定模式,而目标地址是自增模式:

                rx = alt_dma_rxchan_open("/dev/dma_0");  // 打开Receive通道
               alt_dma_rxchan_ioctl(rx, ALT_DMA_RX_ONLY_ON, (void *)source_addr);   // source_addr是源地址
               dma_res = alt_dma_rxchan_prepare(rx, rx_buf, 32, dma_done, NULL);  // rx_buf是目标地址

        3、Memory to Peripherial传送,叫做Transmit,即源地址是自增模式,而目标地址是固定模式:

              tx = alt_dma_txchan_open("/dev/dma_0");  // 打开Transmit通道
             alt_dma_txchan_ioctl(tx, ALT_DMA_TX_ONLY_ON, (void *)dst_addr);   // dst_addr是目标地址
             dma_res = alt_dma_txchan_send(tx, tx_buf, 32, dma_done, NULL);     // tx_buf是源地址

        最后总结一下几个概念,明白了这几个概念,再读Nios的文档就好理解了。

            Peripheral :地址固定模式的一方称为Peripheral。
            Memory : 地址自增模式的一方称为Memory。
            Transimit  Channel:用于从地址自增一方传送到地址固定一方的通道。
            Receive Channel :用于从地址固定一方传送到地址自增一方的通道。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NIOS2 设计方案开发技术资料FPGA设计文档开发应用例子资料69个合集: Nios 2 小册子.pdf NIOS 2 开发常见问题.pdf Nios 2 软件代码优化方法.pdf NIOS 2常见问题总结.pdf NIOS 2应用开发ABC.pdf NIOS 2熟悉开发环境.pdf Nios2 的Boot过程分析.pdf NIOS 2熟悉开发环境.pdf NIOS2 FLASHStep_by_step.pdf Nios2之常见问题解答.pdf Nios2之软件调试技巧.pdf Nios2系统开发流程.pps Nios2软件调试技巧.pdf Nios_Starter.pdf Nio2集成开发环境问世.pdf NIOS入门.pdf Nios2入门实验程序问题整理.pdf Nios2嵌入式处理器的CPU结构.pdf NIOS2嵌入式系统的可扩展性分析.pdf Nios2教材.pdf NIOS2软核处理器的Linux引导程序U_boot设计.pdf 基于Altera Nios平台的信号高速采集系统.pdf 基于ARM+FPGA的大屏幕显示器控制系统设计.pdf 基于DSP与FPGA的LED显示屏控制系统的设计.pdf 基于DSP与FPGA的LED显示屏控制系统的设计2.pdf 基于DSP与FPGA的LED显示屏控制系统的设计3.pdf 基于DSP与FPGA的LED显示屏控制系统的设计4.pdf 基于DSP与FPGA的LED显示屏控制系统的设计5.pdf 基于DSP与FPGA的LED显示屏控制系统的设计6.pdf 基于DSP与FPGA的LED显示屏控制系统的设计7.pdf 基于FPGA乒乓球比赛游戏机的设计.pdf 基于FPGA圆阵超声自适应波束形成的设计.pdf 基于FPGA的AGWN信号生成器.pdf 基于FPGA的DDR SDRAM控制器在高速数据采集系统的应用.pdf 基于FPGA的FFTIFFT处理器的实现.PDF 基于FPGA的PCB测试机硬件电路设计.pdf 基于FPGA的VGA时序彩条信号实现方法及其应用.pdf 基于FPGA的VGA显示模块设计.pdf 基于FPGA的嵌入式系统设计.pdf 基于FPGA的快速傅立叶变换.PDF 基于FPGA的总线型LVDS通信系统设计.pdf 基于FPGA的简易微型计算机结构.pdf 基于FPGA的简易数字存储示波器设计.pdf 基于FPGA的远程图像采集系统设计.pdf 基于FPGA的高速数字隔离型串行ADC应用.pdf 基于Nios 的通用数字调制器设计与实现.pdf 基于Nios的DDS技术在电磁无损检测的应用.pdf 基于Nios的LED显示屏控制系统.pdf 基于Nio和eCos的串口通信程序开发.pdf 基于NIO嵌入式软核处理器的LCD控制方法研究.pdf 基于Nio的USB接口模块设计.pdf 基于Nio的纤维自动识别系统设计.pdf 基于NIOS处理器的SOPC应用系统研究与设计.pdf 基于NIOS处理器的面阵CCD采集系统设计.pdf 基于Nios嵌入式软核处理器的液晶显示屏控制.pdf 基于NIOS嵌入式软核的硬盘录像机的设计.pdf 基于Nios的DDS信号源实现.pdf 基于Nios的DDS高精度信号源实现.pdf 基于Nios的SOPC系统设计以及程序引导.pdf 基于NIOS的SOPC设计.pdf 基于Nios的掌纹鉴别系统设计与实现.pdf 基于NIOS的无心电话系统噪声的分析与抑制.pdf 基于Nios的通用编译码器的设计.pdf 基于NIOS软核CPU技术的多路电话计费系统的设计与实现.pdf 基于Nios软核的音频效果器.pdf 基于SYSTEM C的FPGA设计方法.pdf 基于声卡的LabVIEW数据采集与分析系统设计.pdf 基于多种EDA工具的FPGA设计.pdf 基于模糊控制的迟早门同步器及其FPGA实现.pdf

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值