XILINX学习笔记之四---1602液晶IP核设计

1602为常见的液晶显示设备,本实验所用的规格为16x2字符型驱动,直观图如下所示。
PTNMtO.png

上图为本人已完成的LCD液晶驱动显示效果(可以显示任意字符串),由两行组成,可以显示英文字符,部分日语,也可以显示自定义的图像,Spartan-3E所用的1602 (Sitronix ST7066U graphics controller)与FPGA的接口如下所示:

信号说明:
其中SF_D为4位的数据接口位,LCD_E为液晶显示或者不显示控制位,LCD_RS为区分控制或数据信号标志位,当LCD_RS = ‘0’时,表示SF_D为控制信号,LCD_RS=’1’此时SF_D为数据位,LCD_RW为读写控制位,因为不需要从LCD液晶屏中读取数据所以可以简单的再复位操作时,将其清零即可。

可以看出,此1602的数据位为4位,故要写入8位命令时需要进行两次写入操作,写入数据的时序图如下所示,
PTNn76.png
PTNKAK.png

红线所画为两个字节数据写入所需的最小时差(这个需要特别注意)

根据Spartan-3E的GUIDE,可以知道1602工作的基本流程主要分为上电初始化、写命令、设置读写地址、传递数据三大过程,笔者统计了下这三大步骤中的等待时间最小值和最大值,其中最小值为40us,最大值为15ms,故笔者采取了将50MHZ的时钟分频为10KHZ,即时钟周期为100us的方法来简化设计。

在Spartan-3E的用户手册上详细讲解了如何对此液晶进行操作,笔者做了简单的摘要:

一)上电初始化(目的是建立宽度为4 bit的数据接口)

  • 等待15ms或者更长时间
  • 写命令字0x3,保持LCD_E高电平12个周期(时钟频率为50MHZ时)
  • 等待4.1ms或者更长时间
  • 写命令字0x3,保持LCD_E高电平12个周期
  • 等待100us或者更长时间
  • 写命令字0x3,保持LCD_E高电平12个周期
  • 等待40us或者更长时间
  • 写命令字0x2,保持LCD_E高电平12个周期
  • 等待40us或者更长时间

二)写命令

  • 发送功能设置命令(Function Set),0x28
  • 发送端口模式设置命令(Entry Mode Set),0x06,自动增加地址指针
  • 发送Display ON/OFF命令,0x0C,打开显示开关并禁止光标闪烁
  • 发送Clear Display命令,等待1.64ms或者更长时间

三)设置读写地址和传递数据

指定起始地址,并给出一个或者多个数据,这一步是显示的关键,必须仔细设置控制位,笔者就是因为这个错误,白白花费了大半天的时间,具体方法是在写任何数据之前,发送Set DD RAM Address 命令,(写入7位的DD RAM地址,注意最高位为1)然后再写入数据。

简单介绍我所设计的LCD液晶IP核的思路,首先生成100us的时钟,然后根据初始化顺序,编写状态机。最终设计效果是在1602液晶屏上可以静态显示16*2的任意字符串—而这只需修改两个参数即可轻松实现。下面是部分代码展示。下图为为写16个字符的代码实现
PTNm0x.png

下面两图分别为将普通的字符串转换为1602可显示的编码值的模块和生成clk_100us的代码,
PTNen1.png
PTNQhD.png

最终效果图是在屏幕上显示两行字符串:
PTNMtO.png