Lectura de Pulsador
Fig1. Pulsador SPST 10mm |
En esta entrada del blog, veremos como hacer una lectura correcta de un pulsador en la placa EP2C5, nuevamente recordar que ya contamos con los conocimientos acerca de los que son las FPGA y el manejo de lenguajes descriptivos, mas propiamente Verilog, y que también tienes instalado el software de diseño Quartus Web, un programador USB-Blaster y la placa EP2C5, aunque puedes utilizar cualquier otra tarjeta siempre que sea de la marca Altera. En todo caso algo muy interesante de esta tecnología es que el modulo descrito en este ejemplo puede ser sintetizado para cualquier FPGA.
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 leer el nivel lógico de un pulsador y reflejar su estado en un un diodo led por lo que haremos uso de los siguiente elementos:
- Pulsador de entrada conectado al pin 114(Externo);
- Indicador de estado, LED conectado al pin3(Interno);
- Oscilador principal conectado al pin17(Interno);
- Pulsador de reinicio conectado al pin144(Interno).
Describiremos en nuestro ejemplo el modelo de una maquina de estados
finitos FSM, donde se tomara en cuenta para validar el estado del pulsador los tiempos de espera debido al rebote mecánico y un intervalo mínimo de repetición entre pulsaciones.
Un pulsador es básicamente una interfaz que permite establecer un nivel lógico de entrada a un circuito digital, la validación de su estado se origina por la acción mecánica de cerrar y abrir los contactos internos ocasionando a una escala mínima de tiempo, oscilaciones no deseable que deben ser consideradas en un sistema digital.
Fig2. Ruido en cambio de estado de un pulsador |
Como notara en la imagen de la fig2, el ruido esta formado por pequeñas transiciones que se propagan por casi 40ms, este tiempo se conoce como tiempo de rebote(bounce), y algunas técnicas para minimizar este efecto en nuestro circuito pueden ser:
- Adicionar un filtro RC en la entrada del pulsador;
- Adicionar un circuito discriminador de ruido.
Nuestro ejemplo pasa por aplicar la segunda opción donde diseñaremos una maquina de estados finito para conseguir un nivel estable durante la transición del pulsador, tal como se ilustra en el diagrama de tiempos de la siguiente imagen.
Fig3. Diagrama de tiempo para discriminar el rebote |
Los tiempos de rebote mínimo dependerán en parte de la calidad de construcción de un determinado pulsador, pero en general estará en el rango de 10-50ms, el tiempo de espera(debounce time) puede diferir entre la transición bajo a alto y alto a bajo.
A continuación se muestra el diagrama de estados para la maquina FSM, misma que estará sincronizada por una señal de reloj, usualmente de 1ms.
Fig4. Diagrama de estados |
El código verilog drv_button.v del circuito discriminador comenta claramente la definición de los estados utilizados, el ultimo estado UNPRESS tiene por finalidad otorgar un intervalo de espera entre pulsaciones del botón, tomando en cuenta la interacción humana. Todos los estados dependen del valor que posee el contador, mismo que se incrementa continuamente y se reinicia cada vez que hay un cambio de estado, además se considera que el pulsador se activa en nivel bajo por lo que deberá configurar el modo pullup.
module drv_button(clk, rstn, butn, out);
input clk, rstn, butn;
output reg out = 0;
parameter INTERVAL = 500 //Intervalo de repetición mayor a 50
localparam WIDTH = $clog2(INTERVAL); //Dimensiona contador
localparam INITIAL = 0; //Inicializa estado
localparam WAITING = 1; //Verifica pulsador presionado
localparam PRESSED = 2; //Verifica pulsador liberado
localparam UNPRESS = 3; //Tiempo de espera
reg [1:0] state, nextstate;//registros de estado
reg [WIDTH-1:0] cnt = 0;//contador de pulsos clk
always @(negedge clk or negedge rstn)//flanco NEG para actualizar estado
if(!rstn) state <= INITIAL;
else state <= nextstate;
always @(posedge clk)
case(state)
INITIAL://Condicion de reinicio
begin
cnt <= 0;
out <= 1'b0;
nextstate <= WAITING;
end
WAITING://Espando pulso del botón
if(!butn)
begin
cnt <= cnt + 1'b1;
if(cnt == 30) //Espera al menos 30 pulsos
begin
cnt <= 0;
nextstate <= PRESSED;
end
end
else cnt <= 0;
PRESSED://Pulsador presionado
if(butn)
begin
cnt <= cnt + 1'b1;
if(cnt == 20) //Espera al menos 20 pulsos
begin
cnt <= 0;
out <= 1;
nextstate <= UNPRESS;
end
end
else cnt <= 0;
UNPRESS: //Pulsador liberado
begin
out <= 0;
if(cnt >= INTERVAL) //Intervalo de repetición
begin
cnt <= 0; //Reinicia contador
nextstate <= WAITING;
end
else cnt <= cnt + 1'b1;//Incrementa contador
end
endcase
endmodule
Implementación del circuito
El código descrito previamente se muestra como símbolo dentro del esquema de circuito Quartus Web, Fig5.
Fig5. Modulo drv_button.v |
Antes de continuar con la interconexión del circuito, fue necesario llevar a cabo unas pruebas al modulo drv_button.v utilizando el siguiente modulo de estimulo:
`timescale 100us/10us
module button_tb;
reg clk, rstn, but;
wire out;
drv_button u1(clk, rstn, ~but, out);
initial begin
clk = 0; rstn = 0; but = 0;
forever #5 clk = ~clk; //Tiempo 5x100us
end
initial begin
#10 rstn = 1;//1ms
#20 but = 1; //2ms
#40 but = 0; //4ms
#60 but = 1; //6ms
#400 but = 0; //40ms
end
endmodule
Las pruebas llevadas a cabo nos muestran el siguiente diagrama de tiempos, donde se observa el adecuado funcionamiento.
Fig6. Pulso de salida sin rebote |
Continuando con nuestro circuito discriminador, ahora necesitaremos de un circuito que provea una señal de reloj con periodo de 1ms, este circuito es básicamente un divisor de frecuencia cuya entrada sera una el reloj de principal de 50MHz que posee la tarjeta EP2C5 y su salida oscilara a 1KHZ.
Una vez agregado y convertido a símbolos los módulos drv_button y drv_clock agregaremos estos al diagrama de bloques un flip flop T que permitirá conmutar su salida con cada pulso capturado. La siguiente figura ilustra las respectivas conexiones hacia los pines de la
placa EP2C5.
Fig7. Diagrama del circuito |
Note que la entrada del pulsador en el modulo drv_button se activa en nivel bajo, debido a que es una entrada con resistencia pull-up, de la misma manera el led indicador conectado al flip flop, esta en modo sumidero(sink), es decir se activa con nivel bajo.
Conclusiones
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.
Enlace para descarga del proyecto Quartus Web: ep2button
Dejo un vídeo de explicativo que muestra como crear un proyecto en Quartus utilizando un diagrama de bloques.
Referencias:
https://www.maximintegrated.com/
Pablo Zarate Arancibia
Electrónico
pablinzte@gmail.com
No hay comentarios:
Publicar un comentario