Nios® V/II Embedded Design Suite (EDS)
Support for Embedded Development Tools, Processors (SoCs and Nios® V/II processor), Embedded Development Suites (EDSs), Boot and Configuration, Operating Systems, C and C++
12618 Discussions

Unable to do data transfers with altera DMA controller.

Honored Contributor II

Hello all, 


I am a beginner just started working on altera fpga devices . I have designed an SoC (see figure) where it has NIOS II , onchip_memory1 and onchip_memory2 ,altera DMA controller and JTAG uart targeting stratix 10 device. 


I am able to do read /write data into each peripheral individually. But the thing is , i am completely unaware of how to transfer data from one peripheral to other peripheral via dma controller. I searched the dma controller document and found the control register , length register, status register , source register and destination register and found their offsets . Accordingly i have written a C code to configure all these registers (see the c code attached) for the dma controller. 

/* * "Hello World" example. * * This example prints 'Hello from Nios II' to the STDOUT stream. It runs on * the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example * designs. It runs with or without the MicroC/OS-II RTOS and requires a STDOUT * device in your system's hardware. * The memory footprint of this hosted application is ~69 kbytes by default * using the standard reference design. * * For a reduced footprint version of this template, and an explanation of how * to reduce the memory footprint for a given application, see the * "small_hello_world" template. * */ # include <stdio.h> //#include <altera_avalon_dma.h> int main() { alt_printf("Hello from Nios II!\n"); volatile int *avalon = 0x00000000; volatile int *onchip1 = 0x1000000+0x500; volatile int *onchip2 = 0x1010000; //internal register of dma controller volatile int *status_reg = 0x01020800; volatile int *dma_addr_src = 0x01020804; volatile int *dma_addr_dest = 0x01020808; volatile int *dma_bytes = 0x0102080c; volatile int *control_reg = 0x01020818; int i; int b_errors = 0; //configuring the internal registers status_reg = 0x0; dma_addr_dest = 0x01010000; dma_addr_src = 0x1000000+0x500; dma_bytes = 0x200; control_reg = 0x0099; // filling data into avalon custom slave for(i=0;i<512;i++) { avalon = i; } //filling data into source peripheral for(i=0;i<512;i++) { onchip1 = i*0x100+0x100; } alt_printf("data written to avalon slave peripheral and source peripheral\n"); alt_dcache_flush_all(); alt_icache_flush_all(); //cross checking the configuration registers of dma controller alt_printf("b_errors = %x\n",b_errors); alt_printf("statusreg = %x\n",status_reg); alt_printf("readaddressreg = %x\n",dma_addr_src); alt_printf("writeaddressreg = %x\n",dma_addr_dest); alt_printf("dma_bytes = %x\n",dma_bytes); alt_printf("control_reg = %x\n",control_reg); //continous checking to see whether status register is getting high ?? while(status_reg !=1){ } //comparing data at both source and destination peripherals for(i=0;i<512;i++) { if(onchip2 != onchip1) b_errors ++; } /* for(i=0;i<512;i++) { alt_printf("%x\n",onchip1); }*/ alt_printf("b_errors = %x\n",b_errors); return 0; }  


please someone help me to sort out this issue. 


0 Kudos
0 Replies