miércoles, 30 de enero de 2013

Contador binario de 4 bits Esquemático-VHDL con FPGA Spartan 3E

Ejercicio: Utilizando 4 leds disponibles en la tarjeta Digilent Spartan 3E visualizar un contador binario ascendente de 4 bits, que disponga  de entrada de habilitación manejada mediante un interruptor.

Solución:  En el navegador del Xilinx ISE 10.1 creamos nuevo proyecto: Cont0al15, y designamos Esquemático como jerarquía superior de trabajo.



Luego debe elaborar el program VHDL del contador, guardarlo  y chequear sintaxis para  asegurarnos  que no tiene errores.



Simulamos el contador, cambiando la fuente de implementación a simulación, y creando archivo de chequeo de  formas de onda:


Verificamos que efectivamente el contador trabaja como se desea, y efectuamos la síntexis del mismo.

Luego en Implementación como fuente, Utilidades de diseño, creamos el símbolo esquemático del contador, para ser utilizado posteriormente.

En una entrada anterior de este blog (encendido y apagado de un led con Spartan 3E) copiamos, pegamos, chequeamos sintaxis del archivo Clk1hz el cual requerimos para acoplarlo al contador.


Generamos también su símbolo esquemático después de haber efectuado su síntesis. Para este programa VHDL no efectuamos simulación, pues ya se probó que funciona correctamente en la tarjeta de Spartan.

Luego creamos como nueva fuente para la FPGA xc3s500e  un archivo en esquemático que llamamos final para enlazar  los dos símbolos esquemáticos: el contador y Clk1hz.


Vamos al Editor Gráfico, y por medio del filtro de símbolos ( Symbol Name Filter ) llamamos los dos símbolos esquemáticos para poderlos enlazar:


Procedemos ahora a etiquetear las entradas y el bus de salida.


Salvamos este archivo final. 

En Implementación se puede observar la jerarquía en el diseño del proyecto.


Procedemos entonces a la asignación de pines post-síntesis del archivo esquemático final:



Asignamos los pines en la ventana de  Xilinx PACE  para generar el archivo final.ucf    y   programar la FPGA:


Salvamos el archivo final.ucf  y cerramos el editor  PACE (Pinout and Area Constrints Editor)  de asignación de pines  del  Xilinx  ISE (Integrated Software Environment), versión  10.1.

Damos ahora doble click en Implement Design que aparece con un interrogante color naranja, para corregir inconsistencias en el diseño y se puedan aceptar los pines asignados.


Luego generamos el archivo de programación y configuramos la FPGA en la tarjeta Digilent Spartan 3E.

Obviamente se requiere que la tarjeta esté alimentada y el cable USB esté conectado al computador, que es  por donde se efectúa su programación JTAG ( Joint Test Action Group )



Damos Bypass para que no se programe ni  la CPLD ni la PROM, y sobre la FPGA con el botón derecho damos click en program asignando el archivo final.bit 




Cuando aparece el aviso de que la programación se ha efectuado exitosamente, podemos luego verificar que si habilitamos el contador colocando el interruptor a Vcc (Reset = 1) los Leds visualizan el conteo del 0 al 15 repetitivamente con una frecuencia de 1 Hz. 

Si el interruptor que actúa como Reset se coloca en nivel bajo se bloque el conteo en el estado que se encuentre el contador, debido a que se suspende el paso de pulsos de reloj de 50 Mhz debido a que pulsos toma el valor de Cero en el archivo VHDL de Clk1hz.

Veamos un video con nuestro proyecto: Contador binario ascendente de 4 bits con entrada de habilitación:




lunes, 28 de enero de 2013

Intermitencia de encendido y apagado de LED en Spartan 3E con VHDL

Ejercicio: Un Led disponible en la tarjeta Digilent Spartan-3E debe parpadear cada segundo.

Solución:

La tarjeta Digilent Spartan-3E dispone de un reloj a cristal de 50 Mhz, y el Led hay que hacerlo encender y apagar con una frecuencia de 1 Hz, de tal manera que lo primero requerido es un divisor de frecuencia.

El divisor de frecuencia es un componente para reducir la frecuencia de entrada. Éste se implementa con ayuda de una Escala  y un contador, donde la Escala  es la relación o división entre la frecuencia de entrada y la frecuencia de salida deseada: 

Escala = \frac{f_{entrada}}{f_{deseada}}  


Recordemos que la frecuencia y el periodo de la señal son inversamente proporcionales, tal como se observa en las ondas mostradas, las cuales corresponden a un contador binario ascendente de 3 bits.

Como el contador cuenta del 0 al 7 (modo 8) al dividir la señal de entrada (50 Mhz) por 8 nos dá 6.25 Mhz, en el bit más significativo del contador.

Como el cristal tiene una frecuencia de 50MHz ( frecuencia de entrada) y deseamos una salida de  1 Hz, tenemos que:
Escala = 50 Mhz / 1Hz = 50 000 000 

Si el reloj tiene el mismo tiempo en alto que en bajo:

t_{alto} = t_{bajo} = \frac{50 000 000}{2} = 25 000 000

SI empezamos el conteo desde cero, y  un contador al llegar a  24 999 999 genera un pulso, esto quiere decir que la frecuencia de salida , de los pulsos generados,  debe ser de 1 Hz.

Veamos el programa en VHDL:


--Divisor de frecuencia de 50MHz a 1Hz para parpadeo de LED
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 entity clk1Hz is
    Port (
        clk50Mhz: in  STD_LOGIC;
        reset   : in  STD_LOGIC;
        led     : out STD_LOGIC
    );
end clk1Hz;

architecture Behavioral of clk1Hz is
    signal pulso: STD_LOGIC;
    signal contador: integer range 0 to 24999999 := 0;
begin
    divisor_frecuencia: process (reset, clk50Mhz) begin
        if (reset = '0') then
            pulso <= '0';
            contador <= 0;
        elsif rising_edge(clk50Mhz) then
            if (contador = 24999999) then
                pulso <= NOT(pulso);
                contador <= 0;
            else
                contador <= contador+1;
            end if;
        end if;
    end process;
     led  <= pulso;
end Behavioral;


El contador dispone de una entrada de reset que se activa con nivel bajo, es decir si reset = 0, sin importar el flanco del reloj el contador se resetea. 
La primera vez que el contador llega al 24999999, la señal interna pulso pasa del nivel bajo a nivel alto, el contador pasa a 0, y vuelve a comenzar a contar, mientras la entrada reset sea alta, y al volver a llegar a  

24999999,pulso pasa ahora de 1 a 0, completando un pulso completo, o sea un periodo de reloj; 

de esta forma la salida es de solo 1 Hz.


¡ Cada 50 millones de pulsos a la entrada se produce 1 pulso a la salida !

Con captura esquemática es imposible lograr esto; en cambio con lenguaje VHDL se hace de una
forma muy sencilla. Por eso VHDL se impone cada día mas, como lenguaje para describir hardware y efectuar en forma simple y práctica el diseño digital, pero se requiere, por ejemplo, de una FPGA 
donde el programa se pueda aplicar e implementar.


Con el navegador de proyectos de Xilinx ISE 10.1  creamos como nuevo proyecto: LedParpadeo, y como nueva fuente en Módulo VHDL: clk1Hz. 

Copiamos y pegamos el programa ya visto, salvamos y chequeamos sintaxis

Para este caso no es necesario efectuar la simulación.

Procedemos a elaborar la síntesis y la asignación de pines.



Verificamos en Pinout Report que los pines quedaron bien asignados, 

implementamos el diseño y generamos el archivo de programación, para

configurar el dispositivo.

jueves, 24 de enero de 2013

Detector de números primos del 0 al 15 con VHDL en tarjeta FPGA Spartan 3E

EJERCICIO:  Utilizando los 4 interruptores disponibles en la tarjeta Digilent Spartan 3E se introducen en 4 bits los números del 0 al 15. Un Led debe encender al detectar que el número sea primo (divisible por si mismo y por la unidad únicamente), es decir el Led sólo debe encender si detecta: 2,3,5,7,11 y 13.  

Solución:

Creamos un nuevo proyecto en ISE 10.1 que llamamos Primos0al15 que se guarda en una carpeta con el mismo nombre creada por defecto por el programa e indicamos que vamos a trabajar con lenguaje VHDL
como nivel superior de jerarquía en el diseño ( Top-level souce type). Observe que previamente nosotros hemos creado en la raiz la carpeta: Ejercicios Xilinx.


Indicamos después las propiedades del dispositivo:


Después de haber finalizado la creación del nuevo proyecto, creamos como nueva fuente el módulo VHDL para ingresar el archivo de VHDL que tambien llamamos: Primos0al15


Ingresamos las entradas y salidas del circuito lógico:


Se puede elaborar Mapa de karnaugh para encontrar la función Booleana en Suma de Productos (mintérminos). Podemos ayudarnos del LOGICA ID:


Vamos a trabajar con la segunda función.

En la plantilla que aparece escribimos la función al comienzo de la arquitectura  tal como se muestra a continuación:


Después de haber salvado este archivo es importante chequear su sintaxis para determinar algún posible error al respecto:


Luego procedemos a efectuar la simulación, para lo cual debemos crear inicialmente un banco de pruebas de formas de onda. El archivo lo denominamos: Primos0al15_tb tal como se muestra en el siguiente gráfico:


Al indicar que el circuito es Combinatorio (sin reloj) se puede fijar un tiempo de análisis de 2000 ns:


luego dibujamos las ondas correspondientes a las entradas, salvamos este archivo y cerramos la ventana:


Procedemos a ejecutar la simulación:


Las ondas deben confirmar que el circuito funciona perfectamente:


Procedemos a la asignación de pines y a efectuar la síntesis del circuito y a su implementación:


En este proceso el programa toma cierto tiempo y va colocando un visto bueno en cada etapa realizada. Se da YES a la ventana que aparece con el fin de crear el archivo UCF de asignación de pines:


Vamos a asignar las entradas en los pines correspondientes a los interruptores:

La salida se va a observar en el Led0 correspondiente al pin F12 de la tarjeta Digilent Spartan 3E:


Procedemos a señalar la localización de los pines:


Hay que cerrar el gráfico inicial que aparece a la derecha para que aparezca el Top Wiew (vista desde arriba) mostrado, en donde se señala con un óvalo de color azul la entrada y salida localizada. El archivo UCF de asignación de pines debe salvarse.

Si aparece en amarillo alguna interrogación hay que dar doble click para corregir la incongruencia en la implementación del diseño:


Al corregirse las incongruencias deben aparecer vistos buenos  en donde aparecían los interrogantes:


Si observamos en el resúmen del diseño ( View Design Summary)  en Pin Report dando click en la columna de Signal Name deben aparecer los pines correctamente asignados.


Como los pines aparecen reportados con error hay que volver a localizarlos dando doble click en Floorplan Area/ IO/ Logic Post -synthesis. Es probable que el archivo UCF, por ejemplo, no se hubiese guardado.

Vuelve entonces a aparecer los interrogantes anaranjados en Implement Design, damos doble click para corregir incongruencias, y al observar el reporte de pines, vemos que ahora si aparecen correctamente localizados en los correspondientes a los interruptores y al Led.


Alimentamos la tarjeta y conectamos el cable USB al computador para ser reconocida, y procedemos a efectuar la programación, dando doble click en  Configure Target Device:


Hay que dar OK en la advertencia que se presenta:


Luego aparece una ventana donde se indica que se ha detectado cable para efectuar la programación automáticamente Vía JTAG ( serialmente a través de 4 líneas por USB)


 Damos finish y asociamos el archivo Primos0al15.bit a la programación de la FPGA



Al abrir el archivo (open ) pasa de la FPGA al CPLD y luego a la memoria PROM. Hay que darles bypass
para ser omitidos.

Luego se dá OK a la ventana de las propiedades de programación del dispositivo, y con botón derecho se dá click en  program.   Debe aparecer una ventana indicando que la programación de la FPGA ha sido exitosa.


Finalmente se verifica al accionar los interruptores y observar el encendido del Led que todo funciona correctamente.


En la fotografía se observa, por ejemplo,  que el LED enciende al detectar en los interruptores el número 11 ( 1011 ).