Escrito por Jesus Lopez

 
 
 
 
INTRODUCCIÓN
 

El acceso directo a memoria (DMA, del inglés direct memory access) permite a cierto tipo de componentes de una computadora acceder a la memoria del sistema para leer o escribir independientemente de la unidad central de procesamiento (CPU) principal. Muchos sistemas hardware utilizan DMA, incluyendo controladores de unidades de disco,tarjetas gráficas y tarjetas de sonido. DMA es una característica esencial en todos los ordenadores modernos, ya que permite a dispositivos de diferentes velocidades comunicarse sin someter a la CPU a una carga masiva de interrupciones.Una transferencia DMA consiste principalmente en copiar un bloque de memoria de un dispositivo a otro. En lugar de que la CPU inicie la transferencia, esta se lleva a cabo por el controlador DMA.

 

 

 

PROCEDIMIENTO 

 
 
Descargue el proyecto de DMA
 
 
-Abra el archivo de QPF de la practica DMA, y proceda abrir el Qsys.
   
 
y abra el .qsys que encontrara en la carpeta
 
 
vamos agregar cada uno de los IP que necesitamos, empecemos por el SCATTER-GATHER DMA CONTROLLER
 
 
En transfer mode, seleccionamos Memory to stream 
 
 
en Avalon MM data master byte reorder mode, seleccionemos Byte swap.
 
 
 
al agragarlo, debe quedarnos algo como la imagen 
 
 
vamos a renombrarlo dando click derecho sobre el y lo llamaremos sgdma_out
 
Agregaremos un Dual-Clock FIFO
en color planes seleccionaremos 4.
 
agregaremos también un Clock Source
 
des-seleccione la casilla de Clock frequency is known 
 
ahora que tenemos lo que necesitamos, pasamos hacer las respectivas conexiones.
conectaremos el clk del sgdma_out al clk del pll
 
 
el reset al debug_reset de la cpu y al reset del clock de 50Mh
 
conectaremos el csr al data_master de la cpu
 
 
vamos a la RAM_jesus y en el s1 conecta el descriptor_read
y conecta el descriptor_write
 
en el csr_irq se conectara al irq de la cpu
 
volvemos a la Ram_jesus y conectamos el m_read al s1
el out al avalon_dc_buffer con esto terminamos las conexiones del sgdma_out
 
 
Ya que sabemos como hacer las conexiones,  conecta las siguientes, cuando ya tengas las conexiones de la imagen, en la tercera casilla ala derecha dice Double-click to export dando doble click exportaremos avalon_dc_buffer_source y se nombrara como aparece en la imagen.
 
en System, seleccionamos Assign Base Addresses y Assign interrupt numbers, para que asigne automáticamente y se nos eliminen los errores. 
así deben quedar las conexiones 
en Generate damos click en HDL Ecample
estas son nuestras conexiones generadas,las copiaremos en nuestro Modulo principal de nuestro proyecto de Quartus.
 
 
 
el código debe verse así
 
pasamos a borrar las asignaciones 
antes de hacer las asignaciones de entrada y salidas, generemos el HDL
 
 
 
pasemos a editar el código del modulo principal en su Quartus
 
compile su programa después de copiar el código, si le sale errores asegúrese de haber copiado bien el código
 
mientras compila el programa abra Eclipse, pasaremos hacer el codigo del software
 
cree un nuevo archivo
 
 
Esta parte es importante, asegúrese de la ruta del .sopcinfo y seleccionar el correcto
 
 
el nombre del proyecto es de su elección, en este caso lo llame dma_test_1, seleccione en Templates blank project
se le crearan dos carpetas,una con el nombre de dma_test_1 y otra con el nombre de dma_test_1_bsp, sobre la carpeta dma_test_1 haga click derecho  y selecciones source file
nombrelo main_dma.c es importante el .c
Asegúrese que el programa en Quartus halla terminado de compilar, si fue así, programe su FPGA
 
 
 
 
Descargue el codigo del main_dma.c y copielo en el main_dma.c del archivo de eclipse.
 
en la carpeta de dma_test_1_bsp haga click derecho y seleccine Generar BSP
 
 
 
sobre la carpeta de dma_test_1 seleccione Build Project
 
luego click derecho y seleccione Debug As- Nios hadware
 
 
 
tenemos 5 vectores, el SW[0] controla los saltos entre vectores, asi que las primeras imágenes mostrara el resultado del primer vector. 
vector[5]={0x00010203,0x04050607,0x08090A0B,0x0C0D0E0F,0x10111213};
 
3'd0 mostrara el bit menos significativo, asi que mostrara el 0x00010203
 
 
3'd1 mostrara el bit menos significativo, asi que mostrara el 0x00010203
 
 
3'd2 mostrara el bit menos significativo, asi que mostrara el 0x00010203
 
 
3'd3 mostrara el bit menos significativo, asi que mostrara el 0x00010203
 
subimos el SW[0] en cuanto veamos el cambio en los leds, bajamos SW[0] veremos el resultado del segundo vector. 
vector[5]={0x00010203,0x04050607,0x08090A0B,0x0C0D0E0F,0x10111213};
 
3'd0 mostrara el bit menos significativo, asi que mostrara el 0x04050607
 
 
3'd1 mostrara el bit menos significativo, asi que mostrara el 0x04050607
 
3'd2 mostrara el bit menos significativo, asi que mostrara el 0x04050607
 
 
3'd3 mostrara el bit menos significativo, asi que mostrara el 0x04050607
 
subimos el SW[0] en cuanto veamos el cambio en los leds, bajamos SW[0] veremos el resultado del tercer vector. 
vector[5]={0x00010203,0x04050607,0x08090A0B,0x0C0D0E0F,0x10111213};
 
 
3'd0 mostrara el bit menos significativo, asi que mostrara el 0x08090A0B
 

3'd0 mostrara el bit menos significativo, asi que mostrara el 0x08090A0B
 
 
3'd2 mostrara el bit menos significativo, asi que mostrara el 0x08090A0B
 
3'd3 mostrara el bit menos significativo, asi que mostrara el 0x08090A0B
 
 
subimos el SW[0] en cuanto veamos el cambio en los leds, bajamos SW[0] veremos el resultado del cuarto vector. 
vector[5]={0x00010203,0x04050607,0x08090A0B,0x0C0D0E0F,0x10111213};
 
 
3'd0 mostrara el bit menos significativo, así que mostrara el 0x0C0D0E0F
 
 
 
3'd1 mostrara el bit menos significativo, así que mostrara el 0x0C0D0E0F
 
 
3'd2 mostrara el bit menos significativo, así que mostrara el 0x0C0D0E0F
 
 
 
 
3'd3 mostrara el bit menos significativo, así que mostrara el 0x0C0D0E0F
 
 
 
subimos el SW[0] en cuanto veamos el cambio en los leds, bajamos SW[0] veremos el resultado del quinto  vector. 
vector[5]={0x00010203,0x04050607,0x08090A0B,0x0C0D0E0F,0x10111213};
 
 
3'd0 mostrara el bit menos significativo, así que mostrara el 0x10111213
 
 
3'd1 mostrara el bit menos significativo, así que mostrara el 0x10111213
 
 
 
3'd2 mostrara el bit menos significativo, así que mostrara el 0x10111213
 
 
3'd3 mostrara el bit menos significativo, así que mostrara el 0x10111213
 
ahora bien si dejamos SW[0] arriba, este mostrara posición por posición de cada vector desde el menos significativo al mas significativo.