广告

[博客大赛]我的compression毕设3-DMA传输

2013-7-13 20:47 1659 0 分类: FPGA/CPLD

一:DMA传输基本原理

20130713204329203001.jpg


20130713204352165001.jpg

二:举例

1)从SDRAM中读取数据,然后写入到我的模块,SDRAM地址是递增的,我的模块地址是不变的

void wr_cp_blk(int wr_num, char *array_tx) //wr_num要写数据块大小除以(ALT_DMA_SET_MODE_32/8),*array_tx要写数据
{            //譬如你要写16个字节,则wr_num=16/(ALT_DMA_SET_MODE_32/8)=4,在DMA设置的时候会*4
             //注意下面设置的数必须为 (ALT_DMA_SET_MODE_32/8)整数倍,否则不会写数据
  alt_dma_txchan tx_chan;
  int tx_set;
  int j=wr_num;
  void *sdram_tx_addr=(void*)array_tx;
  //此处地址为lzo_cp_0_base + offset*4,offset 为想写的偏移地址,譬如我要写的偏移地址为7的地方,则为+28
  void *lzo_cp_rx_addr=(void*)(LZO_CP_0_BASE+28);
  /*********************************************************
  * sdram to lzo_cp,transfer
  *********************************************************/
  tx_chan=alt_dma_txchan_open("/dev/dma_0");  //打开DMA设备
  if(tx_chan == NULL)
  {
     printf("can not open /dev/dma_0_tx \n ");
     exit(1);
  }
  //设置要传输目的地地址lzo_cp_rx_addr,ALT_DMA_TX_ONLY_ON表示lzo_cp_rx_addr不自增
  tx_set=alt_dma_txchan_ioctl(tx_chan,ALT_DMA_RX_ONLY_OFF,NULL);//先关闭ALT_DMA_RX_ONLY_OFF
  tx_set=alt_dma_txchan_ioctl(tx_chan,ALT_DMA_TX_ONLY_ON,lzo_cp_rx_addr);
  if(tx_set < 0)
  {
     printf("failed to set tx_ioctl \n ");
     exit(1);
  }
  //设置每次传输32字节
  tx_set=alt_dma_txchan_ioctl(tx_chan,ALT_DMA_SET_MODE_32,NULL);
  if(tx_set < 0)
  {
     printf("failed to set tx_chan 32bits \n ");
     exit(1);
  }
  //发送数据
  tx_set=alt_dma_txchan_send(tx_chan,sdram_tx_addr,4*j,fun_tx_done,NULL);
  if(tx_set < 0)
  {
     printf("failed to send data \n ");
     exit(1);
  }
  //等待发送结束
 /* while(!tx_done)
  printf("send blk ok!! \n");*/
  alt_dma_txchan_close(tx_chan);
 
}

2)从我的模块读数据到SDRAM,我的模块地址不变,SDRAM地址递增

void rd_cp_blk(int rd_num,char *array_rx)//rd_num要读数据块大小,*array_rx缓存数组
{   //对 (ALT_DMA_SET_MODE_32/8)取模,譬如你要读15个数,rd_num为4,在下面设置的时候会乘以4
    //注意下面设置的数必须为 (ALT_DMA_SET_MODE_32/8)整数倍,否则不会读取数据
  alt_dma_rxchan rx_chan;
  int rx_set;
  int j=rd_num;
  void *sdram_rx_addr=(void*)array_rx;
  void *lzo_cp_tx_addr=(void*)(LZO_CP_0_BASE+52);
  /*********************************************************
  * lzo to sdram,transfer
  *********************************************************/
  rx_chan=alt_dma_rxchan_open("/dev/dma_0");  //打开DMA设备
  if(rx_chan == NULL)
  {
     printf("can not open /dev/dma_0_rx \n ");
     exit(1);
  }
  //设置要发送的源地址lzo_cp_tx_addr,ALT_DMA_TX_ONLY_ON表示lzo_cp_tx_addr不自增
  rx_set=alt_dma_rxchan_ioctl(rx_chan,ALT_DMA_TX_ONLY_OFF,NULL); //先关闭ALT_DMA_TX_ONLY_OFF
  rx_set=alt_dma_rxchan_ioctl(rx_chan,ALT_DMA_RX_ONLY_ON,lzo_cp_tx_addr);
  if(rx_set < 0)
  {
     printf("failed to set rx_ioctl \n ");
     exit(1);
  }
  //设置每次传输32字节
  rx_set=alt_dma_rxchan_ioctl(rx_chan,ALT_DMA_SET_MODE_32,NULL);
  if(rx_set < 0)
  {
     printf("failed to set rx_chan 32bits \n ");
     exit(1);
  }
  //接收数据
  rx_set=alt_dma_rxchan_prepare(rx_chan,sdram_rx_addr,4*j,fun_rx_done,NULL);
  if(rx_set < 0)
  {
     printf("failed to recieve data \n ");
     exit(1);
  }
  //等待接收结束
 /* while(!rx_done)
  printf("recieve blk ok!! \n");*/
  alt_dma_rxchan_close(rx_chan);
}


 

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
sunyzz 2017-08-19 10:38
【博客大赛】AVALON总线介绍
1、AVALON总线简介Avalon总线是一种协议较为简单的片内总线,是ALTERA公司定义的片上互联总线,该总线可以将诸如NIOS II的CPU与其他外设连接起来,进而进行数据交换。AVALON总线...
sunyzz 2017-08-17 21:36
【博客大赛】不要轻易做职场滥好人
小A毕业于国内普通高校,但是他聪明,勤奋,能干,动手能力强,可是即便有这些优点也不能让小A轻轻松松找到一份好工作。这不,去年9月份小A好不容易找到一份工作,然后立马就入职了C公司,生怕C公司过两天不要...
sunyzz 2017-08-16 21:15
【博客大赛】IC设计低功耗技术四
五:工艺层面的降低功耗前面几节都是在讨论设计人员如何在前期阶段,中期阶段降低功耗,涉及到软件层面的,硬件层面的,这些技巧基本都是前辈总结出来的,或者根据理论推论出来的。但是到了后期,想降低功耗基本就要...
sunyzz 2017-08-14 22:35
【博客大赛】IC设计之低功耗技术三
四:RTL(寄存器传输)级的低功耗设计4.1 状态机的设计状态机编码中一般有两种方式,普通的二进制编码,特殊的格雷码,格雷码的特点是两个数据之间的跳变时只会有一个bit在toggle,显然比起多bit...
sunyzz 2017-08-12 16:51
【博客大赛】IC设计之低功耗技术二
三、架构层面的降低功耗系统的实现有很多的方式,每种方式对功耗的影响都不相同,本节主要介绍架构对功耗的影响。3.1 高级门口电路 在同步电路系统中,时钟占据了大部分的动态功耗,因而在一些情况下,如果有些...
sunyzz 2017-08-12 10:37
【博客大赛】IC 设计之低功耗技术一
一、前言随着计算机技术和微电子技术的迅速发展,嵌入式系统应用领域越来越广泛。节能是全球化的热潮,如计算机里的许多芯片过去用5V供电,现在用3.3V,1.8V,甚至更低的电压。目前的低功耗设计主要从芯片...
我要评论
0
0
广告