Destellar LED's en la EP2C5
Fig1. Placa EP2C5 (FPGA) |
En esta entrada del blog, implementaremos en la placa EP2C5 nuestro primer circuito digital utilizando el lenguaje de descripción Verilog. Doy por entendido que ya contamos con los conocimientos acerca de los que son las FPGA y el manejo de lenguajes descriptivos, mas propiamente Verilog. Así mismo deberás tener instalado el software de diseño Quartus, un programador USB-Blaster y la placa EP2C5, en mi ciudad Santa Cruz - Bolivia lo puedes conseguir en la tienda SAWERS, donde tambien encontraras otros modelos menos anticuado que una Cyclone II que es la que utilizaremos en este ejemplo, recuerda que puedes adquirir cualquiera siempre que sea de la marca Altera.
En una entrada anterior de mi blog resumo como introducción algunos datos adicionales acerca de la tarjeta EP2C5 y lo que necesitas para crear tus circuitos digitales. Te recomiendo le des una mirada haciendo click al siguiente enlace: Tarjeta EP2C5T
Descripción del circuito
Crearemos un circuito digital para destellar un diodo led a una frecuencia de 1Hz, para lo cual utilizaremos los siguientes elementos que ya posee la tarjeta EP2C5:
- Diodo led conectado al pin3;
- Oscilador conectado al pin17;
- Pulsador conectado al pin144.
Adoptaremos en todos nuestros ejemplos el modelo basado en una maquina de estados finito FSM. Si bien destellar un led es una tarea simple para adoptar este modelo, la finalidad de hacerlo es familiarizarnos con la estructura que tendrá el código y así facilitar la adopción a situaciones mas complejas.
A continuación se muestra el diagrama de estados con el que se procederá a describir la operación del circuito, este modelo corresponde a una maquina tipo Mealy con las siguientes consideraciones:
- La entrada es un pulso de 1ms que incrementa un contador;
- El estado OFF/ON esta condicionado al valor del contador de pulsos;
- La salida del led cambia durante la transición.
Fig2. Diagrama de estado para destello a 1Hz |
input clk, rst_n; //Entrada de reloj 1ms y pulsador reset
output reg ledpin; //Salida para conexión al LED
localparam LEDON = 1'b1; //Estado con LED encendido
reg [8:0] ledcnt; //contador de 9bit.
begin
if(!rst_n) //Condición cuando pulsador reset se activa
begin
ledst <= LEDOFF; //Estado inicial
ledpin <= 1'b0; //Apaga el LED
ledcnt <= 9'd0; //Reiniciar el contador
end
else
case(ledst) //Selección de estado para la FSM
LEDOFF: begin
ledcnt <= ledcnt + 9'd1; //Incrementa contador 1ms
if(ledcnt >= TIME) //Si contador supera el valor
begin
ledcnt <= 9'd0; //Reinicia contador ms
ledpin <= 1'b1; //Activa el LED
ledst <= LEDON; //Cambia de estado
end
end
LEDON: begin
ledcnt <= ledcnt + 9'd1; //Incrementa contador 1ms
if(ledcnt >= TIME) //Si contado supera el valor
begin
ledcnt <= 9'd0; //Reinicia contador
ledpin <= 1'b0; //Apaga el LED
ledst = LEDOFF; //Cambia de estado
end
end
endcase
end
endmodule
El parámetro TIME declarado en Verilog permitirá establecer un valor durante el diseño, es decir en el diagrama de bloques, de esta manera nuestro contador de pulsos en milisegundos puede cambiar con cada instancia adicional del modulo ledblink.v.
reg [14:0] clkcnt;//Registro contador de 15 bits
begin
if(!rst_n)
begin
clkcnt <= 15'd0; //Reinicia contador
clkms <= 1'b0; //Nivel bajo en la salida
end
else
if(clkcnt < 15'd25000) //Calculo 25000 * 0.02u = 0.5ms
begin
clkcnt <= clkcnt + 1'b1; //Incrementa contador
clkms <= clkms; //Permanece la salida sin cambio
end
else
begin
clkcnt <= 15'd0; //Reinicia contador
clkms <= ~clkms; //Cambia de nivel en la salida
end
end
endmodule
Fig3. Diagrama del circuito |
Aquí les comparto un vídeo donde se crea, configura, diseña y carga el firmware de este circuito a la EP2C5 utilizando Quartus.
Algo interesante de trabajar con FPGA, es que los módulos descriptivos pueden ser instanciados cuantas veces se requiera, por ejemplo es posible agregar otro símbolo ledblink en nuestro diagrama de bloques y llevar a cabo las conexiones adicionales, como cada instancia representa un circuito independiente, el concepto de procesos en paralelo es muy aprovechado y llevado a la practica en un FPGA.
Fig3. Adición de otra instancia de ledblink |
El siguiente vídeo muestro lo fácil que es agregar otra instancia a nuestro circuito inicial.
Aquí dejo el enlace para la descarga del proyecto Quartus: ep2leds
Para finalizar solo quiero agradecer tu visita a mi blog, espero que el contenido de esta entrada hubiera sido de ayuda, se que no detalle muchos pasos pero cualquier consulta al respecto puede escribirme al correo y con mucho gusto tratare de colaborar con lo que se pueda.
Pablo Zarate Arancibia.
Ing. Electrónico
pablinzte@gmail.com