Este artículo discutirá los detalles de la interfaz de un módulo LCD de 16×2 básico con un FPGA.

En este tutorial, usaremos Verilog HDL para diseñar un circuito digital que se interconecte con los módulos LCD comunes que se basan en el chip controlador / controlador LCD HD44780. La placa Mojo V3 FPGA se utilizará para implementar el diseño. El módulo LCD utilizado en este artículo es la pantalla 1602A.

Módulos LCD compatibles con HD44780

En un artículo anterior, discutimos los detalles de los módulos LCD que usan el chip controlador / controlador LCD HD44780. El pinout para estos módulos LCD se muestra en la Figura 1.

Figura 1. Imagen cortesía de AAC.

Como puede ver, hay tres pines de control (RS, R / W y E) junto con ocho pines de datos (DB7 a DB0). Para una operación de escritura, debemos aplicar los voltajes apropiados a estos pines, como se muestra en el diagrama de tiempo de la Figura 2 a continuación.

Figura 2. Cortesía de HITACHI.

Los diferentes valores de retardo del diagrama de tiempo anterior se dan en la siguiente tabla:

Tabla 1. Cortesía de HITACHI.

Hay varias instrucciones que pueden usarse para configurar el módulo LCD. Puede encontrar una lista completa de estas instrucciones en la página 24 de esta hoja de datos. Algunas instrucciones importantes se enumeran a continuación.

Tabla 2

Bloques de construcción de diseño: Ruta 1

Queremos mostrar el mensaje "¡HOLA MUNDIAL!" En la pantalla LCD. Veamos qué bloques de construcción necesita nuestro sistema digital para comunicarse con el módulo LCD. Necesitamos una ROM para almacenar el código ASCII para los caracteres del mensaje. Como se muestra en la Figura 3, la salida de la ROM se conectará a los ocho pines de datos del módulo LCD.

figura 3

El mensaje “¡HOLA MUNDIAL!” Tiene 12 caracteres, y podemos usar una ROM de 12 ✕ 8 bits para almacenar el mensaje. Sin embargo, consideremos una ROM de 16 ✕ 8 bits para el mensaje, de modo que podamos mostrar mensajes de hasta 16 caracteres (la longitud de la primera fila de la pantalla LCD).

Puede preguntarse por qué la figura anterior muestra una ROM de 20 ✕ 8 bits si nuestro mensaje tiene una longitud máxima de 16 caracteres. Estos cuatro bytes adicionales se utilizarán para almacenar los datos relacionados con las instrucciones de la pantalla LCD que nos permiten configurar el módulo. Por ejemplo, como se indica en la Tabla 2, podemos aplicar el valor hexadecimal 0x38 a los pines de datos LCD para especificar que el módulo LCD debe recibir / enviar datos en longitudes de 8 bits. Al igual que los códigos de caracteres, los valores hexadecimales de los comandos se aplican a los pines de datos, por lo tanto, podemos almacenarlos en la misma ROM.

En este artículo, usaremos cuatro comandos (0x38, 0x06, 0x0C y 0x01) para configurar el LCD. Puede encontrar una breve descripción de estos comandos en la Tabla 2. Para obtener una explicación detallada, consulte este artículo. Por lo tanto, tenemos una ROM de 20 ✕ 8 bits, donde los primeros cuatro bytes son 0x38, 0x06, 0x0C y 0x01. Los siguientes 16 bytes almacenan el código ASCII para nuestro mensaje.

Teniendo en cuenta el diagrama de tiempo de la Figura 2, observamos que los datos aplicados a DB7-DB0 no deben cambiar durante un cierto tiempo para que la pantalla LCD pueda leerlo correctamente. Por lo tanto, como se muestra en la Figura 3, necesitamos un conjunto de flip-flops de tipo D (DFF) para mantener la dirección de la ROM (y, en consecuencia, DB7-DB0) constante durante un período de tiempo. Después de que la pantalla LCD lea los datos, deberemos aumentar el valor de la dirección en uno para aplicar el siguiente carácter / comando a la pantalla LCD. Por lo tanto, como se muestra en la Figura 4, un multiplexor y un incrementador deben colocarse antes de los DFF.

Figura 4

Usando la entrada de selección del multiplexor, podemos especificar si el valor de la dirección debe permanecer constante (S1 = 0) o ser incrementado (S1 = 1). El multiplexor tiene una tercera opción que nos permite restablecer el valor de la dirección a 00000. Esto se puede lograr reiniciando los DFF también. Nos referiremos a todos estos bloques como Camino 1, como se muestra en la figura. Como veremos más adelante en el artículo, usaremos S1 señal para controlar los circuitos dentro de la Camino 1 bloquear. los addr-reg La señal será utilizada para monitorear el estado de Camino 1.

Vale la pena mencionar que si bien la figura anterior muestra solo un DFF, en realidad hay cinco de ellos (porque la ROM de 20 bytes necesita un bus de direcciones de cinco bits).

Diseño de bloques de construcción: Implementando los retrasos

Como se mencionó anteriormente, las formas de onda aplicadas a las entradas de control del LCD deben seguir el diagrama de tiempo de la Figura 2. Después de que los pines RW y RS cambien de estado, debemos esperar tCOMO antes de configurar el pin E a alta lógica. Luego, una transición de alto a bajo en E inicia una operación de escritura. Sin embargo, durante un cierto tiempo antes (tDSW) y después (tH) el borde descendente de E, los datos no deben cambiar.

Por lo tanto, para comunicarnos con éxito con el LCD, tenemos que implementar los retrasos tCOMO, tDSW, y TH. Esto se puede lograr por un contador. Como a veces necesitamos detener el contador o restablecerlo, pondremos un multiplexor antes de los DFF del contador. Esto se muestra en la Figura 5 a continuación.

Figura 5

De esta manera, podemos utilizar la entrada S2 para controlar el contador y la cnt_reg La salida nos dará el estado del contador, que es una indicación del tiempo transcurrido. De acuerdo con el diagrama de tiempo, necesitamos tres retardos de tiempo diferentes: tCOMO= 40 ns, tDSW= 80 ns, y tH= 10 ns. Observando que la frecuencia de reloj de la placa Mojo V3 es de 50 MHz (un período de reloj de 20 ns), podemos calcular el número de conteos necesarios para cada retardo de tiempo.

Sin embargo, resulta que mi LCD 16×2 necesita demoras mucho más largas para operar. Probablemente esto se deba al hecho de que estoy usando cables relativamente largos y una placa de pruebas para probar mi diseño. En este artículo, implementaré tCOMO= 10 ms y tH= 3 ms. Mantendré la señal E alta durante 58 ms (PWEh= 58 ms). Mi diseño debería poder funcionar con retrasos un poco más cortos. Puedes hacer algunos experimentos y modificar estos números para tu diseño.

¿Cuántos bits necesitamos para el contador? Con los retrasos elegidos, el retraso total será 10 + 58 + 3 ms = 71 ms. Teniendo en cuenta el período de reloj del Mojo (20 ns), se puede implementar un retraso de 71 ms contando desde 0 hasta 3.549.999. Por lo tanto, como se muestra en la Figura 5, necesitamos un contador de 22 bits.

Bloques de construcción de diseño: la ruta de control

El último bloque de construcción que necesitamos es una unidad que controla el Camino 1 y Camino 2 Bloquea adecuadamente para que se generen las formas de onda deseadas para el módulo LCD. Esto se puede lograr mediante una máquina de estados finitos (FSM) que recibe addr_reg y cnt_reg señales (el estado de Camino 1 y Camino 2) y genera apropiado s1 y s2 señales Un diseño inicial para este FSM se muestra en la Figura 6.

Figura 6

Tenga en cuenta que el diagrama solo muestra las transiciones de estado (no se muestran las salidas del FSM). Hay tres estados: durante el ocioso Estado las señales obtienen sus valores iniciales. los lcd_init estado aplica los comandos de configuración LCD; es por eso que la condición de transición de estado es (addr_reg = 3 && cnt_reg = 3,550,000). En otras palabras, tenemos cuatro comandos, y cuando el cuarto comando (addr_reg = 3) se aplica a la pantalla LCD durante 71 ms (cnt_reg = 3,550,000), debemos ir al lcd_print Estado que envía los datos del mensaje a la pantalla LCD. Cuando lleguemos al final de la ROM (addr_reg = 19), deberemos esperar 71 ms (cnt_reg = 3,550,000) y luego pasar a la ocioso estado.

La parte difícil del proyecto está casi terminada. Ahora, solo necesitamos diseñar el FSM y escribir su código Verilog. Estas tareas se tratarán en la siguiente parte del artículo.

Conclusión

Con los FPGA, generalmente tenemos que ver el problema en el nivel más bajo del diseño. Lo que tenemos son puertas lógicas y algunos bloques de construcción básicos, tales como sumadores y comparadores. Si bien esto dificulta el diseño del FPGA, los FPGA sí ofrecen varias ventajas. En este artículo, examinamos los bloques de construcción para conectar un FPGA con un módulo LCD de 16×2 común. Se requiere una ROM, algunos DFF y multiplexores para implementar la interfaz FPGA a LCD. Además, necesitamos un FSM para controlar estos bloques de construcción. El siguiente artículo le dará los detalles para diseñar el FSM y escribir su código Verilog. Luego, programaremos la placa Mojo V3 para verificar nuestro diseño.

Dejar respuesta

Please enter your comment!
Please enter your name here