FPGA的sopc系统中DMA的3种传输方式小结.doc_第1页
FPGA的sopc系统中DMA的3种传输方式小结.doc_第2页
FPGA的sopc系统中DMA的3种传输方式小结.doc_第3页
FPGA的sopc系统中DMA的3种传输方式小结.doc_第4页
FPGA的sopc系统中DMA的3种传输方式小结.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

fpga的sopc系统中dma的3种传输方式小结标签:dma uart 232存储器nios大家都知道dma有三种传输方式:存储器到存储器、硬件(固定地址)到存储器、存储器到硬件(固定地址)。这里罗森就将自己做的实验详细介绍给大家,与大家一起分享!如有不足的地方,欢迎拍砖。准备:由于要尝试硬件与存储器之间的传输,我这里使用的硬件(固定地址设备)是232串口,所以需要开发板上具备rs232接口(从fpga管脚出来,添加一个232电平转换芯片和一个232接插件),开发电脑也要有232串口。这样才方便调试。当然要有足够的程序存储空间能够运行程序。我采用的是一块sram。首先,需要建立一个sopc系统其中dma模块、uart模块、jtag_uart都是默认设置,有时添加设置(如dma的突发传输)可能实验就会出现异常。mem_0、mem_1都是onchip_memery,设置为8位1024字节,也可以使用其他存储器sdram等直接在程序中声明一个buf然后分配好位置,sram是一个添加的存储器接口模块,这个用于运行程序,大家也可以使用自己板上其他的存储器如sdram、flash等。led_pio可以不用考虑,这篇博文中不会用到。下面再看看nios ii软件程序的编写,详细代码见文章末,这里先做一个说明(1)存储器到存储器直接将mem to uart那一块注释掉,将前面的mem to mem部分去块注释就可以了,也可以再将iowr_altera_avalon_uart_control(uart_232_base,0x0);这句注释掉,不注释也没影响。这里用dma将mem_0中的数据传输到mem_1中,通过观察dma工作前mem_1中的数据和工作后mem_1中的数据就可看出实验的结果。试验中使用了dma_tx_done标志,以便检查中断是否成功,因为有时数据传输正确了,中断上可能还有问题,而实际中高效率往往需要中断。(2)存储器到uart 232同样的将将uart to mem和mem to mem注释掉,再将mem to uart去快注释,末尾的printf(transfer successn);后面的for循环语句也可以注释掉,不注释也没影响。这里将mem_0中的数据发送到串口,在电脑上通过串口调试器观察接收到的数据。有的调试器可能有字符显示模式和16进制模式,注意发送的数据和字符的对应关系,注意设置模式和波特率等。串口调试器上观察到以前写入mem_0中的数据,以及在nios调试软件中打印出transfer success即可。nios调试软件中stdin、stdout都设置的是jtag_uart。(3)uart 232到存储器同样的将mem to uart和mem to mem注释掉,再将uart to mem去块注释。这里dma从uart 232接收数据并保存到mem_1中。在电脑上通过串口调试器发送数据到串口,当发送的数据达到程序中设定的长度后,会打印transfer success,并打印出mem_1中接收到数据,通过与初始化的数据比较即可看出结果,这里nios调试软件中stdin设置为uart_232,stdout设置为jtag_uart,也可设置为uart_232。注意事项:注意一、iowr_altera_avalon_uart_control(uart_232_base,0x0);/close uart irq这一句在mem to mem和mem to uart是可以不用,这是用于清除uart接收中断的,在uart to mem中需要用到,要不然不能顺利调用中断程序,当然如果采用的是一个dma接收,一个dma发送,不使用中断模式,就不会遇到这样的问题,很多dma uart的接收程序没通过的就是没做这一步处理。注意二、if(ret=alt_dma_txchan_ioctl(txchan,alt_dma_tx_only_on,uart_232_base+2)=0)这句中uart_232_base+2容易被设置错,当做存储器到uart的时候,使用alt_dma_txchan_ioctl设置发送地址时要设置为uart_232_base+2,因为寄存器为16位,不是uart_232_base或者uart_232_base+4或者ioaddr_altera_avalon_uart_txdata(uart_232_base)。注意三、dma中断程序中最好添加iowr_altera_avalon_dma_status(dma_0_base,0x0);语句,这是用于清除中断标志的,避免反复中断。因为寄存器中的done位不能自动清零,需要写0到status寄存器才能清零。#include stdio.h#include stdlib.h#includesys/alt_dma.h#includealtera_avalon_dma_regs.h#includealtera_avalon_uart_regs.h#includesys/alt_irq.h#includesystem.h#include sys/alt_cache.h volatile int dma_tx_done=0;#define dma_len 0x10#define istart 0x30 void dma_done(void*handle,void*dma)iowr_altera_avalon_dma_status(dma_0_base,0x0);dma_tx_done=1;int main()alt_dma_txchan txchan;alt_dma_rxchan rxchan;int i;int rc,ret;for(i=istart;i istart+dma_len;i=i+1)iowr_8direct(mem_0_base,i-istart,i);for(i=istart;i istart+dma_len;i=i+1)printf(mem0%4xis%4xn,i-istart,iord_8direct(mem_0_base,i-istart);for(i=0;i dma_len;i=i+1)iowr_8direct(mem_1_base,i,0x0);for(i=0;i dma_len;i=i+1)printf(mem1%4xis%4xn,i,iord_8direct(mem_1_base,i);iowr_altera_avalon_uart_control(uart_232_base,0x0);/close uart irq/*/mem to mem if(txchan=alt_dma_txchan_open(dma_0_name)!=null)if(ret=alt_dma_txchan_ioctl(txchan,alt_dma_set_mode_8,null)=0)if(ret=alt_dma_txchan_send(txchan,mem_0_base,dma_len,null,null)0)printf(fail to send,error%dn,ret);elseprintf(fail to send,error%dn,ret);elseprintf(fail to open dma txchann);if(rxchan=alt_dma_rxchan_open(dma_0_name)!=null)if(ret=alt_dma_rxchan_prepare(rxchan,mem_1_base,dma_len,dma_done,null)0)printf(fail to receive,error%dn,ret);elseprintf(fail to open dma rxchann);*/mem to uart if(txchan=alt_dma_txchan_open(dma_0_name)!=null)if(ret=alt_dma_txchan_ioctl(txchan,alt_dma_set_mode_8,null)=0)if(ret=alt_dma_txchan_ioctl(txchan,alt_dma_tx_only_on,uart_232_base+2)=0)if(ret=alt_dma_txchan_send(txchan,mem_0_base,dma_len,dma_done,null)0)printf(fail to send,error%dn,ret);elseprintf(fail to set tx only,error%dn,ret);elseprintf(fail to set tx mode 8,error%dn,ret);elseprintf(fail to open dma txchann);/*/uart to mem if(rxchan=alt_dma_rxchan_open(dma_0_name)!=null)if(ret=alt_dma_rxchan_ioctl(rxchan,alt_dma_set_mode_8,null)=0)if(ret=alt_dma_rxchan_ioctl(rxchan,alt_dma_rx_only_on,uart_232_base)=0)if(ret=alt_dma_rxchan_prepare(rxchan,mem_1_base,dma_len,dma_done,null)0)printf(fail to receive,error%dn,ret);elseprintf(fail to set rx only,error%dn,ret);elseprintf(fail t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论