基于FPGA的LCD控制器设计
图5.2 图片显示初始化示意图
5.1.2 时钟模块的设计
由LCD初始化的流程图可得大部分指令的执行时间为72us,而清除显示和地址归位则需要4.6ms,为72us的64倍左右,因此需要选择一个合适的时钟来作为ENABLE信号的输入。
时钟电路的设计:
由于FPGA开发板上自带的晶振频率为50MHZ,而所需要的时钟频率则需要小于13.9KHZ,因此需要一个分频器对其进行分频。
这里采用简单的计数器对其进行分频,计数器上限经过计算设为4000. 经过分频后的时钟信号频率为12.5KHZ,满足实验需要。
在分频之后由于时钟信号需要同时控制LCD模块以及FPGA的模块,因此需要编写一个程序,使得两者之间同步。
最终的时钟控制模块如下:
图5.3 时钟模块
其中CLOCK_LOGIC模块的设计通过几个触发器来实现,部分程序如下: component DFF
port( d : in std_logic; clk: in std_logic; q : out std_logic ); end component;
signal sig1,sig2,sig3 : std_logic; begin
36
吉林工程技术师范学院毕业论文
sig1<= not sig2; sig3<= not clock; out_clk<= sig2;
mydff1 : DFF port map (d=>sig1,clk=>clock, q=>sig2); mydff2 : DFF port map (d=>sig2,clk=>sig3, q=>enable);
5.1.3 字符显示前初始化模块的设计 1、初始化部分的状态机设计 根据字符模块初始化的流程图:
图5.4 LCD初始化流程图
因此,此部分的状态机设计如下: ?.
when IDLE=> --空闲状态
37
基于FPGA的LCD控制器设计
if flag ='0' then state <= CLEAR; flag<='1'; else
state<=IDLE; end if;
when CLEAR=> --清屏状态,使LCD屏幕上显示全白
if div_counter2
div_counter2 <=0; state<=RETURNCURSOR; end if;
when RETURNCURSOR=> --地址归位,使DDRAM地址复位
if div_counter2
div_counter2 <=0; state<=SETMODE end if;
when SETMODE=> --点设置,选择整体画面的移位方式 state<=SWITCHMODE;
when SWITCHMODE=> --显示状态开
38
吉林工程技术师范学院毕业论文
state<=SHIFT;
when SHIFT=> --控制游标的移动和显示移位 state<=SETFUNCTION;
when SETFUNCTION=> --功能设置 state<=SETDDRAM1;
when SETDDRAM1=> --设置DDRAM地址 state<=WRITERAM; ?.
其中,由于时钟信号的周期约为80us,而CLEAR清屏和RETURNCURSOR点设定这两个操作需要4.6ms的操作时间,因此在这两个状态中加入了计数器用以延迟,延迟时间为时钟周期的64倍,约为5.12ms.这样设计可以最大化地提高LCD的响应速度。
2、字符显示的数据选择
?
清除显示(对应状态机状态为CLEAR)对应的数据接口的数据(DB7~DB0)为
00000001,RS,RW为0;
?
地址归位(对应状态机状态为RETURNCURSOR)对应(DB7~DB0)的数据为
00000010,RS,RW为0;
?
点设定(对应状态机状态为SETMODE)选择整体画面不移位,DDRAM地址+1,因
此对应DB7~DB0数据为00000110,RS,RW为0;
?
显示状态开(对应状态机状态为SWITHMODE),光标显示关,字符不反白,因此
对应DB7~DB0数据为00001100,RS,RW为0;
?
游标和显示控制(对应状态机状态为SHIFT)选择AC=AC+1,因此对应DB7~DB0
数据为00010100,RS,RW为0;
?
功能设定(对应状态机状态为SETFUNCTION)选择8为数据线接口,以及基本指
令集动作,因此对应DB7~DB0数据为00110000,RS,RW为0;
?
DDRAM(对应状态机状态为SETDDRAM)地址的设定则根据需要设定,对应DB7~DB0
39
基于FPGA的LCD控制器设计
数据为10000000~10011111之间,RS为1,RW为0;
另外,根据模块引脚说明,FPGA还需要同时控制其他几个引脚。其中,为了选择并行的数据发送模式,PSB引脚应为H。RET引脚则由FPGA控制在经过一段时间的L复位后跳为H。
初始数据的赋值: psb<='1';
rs<='1' when state = WRITERAM or state = READRAM else '0'; -- 当状态为读写RAM时,RS为1
rw<='0' when state = CLEAR or state = RETURNCURSOR or state = SETMODE or state = SWITCHMODE or state = SHIFT or state = SETFUNCTION
or state = SETCGRAM or state = SETDDRAM or state = WRITERAM else '1'; --当状态为如上时,RW为0 data<=\
\ \
\when state = SWITCHMODE else
\
\SETFUNCTION else
\??
5.1.4 图片显示前初始化模块的设计 1、图片显示初始化的状态机设计
图片显示时需要用到扩充指令集。在基本指令集设置的时候需要将SETFUNCTION,功能设计,中的RE设为1. 而在扩充指令集的功能设定中也要将RE设为1,同时在显示模块写入图
40