基于FPGA的液晶显示接口设计
扫描二维码
随时随地手机看文章
1 液晶显示模块介绍
128×64液晶显示模块是使用2片KS0108B作为列驱动器,1片KS0107B作为行驱动器组成的,另外还带有负压发生电路。由于KS0107B不与FPGA发生联系。因此只要提供电源就能产生行驱动信号以及各种同步信号。每个KS0108B器件控制8页(每页8行像素)、64列像素的屏幕区域,因此两个列控制器正好控制64行、128列的像素矩阵,左右半屏由其,引脚控制选择。列控制器KS0108B的主要特点如下:内置64×64共4 096位显示RAM,RAM中每位数据对应LCD屏上一个点的亮暗状态;64路列驱动输出;读写操作时序与68系列微处理器相符,因此,它可直接与68系列微处理器接口相连;占空比为1/32~1/64。图1为KS0108B的显示RAM的地址结构。表1为128×64液晶显示模块的指令列表,表2为其引脚功能描述。
[!--empirenews.page--]
2 基于免费IP核实现异步FIFO的设计
设计所用的FPGA器件是XIUNX公司的XC3S100E,XC3S100E是SPARTAN3E系列的一款最低容量的FPGA,此系列FPGA利用90 nm工艺实现低成本高容量的需求,XC3S100E具有以下资源:2160个逻辑单元;RAM资源87 kb(其中BLOCK RAM 72 kb,分布式RAM 15 kb);2个DCM;4个乘法器:可实现FIFO等多个IP核。
在XILINX ISElO.1集成开发工具下,容易利用XININX免费IP核实现异步FIFO。异步FIFO是在2个相互独立的时钟域下,数据在一个时钟域写入FIFO,而在另一个时钟域下又从该FIFO中将数据读出。异步FIFO通常被用来将数据从一个时钟域安全传送到另一个时钟域。在本设计中,FIFO和液晶控制(LCD_CONTROL)模块作为CPU和液晶显示模块之间的桥梁,使用FIFO作为输入缓冲器,由CPU将需要显示的字符或者图形数据写入FIFO,每写完一屏需要显示的字符以及图形便向液晶控制模块发送一个高电平信号,用来通知液晶控制模块读取FIFO中的图形或者字符数据,以便将此数据写入到128x64单色液晶显示模块中,这样比CPU直接控制液晶模块效率要高的多。[!--empirenews.page--]
异步FIFO中的写时钟WR_CLK、WR_EN以及FULL标志是用来控制数据写入的,在时钟的上升沿,如果写使能有效,则数据就会写入FIF0,如果持续写入,数据就会写满,这时FULL信号就会有效,表示FIF0已经写满。同理读时钟RD_CLK、RD_EN以及EMPTY标志是用来控制数据读出的,在时钟的上升沿,如果读使能有效,则数据就会读出FIFO,如果持续读出,数据就会读空,这时EMPTY信号就会有效,表示FIF0已经读空。FULL/EMPTY标志能够防止数据上溢和上溢,也可以用来控制数据的写入和读出。在本设计中,FULL标志表示CPU已经把FIF0写满,液晶控制模块开始把FIFO中的数据读出同时写到液晶显示模块中。EMPTY标志表示液晶控制模块已经把FIFO读空,即把FIF0中所有的数据写入到液晶显示模块中。实际上,在本设计中,FULL/EMPTY就是CPU和液晶控制模块的握手信号,当FIF0空时,CPU才可以往液晶控制模块中写入数据,当FIF0写满时,液晶控制模块才能从FIF0中读取数据。图2为系统设计框图,图中写入控制逻辑部分包括译码和信号整形电路,通过这些电路使CPU向FIFO写数据时写使能信号WR_EN,写时钟信号WR_CLK的正确的时序关系,实现数据正确写入。
异步FIF0 IP核的参数指标直接影响FIFO的写入速度,首先FIF0的写入速度快能够减少CPU的开销,使CPU写满FIF0花费时间更少,这样CPU可以有更多时间完成实时性更高的任务。其次FIFO的存储深度要适宜,深度过大造成资源的浪费,深度过小会造成控制复杂,这样将占用更多的逻辑资源,同时会降低整个系统的可靠性。本设计中的异步FIFO是利用ISEl0.1中的参数化的IP核在XC3S100E器件的实现。由于液晶显示模块共有128 x64个像素,每个字节可以控制8个像素,所以一个整屏共占用l 024个字节的缓冲区,所以在参数化的FIF0设计中选择FIF0深度为1 024,宽度为8位。
3 基于FPGA的液晶控制模块
由液晶指令列表(表1)和KS0108B的显示RAM地址结构(图1)可以看出,128x64液晶显示模块的控制相对简单,页地址范围为B8H~BFH,列地址范围为40H~7FH,数据为纵向读写,即每页的第l行对应BD0,第8行对应BD7。控制器KS0108的指令总共7条,即:指令显示开关设定3EH/3FH:显示起始行设定C0H~FFH:页地址设定B8H~BFH:列地址设定40H~7FH;状态读取;写数据;读数据。
[!--empirenews.page--] 由于在向液晶显示模块写数据和命令前,都要回读液晶显示模块状态。如果模块内部的控制器处于忙状态,这时就要等待,直到液晶显示模块的控制器处于空闲状态才能向模块写数据和命令。从液晶显示模块手册可以看到如果将数据或者命令写入液晶显示模块,主要是正确控制数据、命令写入时序。为了实现液晶控制命令或者数据的正确写入,这里设计了一个有限的状态机,其状态转移图如图3所示。从该状态转移图可以看出,此状态机共有8个状态,分别是:空闲、显示开关设置、显示起始行设置、数据页设置、数据起始列设置、回读、数据装载、写数据。如果FIF0没有数据或者数据未写满,状态机一直在空闲状态。当FIF0满时,状态机就依次进入显示开关设置状态(显示打开,写入命令代码3FH)、显示起始行设置状态(设置显示起始行,写入命令代码COH)、数据页设置状态(设置起始页,写人命令代码B8H)、数据起始列设置状态(设置起始列,写入命令代码40H),之后就进人数据装载,写数据,状态回读的循环中,每写完l列,液晶模块的列地址自动加l,直到写完一页(64列),页地址加1,重新设置页序号,数据起始列,再进入写数据,状态回读的循环中,直到写完l片KS0108B控制的显示存储区。在控制第2片KS0108B时,FPGA液晶控制模块自动选通另一片KS0108B,重新设置该片液晶控制器.写入命令和数据,直到写满整个显示RAM。图4为FPGA实现的液晶控制模块的仿真。其中E为使能信号,CSA_N、CSB_N为液晶显示模块内部液晶显示控制的片选信号,低电平有效;D_I位数据命令选择信号,RW为读写信号,FULL为FIF0满信号,BD为数据总线,ENABLE为液晶控制模块的使能信号,RESET_N为系统复位信号。从图4中可以看出:当FIF0满且有效时,也就是FULL=1时,液晶控制状态机依次从空闲状态写入命令代码3FH(显示开关打开)、COH(显示起始行设为0)、B8H(起始页地址设为0)、40H(列地址设为0),之后就进入数据装载,写数据,状态回读的循环中,直到把整个液晶显示模块显示RAM写满,FPGA实现的液晶控制模块重新进入空闲状态,等待CPU把整个异步FIFO写满。
由于液晶模块速度很慢,在用CPU直接控制时,CPU写数据和命令的时间twrite≥1μs,而且写数据和命令之前要有一个读忙的时间tbu-sy,大约为4μs的时间,所以写数据和命令总的时间约为5μs,写满整屏时间为5μs×1 024=5.12 ms,如果用CPU直接写入FIF0,因为现在的控制器总线速度很快,假设写入一个字节数据需要50 ns,则写满一整屏需要50 nsX1024=0.0512 ms,约是原来时间的1/100,节省了5 ms,提高了CPU的利用率。
4 结束语
本文利用XIUNX SPARTAN3E系列FPGA器件实现异步FIFO和液晶控制功能模块的设计,CPU不用直接控制液晶模块,也不用增加单片机协助CPU控制液晶模块,CPU只需把显示的数据写入FPGA实现的FIF0缓冲区,剩下的任务交给FPGA实现的液晶控制模块处理,以便CPU去处理实时性高的任务,大大提高了CPU的利用率。