基于7系列FPGA开发板的LCD1602驱动

作者:AMD 实习生Xue Lihao,文章来源:AMD开发者社区

1、模块介绍

LCD1602是一种常见的字符液晶显示模块,广泛用于用于AMD 7系列FPGA开发板如Artix AC701、Virtex VC707、Kintex KC705。该液晶支持2x16,共32个字符显示,每个字符由5x8的点阵组成,具有四位和八位两种工作模式。图1为一款1602液晶的产品图。目前网上找到的大部分为八位数据通信或为C代码编写的驱动。本博客提供了四位数据通信的RTL驱动。

图 1

2、驱动介绍

本驱动用于LCD1602液晶的四线控制模式,LCD驱动接口如下:

module lcd (

input clk_50, // 50MHZ时钟

input rst_p, // 高电平复位

input [127:0] line_rom1, // 第一行显示字符(8 x 16)

input [127:0] line_rom2, // 第二行显示字符(8 x 16)

output RS, // 数据和指令选择(高电平为数据,低电平为指令)

output RW, // 读写信号(高电平为读,低电平为写)

output EN, // 使能信号(高电平为读,下降沿为写)

output [3:0] DB_4 // 四位数据指令信号

);

上述接口中的line_rom1和line_rom2,分别使用128比特位宽寄存器变量存储数据,也就是16个字节;

line_rom1 <= "Hi Xilinx! ";

line_rom2 <= "123456789 ";

上述赋值使用了十六个字符(空格也算一个字符),字符在赋值的过程中会被转译成ASCII码,存储进寄存器变量中,ASCII码和液晶的字符库具有对应关系,见附录图片;

该模块使用仅需要给line_rom1和line_rom2赋值即可;

3、驱动原理

本驱动编写参考LCD原厂官方文档: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf

本驱动使用4位数据信号与MPU通信,启动以及复位步骤如下图:

图 2

指令和数据通常都为八位,所以在使用四位数据通信时,每次需要写入两次,先写入高四位,再写入低四位。根据图2步骤LCD启动或复位后,顺序写入第一行数据所在地址,第一行1-16单个字符数据,第二行数据所在地址,第二行1-16单个字符数据。本驱动时序如下图:

图 3

如图3所示,DB_4为四位寄存器。图中黄色竖线之前为启动步骤(RS为低电平,寄存器内容指向指令)。其时序以及赋值和图3照应;之后为显示字符写入步骤(RS为高电平,寄存器内容指向数据),DB_4 赋值从line_rom1第一个字节高四位开始,在line_rom2最后一个字节低四位结束。*注意每次有效赋值发生在EN信号下降沿。

4、文件说明

top.v 此文件为例程顶层模块,其中包含例化差分时钟转单端时钟,例化LCD模块,以及line_rom1和line_rom2的赋值。复位信号I_RST和显示控制信号I_DISPLAY可以通过xdc文件约束至板上用户按键。

lcd.v 此文件为实际LCD驱动。

tb_lcd.v 此文件为仿真testbench,用于生成图3波形图。

pin.xdc 此文件为约束文件,基于VC707开发板,复位信号I_RST和显示控制信号I_DISPLAY分别连接至板上SW3和SW5。

注:烧录完成后,长按复位信号,如果字符显示不清晰,可以调节滑动变阻器R232将显示界面调节清晰;line_rom1和line_rom2赋值需要设置为16字节的数据,没有显示的话,存放空格即可;

如图为LCD启动或复位时显示状态,具体显示逻辑请参考顶层模块top.v

5、附录

最新文章

最新文章