for more visit: www.fpgalover.com
If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.
Requerimientos:
Objetivos de la practica:
Profundizar en el diseño de custom hardware utilizando AVALON INTERCONNECT.
Parte 1 (Parte conceptual)
Usted repaso el diseño de Custom Hardware utilizando PIOs, ahora la pregunta es ¿Puedo mejorar el rendimiento, los tiempos de velocidad entre mi periférico y el procesador Nios II? y la respuesta es sí. No es lo mismo tener un periférico o un hardware que funcione comunicandose por medio de PIOs a un sistema que este conectado directamente a la arquitectura del procesador a su bus de datos y dirección principales, si usted lo piensa un periferico conectado y controlado por medio de PIOs no es lo mas efectivo ya que el intercambio de información entre la CPU y el periférico se hace por medio del componente PIO... lo que hace que la información no viaje a máxima velocidad, lo que implica que existan retardos y demoras que al fin de cuentas dependiendo del diseño podría ser vitales para el sistema.
Se puede agregar un modulo que haga algún algoritmo deseado (una division, algun filtro un fractal) a la arquitectura del sistema Nios y conectarlo directamente al bus de interconexión llamado Avalon. En la siguiente figura(Cortesía de Pong P. Chu) se puede ver el bloque conceptual de la interconexion Avalon por la cual se comunican el procesador Nios II y los demás periféricos del sistema
Este bus de Avalon es simplemente un arreglo de multiplexores y arbitros encargados de llevar/traer la información desde cada uno de los periféricos, utilizando direccionamiento para conocer con cual de ellos se entablara una comunicación, a continuación se puede observar en detalle esta estructura(Cortesía de Pong P. Chu).
En esta estructura se puede ver de cerca que Avalon esta compuesto por:
Avalon Memory Mapped Interface (Avalon MM): Este define la dirección que conecta Maestro(Avalon MM Master) y Esclavo(Avalon MM Slave), esto con el fin de identificar cada uno de de los periféricos(Slaves) del sistema.
Para verlo mas claro, ¿recuerda cuando estaba haciendo la descripción del sistema Nios y hacia la conexión entre la CPU y cada uno de los componentes del sistema? bueno usted conectada Master con Slave, ya sea por medio del bus de datos o el bus de instrucciones, pero siempre era Master->Slave.
Nota: un periférico puede ser Master de otro.
Avalon Streaming Interface(Avalon-ST): Esta interfaz esta dedicada a la transferencia de datos unidireccional entre dos componentes Avalon ST Source y Avalon ST Sink de forma continua.
En el caso de la conexión ethernet que se ve en la figura, toda la información que el envía o recibe provienen de otros periféricos llamados DMA(Direct Memory Access) con el fin de escribir en memoria RAM sin tener que esperar que el procesador le pida información ya que esta se podría perder.
Avalon Memory Mappend Tristate Slave Interface: Esta es una interfaz especial de Avalon MM Slave y es usada para manejar buses tristate y perifericos.
Avalon Clock: Esta interfaz define las señales de reset y clock que son usadas por cada elemento en el sistema.
Avalon Interrupt: Esta interfaz permite a los componentes esclavos o periféricos enviar al a los componentes master una señal de evento cada vez que se necesite, una vez la envía al master este la procesa y la acepta liberando la interrupcion generada por el componente esclavo.
Avalon Conduit: Estas son las señales que se conectan fuera del sistema o de la instanciación.
Viendo mas de cerca la conexión entre el periférico y el bus Avalon usted puede observar las siguientes figuras, en las cuales se muestra en detalle las interconexiones que hay al momento de unir un periférico al Nios II.
Como se ve en las gráficas anteriores, existen unos buses específicos que deben ser unidos por medio de decodificadores al periférico el cual va a ser controlado por el Nios II, estos son(Avalon MM slave interface signals):
read(read_n): este bit se pone en 1 en el momento que el master quiera pedir datos del slave, en el caso de ser read_n el bit se debe setear en 0 para hacerlo.
write(write_n): este bit se pone en 1 en el momento que el master quiera escribir datos al slave
Address: Es usado para especificar un offset en el espacio de direcciones del periferico slave entre los rangos de 1 y 32 bits.
readdata: son los datos que provienen del slave después de read, el ancho puede ser de 8, 16, 32, 64, 128, 256, 512 o 1024.
writedata: es el dato que va a ser escrito al slave despues de write, y el ancho puede ser igual o similar que read.
byteenable(byteenable_n): Especifica el tamaño de bytes que se quieren escribir durante la transferencia de datos, por ejemplo, si se tienen 4-bits para byteenable esta señal es capas de manejar 32 bits o 4 Bytes, cuando esta señal se ponga en 4'b1111 quiere decir que se transfiere datos de 32 bits, si la señal esta en 4'b0011 quiere decir que se quiere enviar o escribir los dos primeros Bytes menos significativos.
chipselect: le indica al slave que fue seleccionado o esta siendo habilitado por el Nios II.
Ya casi vera practico el concepto con un ejemplo, pero antes es importante conocer los tiempos o el timing que debe tener en cuenta el Master con respecto al Slave, para leer o escribir información(Avalon MM slave interface properties).
timingUnits: Especifica las unidades de tiempo en las cuales se quiere trabajar o ciclos de reloj.
readWaitTime: Controla el tiempo o los ciclos que deben esperarse para hacer una lectura correcta, en el caso de ser un periferico lento, este tiempo sera de varias esperas o ciclos de reloj.
writeWaitTime: Al igual que el de lectura, controla el tiempo que se tarda en escribir información el periférico slave.
setupTime: Especifica un intervalo de tiempo entre el momento que se activa address con respecto a read y write.
holdTime: Especifica un intervalo de tiempo entre el momento que se desactiva address con respecto a read y write.
readLatency: Especifica un intervalo de tiempo después de que se activa read.
Para mas detalle de lo que hacen estas señales usted puede ver las siguientes gráficas:
Parte 2 (Parte práctica de la primera parte).
Para esta practica usted puede usar la DE2-115 o a DE0-NANO como herramienta de trabajo:
Plantilla para la DE2-115.
Plantila para la DE0-NANO.
Decomprima la plantilla en una ruta cercana a la Raiz y sin espacios.
Lo que se quiere lograr en esta primera parte es incluir el modulo de division de frecuencia utilizado en clase para crear un timer reconfigurable que active una interrupción cada cierto tiempo(Modulo FreqGen).
Al modulo de FreqGen, se agregaron las señales de reset, y start.
Reset: Resetea el modulo.
Start: habilita el modulo.
clock: Reloj.
div_in[31:0]: Entrada del divisor de frecuencia de 32 bits, para el conteo interno y su comparador.
tick: Salida de reloj, dividida en frecuencia en base del reloj de entrada clock.
counter[31:0]: Conteo actual interno.
Cree un archivo Verilog que usted llamara "timer_ece31289upb.v", en este archivo se explicara en detalle la union del modulo FreqGen con el Avalon del Nios II.
Copie lo siguiente y analicelo:
Guarde el Archivo generado en la carpeta Modules, junto con los archivos "freqGen.v y async_trap_and_reset.v".
Abra la plantilla, seleccione Qsys, y abra la descripción Nios que e encuentra predeterminada.
Para crear el componente avalon seleccione New->New_Component y modifique la ventana que aparece para que quede de la siguiente manera:
Ahora oprima el boton Finish, y antes de guardar cambios.
En la parte del navegador de Qsys vera un nuevo componente llamado "ece31289upb", agreguelo a la descripción de sistema Qsys.
Nota: Este seguro que el clock lo conecta al mismo clock al cual va conectada la CPU. Ademas verifique que la IRQ esta conectada y es de orden 4. De Igual modo verifique que el timer esta conectado al Master de la CPU.
Ahora Genere el proyecto Qsys.
Una vez Generado, modifique la plantilla para que quede algo similar a esto.
assign LEDR[17:0]= data_d[31:14]; ==> agregue esta linea si maneja la DE2-115
assign LED[7:0]= data_d[31:24]; ==> agregue esta linea si maneja la DE0-NANO
Ahora abra el Nios II Sofware build tools y cree un proyecto vacio, en base a la descripción de hw que hizo con el Qsys.
Cree un archivo source C, y llamelo main.c, en el copie lo siguiente y analicelo.
Ahora compile el proyecto Nios II, y descargue el .sof sobre la FPGA y luego programe el .elf sobre el Nios II y analice lo que sucede respecto al codigo en C escrito.
for more visit: www.fpgalover.com
If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.