Si en un lenguaje de programacion cualquiera el primer programa que hacemos siempre es un Hola Mundo, cuando tenemos una nueva FPGA lo primero que hacemos siempre para comprobar que funciona es hacer parpadear un led. Es nuestro hola mundo y la forma de comprobar que nuestra placa funciona y podemos programarla.

En ese minitutorial vamos a ver como crear un diseño que haga parpadear un led, vamos a trabajar a nivel de código fuente, sin una FPGA concreta en mente. Si quereis ver como encender un led pulsando un botón para una placa concreta os recomiendo este otro tutorial sobre iniciación a la FPGA de bajo coste de Altera.

Manos a la obra. Supongamos que hemos recibido una placa nueva y queremos comprobar si somos capaces de programarla y ver si arranca correctamente antes de ponernos a diseñar cosas mas complicada. Yo al menos lo que hago siempre y otra mucha gente también, es encender un led. Es el equivalente a empezar a programar y compilar tu primer programa para ver si eres capaz de utilizar el compilador y generar ejecutables.

Primeras comprobaciones antes de empezar

Antes de escribir nuestro código tenemos que comprobar varias cosas:

  • Cuál es el pin del reloj y a que frecuencia trabaja.
  • Cuál es el pin de reset de la placa y su polaridad. El botón de reset al pulsarse nos da un cero o un uno.
  • Pin asociado al led de salida y polaridad del pin. Depende de cómo estén conectados los pines de salida a veces se activan al poner un uno o un cero.

Para comprobar estas cosas tendremos que echar un vistazo al manual de la placa o en su defecto a los esquemáticos para poder comprobar las conexiones y ver las polaridades. Es muy típico programar la FPGA y que no haga nada porque el reset esta activo siempre. En ese caso deja pulsado el reset, si funciona mientras le tienes pulsado es que le has conectado al reves.

VHDL para hacer parpadear un LED cada segundo

El código para hacer parpadear un led cada segundo es sencillo. Lo primero que necesitamos es un contador. En este enlace sobre contadores os dejo un tutorial que hicimos hace tiempo sobre contadores en VHDL.

La idea es sencilla, vamos a tener un registro LED_r reseteado a cero y cada vez que en contador cuente un segundo vamos a negarle. La salida de nuestro led, LED_o será nuestro LED parpadeante.

Dos cosas a tener en cuenta en el código. La primera, hace falta un registro, no podéis negar directamente la salida LED_o. Si hacéis un LED_o<=not(LED_o) el simulador os va a dar un error de que no se pueden leer puertos de salida. Algún iluminado lo definirá como puerto inout. Nunca, jamas uséis puertos inout salvo para describir bufferes triestado y solo en el fichero top de la jerarquía. La forma correcta es trabajar con un registro intermedio.

La segunda es cómo contar 1 segundo en la FPGA. Habrá que contar los ciclos de reloj que haya en 1 segundo teniendo en cuenta la velocidad de nuestro reloj. Si el reloj es de 100Mhz, en 1 segundo tendremos 100 millones de ciclos. Recordad que la frecuencia es cuantas veces cambia la señal en un segundo.

Con todo esto en mente ya podemos escribir nuestro código:

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

entity LED_parpadea is
port(
    clk : in std_logic;
    reset : in std_logic;
    LED_o : out std_logic
);
end entity;

architecture rtl of LED_parpadea is
    signal cuenta : integer range 0 to 100000000;
    signal LED_r : std_logic;
begin
    --Asignamos el registro a la salida
    LED_o <= LED_r;

    process(clk,reset)
    begin
        if (reset='1') then
            cuenta <= 0;
            LED_r <= '0';
        elsif(rising_edge(clk)) then    
            if(cuenta=100000000) then
                cuenta <= 0;
                LED_r_o <= not(LED_r);
            else    
                cuenta <= cuenta + 1;
            end if;    
        end if;
    end process;  
end architecture;

Sintesis y programación

Una vez que tengamos el código el siguiente paso es crear nuestro fichero de restricciones para la placa que estemos utilizando. En él tenemos que definir a que pines de la FPGA corresponden nuestros pines del diseño. Es decir el pin LED_o va al pin XXX de la FPGA. Dependiendo de con que fabricante de FPGA trabajemos (Xilinx, Inte, Lattice, …) el formato de este fichero será diferente.

Es muy habitual que el fabricante de la placa que uséis haya creado ya un fichero con la localización de todos los pines. Descargadlo y utilizadlo como referencia.

Con eso ya podéis generar vuestro bitstream, y programar la placa. Si todo ha ido bien veréis parpadear vuestro led y podréis comenzar a probar diseños mas complicados.