sexta-feira, 9 de maio de 2014

Ejemplo 4 : Push Button ( Debouncing )

El problema de usar los Push Buttons es el efecto rebote:

Al accionar el Push Button puede ocurrir muchos rebotes los cuales no queremos en nuestro diseño.

Por esto se realizo un algoritmo para eliminar este efecto.

Agreguen estos archivos a su proyecto.

Archivos .vhd

Cada programa tiene un codigo HDL que se obtiene dando doble click derecho sobre "View HDL Instantiation Template", que sirve para usarlo en cualquier otro programa, por ejemplo para el programa "debounce.vhd" el codigo HDL fue el siguiente :



Ahora el programa "debounce.vhd" será usado 2 veces en nuestro nuevo programa, porque queremos hacer debouncing a 2 botones que usaremos, el boton 0 será para desplazar los leds 1 espacio hacia la izquierda y el boton 1 será para desplazar 1 espacio hacia la derecha.

Todo el codigo COMPONENT copiarlo entre Architecture y begin (donde van las señales).
El codigo Port copiarlo en el cuerpo de nuestro programa, asi como esta acontinuación.


El codigo para rotar el led es el siguiente:


Si es apretado el Boton Up, entonces los leds serán rotados hacia la izquierda, si es apretado el Boton Left serán rotados hacia la derecha, si es apretado el boton central , reseteará el valor del led a "00000001".

Modifiquen el programa como ustedes deseen.

quinta-feira, 8 de maio de 2014

Ejemplo 3 : Uso de numeros con punto flotante (float)

Para usar numeros con punto flotante, usaremos una libreria creada por David Bishop, el link sigue a continuación:

http://www.vhdl.org/fphdl/Float_ug.pdf

Vamos a explicar el funcionamiendo de ese algoritmo.

Segun el padrón IEEE 754, existe unas reglas para representar numeros de punto flotante en bits.

SignoExponenteMantiza

Ejemplo1: Representar el valor de 1/3 usando 15 bits con signo.
La variable será almacenada en un vector como sigue:


Aplicando la formula de conversion para float será
Como vemos esta representación de bits del numero 1/3 es la correcta porque en el link de arriba se equivocaron de valor.

Ejemplo2: Representar el valor de 1/2 usando 15 bits con signo.

A simple vista para "n" igual a zero, "m" debe ser 14.

Si "n" es igual a zero entonces la mantiza debe ser : 0000000000

Si "m" es igual a 14 entonces exponente debe ser : 01110

Como es positivo el bit de signo es : 0

Contruyendo el vector  (5 downto -10) = [ 0 ] [ 01110 ] [ 0000000000 ]  = 0011100000000000

Usando programación VHDL para sumar dos numeros punto flotante

Como estaba en el link de arriba, descarguen la libreria de punto flotante de: 


Adicionar los archivos a la carpeta de su programa para que pueda reconocer el "package".

El siguiente programa suma los valores de 1/2  e 1/3



La simulacion sería : 


En la simulacion el resultado de la suma seria : 0011101010101010

Y sería correcto porque :




domingo, 24 de novembro de 2013

Ejemplo 2 : Cargar nuestro programa al FPGA Spartan 6

En este ejemplo se explicaran los pasos necesarios para cargar nuestro programa al FPGA Spartan 6 (Nexys 3)

Paso 1: Creamos un nuevo proyecto usando las especificaciones para nuestro Spartan6

Family: Spartan6
Device: XC6SLX16
Package: CSG324
Speed: -2

Preferred Language: VHDL


Paso 2: Nuestro programa será el que creamos en "Ejemplo 1".

Paso 3: Creamos nuestro archivo con extencion ".ucf ", para esto necesitamos compilar nuestro programa haciendo doble click sobre "Synthesize- XST" y si no hay errores hacer doble click sobre el icono "Floorplan Area/IO/Logic (PlanAhead)", será creado nuestro archivo en blanco "test.ucf".


Paso 4: Se abrira una nueva ventana llamada PlanAhead, pero para nuestro ejemplo no la vamos a usar.
Modificamos nuestro archivo creado "test.ucf" dandole doble click y digitamos los siguientes valores en él.

Los valores son para designar a "CLK", "Led" y "SW" los valores perifericos del FPGA Spartan 6 que tenemos, para saber los demas perifericos entrar en el siguiente link.

https://github.com/Samuirai/fpga/blob/master/Nexys3_Master.ucf

Paso 5: Perifericos del FPGA Spartan 6 (Nexys 3)

Se puede observar la cantidad de perifericos de esta placa, para nuestro caso usaremos los que estan con rectangulos rojos. No aparece el clock porque es interno, pero su direccion es V10 con una velocidad de 100MHz

Aqui está mas detallado los perifericos(IO) que usaremos

Paso 6: Luego hacer doble click sobre el icono "Generate Programming File" para generar nuestro archivo con extencion ".bit" que es el que tenemos que cargar al FPGA, es como una extencion .hex en el caso de los PIC's. Si no hay ningun error se deben activar los 3 checks verdes como son mostrados a continuacion


Puede ser que existan unos "warnings" en otros proyectos que vamos a realizar, eso es normal, lo que no deben existir son los errores que tienen simbolos de "X" rojos.

Paso 7: Luego expandimos la opción "Configure Target Device" y damos doble click en "Manage Configuration Project (iMPACT)"



Paso 8: Se abrirá la siguiente ventana


Paso 9: Creamos un nuevo proyecto en FILE-> NEW PROJECT, aparecerá la siguiente ventana


 La dejamos como está en la figura y damos "ok", se abriran algunas ventanas preguntando por si tenemos algunos archivos, solo las cerramos. Asegurense de tener el FPGA encendido y conectado a su computador.

Paso 10: La ventana debe estar como sigue



Paso 11: Hacemos doble click sobre el chip Xilinx de color gris, nos pedirá por el archivo con extencion ".bit" de nuestro proyecto, en este caso es "test.bit", lo seleccionamos y le damos click en abrir.




Paso 12: Se abrira una ventana en el cual tenemos que seleccionar la opcion "No"


Paso 13: Luego damos click derecho sobre el chip y seleccionamos la opcion "Program"


Paso 14:  Se abrira la siguiente ventana, escogemos la opcion " Cancel "



Paso 15:  Con esto ya tendriamos programado nuestro FPGA


Paso 16: A continuación se muestra el FPGA con el programa cargado

Para SW = "10101010"


Para SW = "11111111"



Para SW = "11110000"



Para SW = "00110011"


Ejemplo 1 : Crear un proyecto en Xilinx ISE 14.6

El primer ejemplo que realizaremos será de crear  una aplicacion de encender 8 leds con el uso de un dipswitch(8 pines).

Paso 1: Crear un nuevo proyecto, esta ubicado en la parte izquierda del programa
             (FILE->New Project), nuestro proyecto se llamará "Encender_leds"



Paso 2: Vamos a programar una FPGA Spartan 6(Nexys3) y por eso tenemos que dejar la siguiente ventana como sigue, estas configuraciones son para seleccionar que tipo de FPGA es y para seleccionar el tipo de programacion, existen 2 tipos, Verilog y VHDL en este Blog usaremos la programacion VHDL para todos los proyectos.


Paso 3: Despues será mostrado la siguiente ventana


Paso 4: Con esto estará creado nuestro proyecto usando una arquitectura Spartan 6




Paso 5: Ahora hacemos click en Project->New Source, y seleccionamos la opción VHDL Module, el nombre de nuestro programa será "test" y tendra la extención vhd.




Paso 6: Creamos las variables que vamos a usar, "clk" es la variable para el clock del FPGA y es de tipo entrada(in), "led" serán los 8 leds que tenemos que encender y es tipo salida (out), y "sw" es el dipswitch de 8 pines y será tipo entrada(in), para las variables led y sw necesitamos darle check en el cuadrado de la opcion Bus para almacenar 8 bits en cada uno de ellos.



Paso 7: Con esto estara creado nuestro archivo "test.vhd" para programar en VHDL. 


Paso 8: Luego nuestro programa estara  con declaracion de las variables, falta adicionar un proceso que pase los datos de "SW" a la variable "LED". Cuando programamos en VHDL las mayusculas y minusculas son lo mismo, todo lo contrario que cuando programamos en C.


Paso 9: Modificamos nuestro programa adicionando un proceso(mas adelante será explicado) para hacer que en cada cambio de 0 a 1 del clock el valor de "sw" pase al valor de "led".
Damos doble click sobre "Synthesize-XST" que esta en la parte izquierda, esa es la forma de compilar en VHDL. Si todo está correcto aparecerá el siguiente mensaje en la parte inferior:

 Process "Synthesize-XST" completed successfully



Paso 10: Para simular nuestro proyecto, seleccionamos la opcion "Simulation", damos click sobre nuestro programa y luego en la parte inferior damos doble click sobre "Simulate Behavioral  Model"



Paso 11: Se abrirá una nueva ventana en la cual podemos observar las variables que acabamos de crear, las simulaciones que vamos hacer serán con un clock = 1us, para poder observar esto tendremos que ajustar nuestra ventana de simulación seleccionando el siguiente boton:


Paso 12: Realizamos varios click en la lupa con simbolo menos en su interior para ajustar espacios de 1 us


Paso 13: Ahora llegó el proceso de simulacion, damos click derecho sobre el valor de "clk" y escogemos la opcion "Force Clock" es para simular un clock.



Paso 14: Dejamos los parametros como sigue


Paso 15: Hacemos click derecho sobre el valor de "sw" y escogemos la opcion "Force Constant", es atribuir un valor constante a "sw"


Paso 16: Colocamos el valor de "11110000" para "sw"


Paso 17: Ahora simulamos por 1us 


Paso 18: Moviendo la barra vertical amarilla, podemos obtener los valores de cada variable en cada instante de tiempo.


Paso 19: Expandiendo los valores de "sw[7:0]" y "led[7:0]"  podemos ver bit por bit como varian en cada instante de tiempo.


Paso 20: Por ultimo podemos ver la arquitectura de nuestro programa haciendo doble click sobre "View RTL Schematic", es observado que nuestra arquitectura es formado por un flip flop tipo D para cada bit.