9 - DMA

for more visit: www.fpgalover.com

If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.

Jesus

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.

for more visit: www.fpgalover.com

If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.