VHDL

Un LED parpadeando, en VHDL

Me he dado cuenta que hemos hecho muchas cosas, pero nunca el “Hola Mundo” de electrónica digital.

Ya saben, el clásico “un led que parpadea”.

¡El día de hoy remediaremos ese error!

(Porque, carajo, cualquier ingeniero que se respete debe poder prender y apagar un LED)

La demostración en video

Sí, sí, ¿qué puede ir mal en prender y apagar un LED periodicamente?

No obstante, aquí la demostración inequívoca de que se logró el objetivo:

Después de éso, ¿aún necesitan más explicaciones?

El código

Bueno, puede que así sea, así que veámoslo con más detalle.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity led_parpadea is
    PORT (
        clk   : IN  STD_LOGIC;
        reset : IN  STD_LOGIC;
        salida: OUT STD_LOGIC
    );
end led_parpadea;

architecture Behavioral of led_parpadea is
    signal clk2Hz_s : STD_LOGIC := '0';
    signal salida_s : STD_LOGIC := '0';
begin
    clk2Hz_i: entity work.clk2Hz PORT MAP(
        clk => clk,
        reset => reset,
        clk_out => clk2Hz_s
    );

    proceso_parpadea: process(clk2Hz_s, reset) begin
        if reset = '1' then
            salida_s <= '0';
        else
            if rising_edge(clk2Hz_s) then
                salida_s <= NOT salida_s;
            end if;
        end if;
    end process;

    salida <= salida_s;
end Behavioral;

Para este módulo utilizamos un divisor de frecuencia de 50MHz a 2Hz.

¿Por qué?

Necesitamos que el LED se prenda y se apague a una frecuencia que podamos ver.

No queremos que se apague y se prenda 500 veces por segundo porque para todo efecto práctico, siempre está prendido.

Y un cambio cada año implica que no cambia.

(Además de que hay casos de personas sensibles a las que les da epilepsia por ver LEDs parpadeando)

(Espero que mi sarcasmo no se entienda como una verdad médica)

En fin, éso explica la presencia de las líneas 13 y de la 16 a la 20.

Si necesitan más información sobre PORT MAP, ya hay una entrada al respecto.

El proceso de parpadeo

Depende de a quién le pregunten, unos dicen que tal parpadeo puede ser considerado efecto estroboscópico.

Puede que sea así, puede que no.

De cualquier forma, cuando decimos “el parpadeo” nos referimos a “la conmutación periódica de una señal conectada a una fuente luminosa cuyo efecto final es una interrupción visual”.

O sea: prendemos y apagamos el led cada cierto tiempo predefinido.

El proceso que hace ese rollo en VHDL es el siguiente:

proceso_parpadea: process(clk2Hz_s, reset) begin
    if reset = '1' then
        salida_s <= '0';
    else
        if rising_edge(clk2Hz_s) then
            salida_s <= NOT salida_s;
        end if;
    end if;
end process;

En el listado 2 podemos ver que el proceso tiene dos entradas, clk2Hz_s y reset, los cuales sirven para:

  • el reloj de 2 Hz determina cada cuánto tiempo se cambia el estado de encendido a apagado (líneas 5 a 7), y
  • el reset sirve para poner la condición inicial (línea 3 y 4)

La línea 6 es la clave de todo: una simple compuerta NOT para conmutar el estado.

Claro, protegida por la detección del flanco de subida del reloj de 2Hz (de la línea 5).

Y… ya.

Misterio de LED parpadeando con VHDL, ¡resuelto!

You Might Also Like

No hay comentarios

Deja tu comentario