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 parapadeando con VHDL, ¡resuelto!
De cualquier forma, he aquí el código fuente:
Descargar código
Deja un comentario