En este tema veremos cómo hacer un ascensor con la BASYS 3, programado en SystemVerilog como una FSM. Las características principales son:
· Cuatro plantas, pero fácilmente escalable.
· Motor de 12V para los movimientos de la cabina, con dos velocidades; rápida para movimiento estándar de la cabina y otra lenta para arranque y parada suaves, todo controlado por PWM.
· Un segundo motor para la puerta corredera y dos switches para detectar si la puerta está abierta o cerrada.
· Cuatro microswitches como finales de carrera para detenerse en el piso que corresponda y seis microswitches de proximidad para indicar la fase de frenado.
· Doble circuito debouncer para pulsadores de llamada, finales de carrera y microswitches de frenado.
· Memoria de pulsadores.
· Display de siete segmentos para visualizar el piso actual, piso destino y otra información de la FSM como es estado actual y el estado del ascensor (subiendo, bajando o parado).
El esquema de conexión consta de cuatro microswitches FC0, FC1, FC2 y FC3 como finales de carrera de los cuatro pisos.
Los microswitches de proximidad FC0_UP, FC1_DW, FC1_UP, FC2_DW, FC2_UP, y FC3_DW se montan estratégicamente por encima y por debajo del FFCC de parada para reducir la velocidad antes de detener la cabina por completo.
Todos los microswitches se conectan a un circuito debouncer para eliminar los rebotes. Este circuito está formado por un condensador de 100nF y una resistencoia pull-down de 10K. Las salidas del debouncer se conectan a la entradas PMOD de la BASYS 3.
Los motores de cabina y puerta son motores DC de 12V con reductura. Se controlan mediante un driver L298, con PWM para las dos velocidades de la cabina y velodiad normal el motor de la puerta.
Dos microwitches adicionales DOOR_OPEN y DOOR_CLOSED nos indican si la puerta de la cabina está abierta o cerrada.
Los botones de llamada se implementan con los pulsadores integrados de la BASYS 3.
Todo el proyecto está programado íntegramente en SystemVerilog. Además de la FSM -que es nucleo principal del circuito- hay otros módulos combinacionales y secuenciales para acometer diversas tareas. Veámoslos con más detalle a continuación.
Decíamos más arriba que todos los finales de carrera pasan por un doble circuito para eliminar los rebotes. Un primer circuito es físico, implementado mediante el condensador de 100nF y la resistencia pull-down de 10K, mientras que el segundo circuito se implementa en la BASYS 3.
Tras el debouncer, los Pulsadores de llamada y los Finales de Carrera se conectar a sendos ENCODERS, cuya misión es registrar el piso actual leyendo el final de carrera activo en cada momento (FCO, FC1, FC2, FC3) y el piso destino leyendo los pulsadores de llamada PB0, PB1, PB2, PB3.
El encoder para los finales de carreta ENC_FFCC lee el final de carrera activo en cada momento y se actualiza a medida que el ascensor se mueve de un piso a otro y lo codifica mediante la salida binaria de dos bits btn_bin[1:0] que devuelve 2'b00, 2'b01, 2'b10, 2'b11.
La salida del ENC_FFCC se actualiza en tiempo real, y su valor se mantiene hasta que se activa otro microswitch final de carrera.
El encoder de los pulsadores es ligeramente distinto ya que se trata de un encoder FIFO para dotar al registro de memoria y pueda almacenar los pulsadores de llamada. En el ejemplo se pueden llamar a dos pisos seguidos y el ascensor se moverá de uno a otro sin necesidad de volver a pulsar ningún botón, pero es fácilmente escalable a tres, cuatro o n memorias simplemente aumentando el tamaño del registro FIFO.
Para avanzar el registro FIFO se utiliza la señal done generada por la FSM cuando se alcanza el piso destino. Los ledes full y empty nos indican visualmente si el registro FIFO está lleno -y no admite nuevas pulsaciones de llamada- o vacío y se puede llamar otro piso.
La salida del encoder FIFO es igual que la salida del encoder de los FFCC's; un valor binario de dos bits btn_bin[1:0] que devuelve 2'b00, 2'b01, 2'b10, 2'b11.
Las salidas de ambos encoders se aplican a la entrada de un comparador, cuya salida [2:0]comparador es un circuito combinacional que compara la posición actual del ascensor con el piso de llamada y devuelve los siguientes valores:
3'b001 si el piso de llamada esta por encima del piso actual --> SUBIR
3'b010 si el piso de llamada está por debajo del piso actual --> BAJAR
3'b100 sin son iguales --> STOP
Estas salidas se aplican a la entrada de la FSM para que envíe las señales correspondientes al Driver L298 y haga funcionar el motor de la cabina en consecuencia.
La Máquina de Estados es el cerebro del ascensor. Controla los motores de cabina y puerta, activa la señal done para avanzar el registro FIFO de los pulsadores y la señal up_down para gestionar la rampa de aceleración y deceleración del motor del ascensor.
Las entradas de la FSM son:
· comparador, para gestionarel motor del ascensor; subir, bajar o stop.
· decelerar, para que el motor reduzca su velocidad cuando se aproxima al piso destino.
· door_open y door_closed, son los micros para indicar si la puerta está abierta o cerada.
El circuito de aceleración / deceleración funciona generando una señal PWM ascendente / descendente con la que obtenemos un arranque y parada suaves.
El circuito consiste en un contador RAMP_GEN ascendente / descendente seleccionable mediante la entrada up_down y un generador de PWM cuyo ciclo de trabajo se ajusta en función de la entrada duty[8:0].
Finalmente, los módulos que se muestran a continuación son los encargados de mostrar en los displays de 7 segmentos información varia para monitorizar el estado del Comparador, la FSM, el piso de origen y el piso destino.
Ascensor de cuatro plantas programado como FSM en SystemVerilog con la tarjeta BASYS 3
Descarga el proyecto completo en Vivado en el siguiente enlace. También están disponibles las fuentes individuales.