跳转到主要内容

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

作者:AMD 实习生Xue Lihao,<span id="profileBt"><a href="https://adaptivesupport.amd.com/s/article/000036913?language=zh_CN"&gt;文章来源:AMD开发者社区</a></span>

<strong>1、模块介绍</strong>

LCD1602是一种常见的字符液晶显示模块,广泛用于用于AMD 7系列FPGA开发板如Artix AC701、Virtex VC707、Kintex KC705。该液晶支持2x16,共32个字符显示,每个字符由5x8的点阵组成,具有四位和八位两种工作模式。图1为一款1602液晶的产品图。目前网上找到的大部分为八位数据通信或为C代码编写的驱动。本博客提供了四位数据通信的RTL驱动。
<center><img src="https://cdn.eetrend.com/files/2024-11/wen_zhang_/100586232-367781-tu1.p…; alt=""></center>
<p align="center"><strong> 图 1</strong></p>

<strong>2、驱动介绍</strong>

本驱动用于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赋值即可;

<strong>3、驱动原理</strong>

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

本驱动使用4位数据信号与MPU通信,启动以及复位步骤如下图:
<center><img src="https://cdn.eetrend.com/files/2024-11/wen_zhang_/100586232-367782-tu2.p…; alt=""></center>
<p align="center"><strong> 图 2</strong></p>

指令和数据通常都为八位,所以在使用四位数据通信时,每次需要写入两次,先写入高四位,再写入低四位。根据图2步骤LCD启动或复位后,顺序写入第一行数据所在地址,第一行1-16单个字符数据,第二行数据所在地址,第二行1-16单个字符数据。本驱动时序如下图:
<center><img src="https://cdn.eetrend.com/files/2024-11/wen_zhang_/100586232-367783-tu3.p…; alt=""></center>
<p align="center"><strong>图 3</strong></p>

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

<strong>4、文件说明</strong>

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
<center><img src="https://cdn.eetrend.com/files/2024-11/wen_zhang_/100586232-367784-tu4.p…; alt=""></center>

<strong>5、附录</strong>
<center><img src="https://cdn.eetrend.com/files/2024-11/wen_zhang_/100586232-367785-tu5.p…; alt=""></center>