En el siguiente tutorial veremos cómo hacer el código Verilog de una máquina de vending empleando la técnica de datapath & controlpath que vimos en el Tema 6 de los Apuntes de Verilog.
El código que vamos a describir guarda cierto parecido con el ejemplo del Tema 6, ya que se trata de ir acumulando en un registro el valor de las monedas que se van introduciendo, hasta que el valor de la suma iguala o supera el precio del producto. En ese momento se dispensa el producto y la máquina vuelve al estado de espera.
El funcionamiento de la máquina es el siguiente: el valor de la moneda se simula con los switches sw[7:0]. Cada vez que se introduce una moneda se genera un pulso único que habilita el sumador; el resultado se acumula en el registro total_reg. Al mismo tiempo el comparador compara el valor de la suma con el precio del producto. Cuando se iguala o se supera, la seña lt_s pasa a 0 y se activa la señal de dispensar el producto d_product que permanece a nivel alto hasta que el sensor dp_ok confirma que el producto se ha dispensado con éxito, momento en el cual la máquina pasa de nuevo al estado de espera.
Opcionalmente se puede mostrar el valor del producto y de la suma de las monedas en los displays de 7 segmentos de la BASYS 3, para ello añadiríamos el siguiente circuito.
Los dos displays de la izquierda muestran el precio del producto y los dos displays de la derecha la suma de las monedas.
El datapath consiste en un sumador para sumar el valor de las monedas introducidas, un registro que acumula el valor total de las monedas introducidas y un comparador que desactiva la señal lt_s cuando el valor de las monedas iguala o supera el precio del producto (80 en la imagen). Por simplicidad, la máquina no devuelve cambio.
Para que no quede muy extenso, no voy a describir los módulos simples del datapath. Se pueden descargar al final de la página.
La FSM del controlpath tiene cuatro estados.
S00, o idle al que se llega en caso de reset. En este estado se activa la señal clear para borrar el registro total_reg.
S01, o wait, al que saltamos si no hay condición de reset y queda en espera de que se introduzca una moneda.
S02, o add, pasamos a este estado cuando se introduce una moneda. Se activa la señal load, se produce la suma y volvemos al estado wait. Si la cantidad es insuficiente permanecemos en wait a la espera de introducir más monedas.
S03, o disp, cuando la suma de monedas iguala o supera el precio del producto la señal !lt_s se hace 0 y pasamos al estado disp. Se activa la señal d_product y cuando el producto se ha dispensado con éxito dp_ok = 1 pasamos de nuevo al estado S00.
En la imagen siguiente se muestra el esquema general de la máquina de vending (lo he dividido en dos imágenes para que se vea mejor). Puedes descargar el esquema completo al final de la página.
Si no queremos complicarnos en exceso podemos omitir la salida total_out con la suma de las monedas, o si lo hacemos, mostrar la suma en los ledes de la BASYS 3.
En el módulo top realizamos las conexiones entre el datapath y el controlpath, así como con las E/S exteriores.
Descarga el código Verilog en el siguiente enlace.