jueves, 11 de noviembre de 2021

201 - Destello LED EP2C5

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

El contador de pulsos es un registro de 9 bits, con lo que es posible hacer una cuenta de 0 hasta 511, posterior a este valor se producirá el desbordamiento, como la base de tiempo es de 1ms, el rango para condicionar cada estado es de 1~512 ms.
Los dos estados posibles del led se definen como LEDOFF (Apagado = 0) y LEDON (Encendido = 1), con estas consideraciones nuestro modulo descriptivo Verilog ledblink.v tendrá el siguiente código

 
module ledblink(clk, rst_n, ledpin);
input clk, rst_n; //Entrada de reloj 1ms y pulsador reset
output reg ledpin; //Salida para conexión al LED
parameter TIME = 500; //Valor para condición de estado
localparam LEDOFF= 1'b0; //Estado con LED apagado
localparam LEDON = 1'b1; //Estado con LED encendido
reg ledst; //Variable para control de estado LED
reg [8:0] ledcnt; //contador de 9bit.
always @(posedge clk or negedge rst_n) //Repite cada 1ms
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.
 
Ahora para continuar con el circuito necesitaremos describir un modulo que divida la frecuencia de entrada conectado al cristal de 50MHz y provea una salida de 1KHz(tiempo base 1ms), si vemos esto en periodos de tiempo, notaremos que el modulo es básicamente un contador de pulsos con duración de 0.02us(para 50MHz), y necesitara llegar a un valor final de 25000 para producir un cambio de nivel en la salida, lo que entregara pulsos con periodo de 1ms. Para conseguir estos tiempos se necesitara un contador de 15 bits porque 2^15 = 32768. Se describe a continuación el código del modulo clockgen.v

module clockgen(clk, rst_n, clkms);
input clk, rst_n;
output reg clkms; //Pulsos de salida 1ms (1KHz)
reg [14:0] clkcnt;//Registro contador de 15 bits
always @(posedge clk or negedge rst_n) //Cada 0.02us
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

Una vez convertido los módulos ledblink.v y clockgen.v a símbolos gráficos, agregaremos estos a nuestro diagrama de bloques de Quartus Web y realizamos las respectivas conexiones hacia los pines asignados en la placa EP2C5, tal como ser observa en la imagen del circuito.

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

No hay comentarios:

Publicar un comentario