作者: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、附录