液晶显示屏实验课程设计.docx
《液晶显示屏实验课程设计.docx》由会员分享,可在线阅读,更多相关《液晶显示屏实验课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
液晶显示屏实验课程设计
《嵌入式系统》课程设计报告
液晶显示实验
系、部:
计算机与信息科学系
学生姓名:
欧阳万里
指导教师:
胡荣
专业:
计算机科学与技术
班级:
计本0702
完成时间:
2010年11月26日
第1章基础知识
1.1液晶显示屏原理
1.1.1液晶显示屏的LCD的使用原理和设置;
1.1.2液晶显示模块设计方法。
1.1.3查询有关课程设计汉字的国标码
1.1.4有关FPGA的知识
1.1.5端口的设计方法
1.1.6熟悉GW48系列SOPC/EDA实验开发系统及现代DSP实验开发系统的使用方法。
1.2课程设计题目:
液晶显示屏实验
1.2.1课程设计目的及基本要求
液晶显示屏已广泛应用于人们的日常生活中,在各种领域中起到越来越重要
的位置。
因此,掌握和控制液晶显示屏是非常重要的技能。
进行课程设计是加
强实践,提高动手能力的重要环节,通过课程设计,同时在软件编程,排错调
试,相关仪器设备的使用技术等方面得到全面的提高。
掌握液晶显示屏实现的
相关方法,为将来的实际工作打下一定的基础。
本课程设计是以SED1520控制器为基础,基本要求是:
1、掌握SED1520控制器基本结构
2、掌握液晶显示屏的工作原理及使用方法
3、掌握用VHDL语言编写程序
4、掌握QuartusII的使用方法
5、掌握GW48系列SOPC/EDA实验开发系统:
a:
闲置不用GW48系统时,必须关闭电源,拔下电源插头!
!
!
b:
在实验中,当选中某种模式后,要按一下右侧的复位键,以使系统进入
该结构模式工作。
c:
换目标芯片时要特别注意,不要插反或插错,也不要带电插拔,确信插
对后才能开电源。
其它接口都可带电插拔。
请特别注意,尽可能不要随
意插拔适配板,及实验系统上的其他芯片。
d:
并行口工作模式设置在“EPP”模式!
e:
跳线座“SPS”默认向下短路(PIO48);右侧开关默认拨向“TOMCU”。
f:
对于GW48-PK2系统,左下角拨码开关除第4档“DS8使能”向下拨(8数
码管显示)外,其余皆默认向上
1.3、设计要求
使用FPGA设计一个液晶显示屏LCD显示的控制器,使其能够显示文字、
数字或图形(根据需要选择LCD屏),至少需要显示“湖南工学院”字样。
其它功能可自行增加!
(型号GW48-PK2)
第2章设计内容提要及说明
2.1元件原理图
图1下载/编程接口电路图
图2液晶显示屏
2.1.1模块引脚说明
表1模块引脚
逻辑工作电压(VDD):
3.3~5.5V
电源地(GND):
0V
工作温度(Ta):
0~+50℃(常温)/-20~70℃(宽温)
2.1.2接口时序
模块有并行和串行两种连接方法(时序如下):
a)8位并行连接时序图
图3MPU写资料到模块
图4MPU从模块读出资料
串行连接时序图
图5串行时序图
表2时钟周期表
串行数据传送共分三个字节完成:
第一字节:
串口控制——格式11111ABC
A为数据传送方向控制:
H表示数据从LCD到MCU,L表示数据从MCU到LCD。
B为数据类型选择:
H表示数据室显示数据,L表示数据室控制指令
C固定为0
第二字节:
(并行)8位数据的高4位——格式DDDD0000
第三字节:
(并行)8位数据的低4位——格式DDDD0000
串行接口时序参数:
(测试条件:
T=25℃VDD=4.5V)
2.1.3用户指令集
指令表1:
(RE=0:
基本指令集)
表3基本指令表
指令表2:
(RE=1:
扩充指令集)
表4扩充指令表
2.1.4FPGA与LCD连接方式
FPGA与LCD连接方式:
(仅PK2型含此)。
由实验电路结构图COM可知,默认情况下,
FPGA是通过89C51单片机控制LCD液晶显示的,但若FPGA中有Nios嵌入式系统,则能使
FPGA直接控制LCD显示。
方法是拔去此单片机(在右下侧),用连线将座JP22/JP21(LCD
显示器引脚信号)各信号分别与座JP19/JP20(FPGA引脚信号)相连接即可。
图6实验电路结构图COM
第3章系统硬件设计
本方案采用的FPGA为Alter公司的ACEX1K30芯片,它可提供系统的时钟及读写控制,
ACEX系列的FPGA由逻辑数组块LAB(Logicarrayblock)、嵌入式数组块EAB(embedded
arrayblock)、快速互联以及IO单元构成,每个逻辑数组块包含8个逻辑单元LE(logic
element)和一个局部互联[1]。
每个逻辑单元则由一个4输入查找表(LUT)、一个可
编程触发器、快速进位链、级连链组成,多个LAB和多个EAB则可通过快速通道互相连
接。
EAB是ACEX系列器件在结构设计上的一个重要部件,他是输入埠和输出埠都带有触
发器的一种灵活的RAM块,其主要功能是实现一些规模不太大的FIFO、ROM、RAM和双埠
RAM等。
在本液晶显示接口电路中,EAB主要用宏功能模块实现片上ROM。
它通过调用FPGA
上的EAB资源来实现汉字的显示和字符的存储,并根据控制信号产生的地址值从ROM中
读取字符值,然后送LCD显示器进行显示。
由于所用的图形点阵液晶块内置有SED1520
控制器,所以,其电路特性实际上就是SED1520的电路特性。
SED1520的主要特性如下:
(1)具有液晶显示行驱动器,具有16路行驱动输出,并可级联实现32行驱动。
(2)具有液晶显示列驱动器,共有61路列驱动输出。
(3)内置时序发生器,其占空比可设
置为1/16和1/32两种。
(4)内藏显示内存,显示内存内的数据可直接显示,"1"为显示,"0"为不显示。
(5)接口总线时序可适配8080系列或M6800系列,并可直接与计算机接口。
(6)操作简单,有13条控制指令。
(7)采用CMOS工艺,可在电压低至2.4-7.0V时正常工作,功耗仅30μW。
本设计所用的字符液晶模块CM12232由两块SED1520级连驱动,其中一个工作在主
工作方式下,另一个工作在从方式下,主工作方式SED1520负责上半屏16行的驱动和左
半屏的61列驱动,从工作方式的SED1520则负责下半屏16行的驱动和右半屏的61列驱
动,使能信号E1、E2用来区分具体控制的是那一片SED1520,其系统的硬件连接图如图
1所示。
由图1可见,该系统的硬件部分连接十分简单,其中FPGA部分没画出,而液晶
与FPGA的接口则可直接以网表的形式给出,将它们直接与FPGA的普通I/O引脚相连即
可。
系统的软件接口实现具体实现的重点是如何从存放有字符的ROM块中读出数据,并
按照液晶的时序正确的写入,在介绍具体实现方法前,首先要熟悉SED1520的指令。
SED1520的控制指令表
第四章设计过程
4.1初始化部分的状态机设计
根据字符模块初始化的流程图:
图7LCD初始化流程图
4.2时钟模块的设计
由于FPGA开发板上自带的晶振频率为50MHZ,而所需要的时钟频率则需要小于13.9K。
因此需要一个分频器对其进行分频。
这里采用简单的计数器对其进行分频,通过分频器将外部输入的32MHZ的信号分成频率为153600HZ的信号。
在分频之后由于时钟信号需要同时控制LCD模块以及FPGA的模块,因此需要编写一个程序,使得两者之间同步。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbaudIS
port(clk,resetb:
instd_logic;
bclk:
outstd_logic);
endbaud;
architectureBehavioralofbaudis
begin
process(clk,resetb)
variablecnt:
integer;
begin
ifresetb='1'then
cnt:
=0;bclk<='0';
elsifrising_edge(clk)then
ifcnt>=208thencnt:
=0;bclk<='1';
elsecnt:
=cnt+1;bclk<='0';
endif;
endif;
endprocess;
endbehavioral;
图8时钟模块
图9系统的仿真图形
4.3中文字符部分的数据模块
中文部分由于VHDL中无法识别中文,使用时需要参照中文字符表,将需要的字符所对应的数据输入RAM,然后通过和英文模块不重复的符号来实现对其的调用。
如“湖”这个中文字符,所对应国标码”bdad”,因此在函数部分应为:
constantdata_buf:
data_buffer:
=(x"bd",x"ad");
本程序驱动液晶显示“湖南工学院”“班级”“姓名”
“日期”
LibraryIEEE;
UseIEEE.STD_LOGIC_1164.ALL;
UseIEEE.STD_LOGIC_ARITH.ALL;
UseIEEE.STD_LOGIC_UNSIGNED.ALL;
entityLCDis
generic(divide_to_100k:
integer:
=1000);
Port(clk,rst:
inSTD_LOGIC;
Rw,rs,e,lcd_rst:
outSTD_LOGIC;
Lcd_data:
outSTD_LOGIC_VECTOR(7downto0));
endLCD;
architectureBehavioralofLCDis
signalclk_100k:
std_logic;
typestateis(s0,s1,s2,s3,s4);
signalcurrent_s:
state;
typedata_bufferisarray(0to43)ofstd_logic_vector(7downto0);
constantdata_buf:
data_buffer:
=(x"bd",x"ad",x"ce",x"f7",
x"c0",x"ed",x"b9",x"a4",
x"b4",x"f3",x"d1",x"a7",
x"d3",x"a6",x"d3",x"c3",
x"bf",x"c6",x"d1",x"a7",
x"d1",x"a7",x"d4",x"ba",
x"bf",x"ce",x"b3",x"cc",
x"c9",x"e8",x"bc",x"c6",
x"b0",x"e0",x"bc",x"b6",
x"d0",x"d5",x"c3",x"fb",
x"c8",x"d5",x"c6",x"da");
begin
process(clk)
variablecnt:
integerrange0todivide_to_100k;
begin
ifrising_edge(clk)thencnt:
=cnt+1;
ifcnt=divide_to_100kthencnt:
=0;
endif;
ifcntelseclk_100k<='1';
endif;
endif;
endprocess;
process(clk_100k)
variablecnt1:
integerrange0to500;
variablecnt1_1:
integerrange0to100;
variablecode_cnt:
integerrange0to13;
variabledata_cnt:
integerrange0to48;
begin
ifrising_edge(clk_100k)then
ifrst='1'thencurrent_s<=s0;cnt1:
=0;cnt1_1:
=0;
code_cnt:
=0;data_cnt:
=0;lcd_rst<='0';
elsecasecurrent_sis
whens0=>rw<='1';rs<='1';e<='1';cnt1:
=cnt1+1;
ifcnt1<250thenlcd_rst<='0';
elsifcnt1<500thenlcd_rst<='1';
elsifcnt1=500then
lcd_rst<='1';cnt1:
=0;current_s<=s1;
endif;
whens1=>cnt1_1:
=cnt1_1+1;
ifcnt1_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt1_1<2*3thenlcd_data<=x"0c";
elsifcnt1_1<10*3thene<='0';
elsifcnt1_1=10*3thencnt1_1:
=0;current_s<=s2;
endif;
whens2=>cnt1_1:
=cnt1_1+1;
ifcnt1_1<1*3thene<='1';rs<='0';rw<='0';
elsifcnt1_1<2*3thenlcd_data<=x"80";
elsifcnt1_1<10*3thene<='0';
elsifcnt1_1=10*3thencnt1_1:
=0;current_s<=s3;
endif;
whens3=>
ifcnt1_1<1*3thene<='1';rs<='1';rw<='0';
elsifcnt1_1<2*3thenlcd_data<=data_buf(data_cnt);
elsifcnt1_1=2*3thendata_cnt:
=data_cnt+1;
elsifcnt1_1<100thene<='0';
endif;
cnt1_1:
=cnt1+1;
ifcnt1_1=100thencnt1_1:
=0;
ifdata_cnt=16thencurrent_s<=s4;data_cnt:
=0;
endif;
endif;
whenothers=>current_s<=s0;
endcase;
endif;
endif;
endprocess;
endBehavioral;
图10显示文字的模块
图11系统的仿真图形
4.4图形的数据模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYlcdlinehoziIS
PORT(CLK,key3:
INSTD_LOGIC;
CK0,DISP,Hsync,Vsync:
OUTSTD_LOGIC;
rgb:
OUTSTD_LOGIC_VECTOR(0TO23)
);
END;
ARCHITECTUREWXOFlcdlinehoziIS
SIGNALCLK_TEMP1,CLK_TEMP2,CK:
STD_LOGIC;
SIGNALCNT1,CNT2:
STD_LOGIC_VECTOR(2DOWNTO0);
signalcnt:
std_logic_vector(1downto0);
SIGNALHS_CNT,VS_CNT:
INTEGERRANGE0TO525;
signalrgbx,rgby:
STD_LOGIC_VECTOR(0TO23);
CONSTANTTHp:
INTEGER:
=41;
CONSTANTTHb:
INTEGER:
=2;
CONSTANTTHf:
INTEGER:
=2;
CONSTANTTVp:
INTEGER:
=10;
CONSTANTTVb:
INTEGER:
=2;
CONSTANTTVF:
INTEGER:
=2;
CONSTANTTHd:
INTEGER:
=480;
CONSTANTTVd:
INTEGER:
=272;
BEGIN
PROCESS(key3)
BEGIN
IFkey3'eventandkey3='1'THEN
IFcnt="10"THENcnt<="00";
elsecnt<=cnt+1;endif;
endif;
endprocess;
process(cnt)
begin
ifcnt="00"thenrgb<="111111111111111111111111";
elsifcnt="01"thenrgb<=rgbx;
elsifcnt="10"thenrgb<=rgby;
elsergb<="000000000000000000000000";
endif;endprocess;
process(hs_cnt,vs_cnt)
begin
ifhs_cnt<102thenrgbx<="000000000000000000000000";
elsifhs_cnt<162thenrgbx<="000000000000000011111111";
elsifhs_cnt<222thenrgbx<="111111110000000000000000";
elsifhs_cnt<282thenrgbx<="000000001111111111111111";
elsifhs_cnt<342thenrgbx<="000000001111111100000000";
elsifhs_cnt<402thenrgbx<="111111110000000011111111";
elsifhs_cnt<462thenrgbx<="111111111111111100000000";
elsifhs_cnt<522thenrgbx<="111111111111111111111111";
elsergbx<="101010101010101010101010";
endif;
ifvs_cnt<43thenrgby<="000000000000000000000000";
elsifvs_cnt<75thenrgby<="000000000000000011111111";
elsifvs_cnt<107thenrgby<="111111110000000000000000";
elsifvs_cnt<139thenrgby<="000000001111111111111111";
elsifvs_cnt<171thenrgby<="000000001111111100000000";
elsifvs_cnt<203thenrgby<="111111110000000011111111";
elsifvs_cnt<235thenrgby<="111111111111111100000000";
elsifvs_cnt<267thenrgby<="111111111111111111111111";
elsergby<="101010101010101010101010";
endif;
endprocess;
CLOCK:
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNT1=2THENCNT1<="000";
ELSECNT1<=CNT1+1;ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='0'THEN
IFCNT2=2THENCNT2<="000";
ELSECNT2<=CNT2+1;ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNT1=0THENCLK_TEMP1<='1';
ELSIFCNT1=1THENCLK_TEMP1<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='0'THEN
IFCNT2=0THENCLK_TEMP2<='1';
ELSIFCNT2=1THENCLK_TEMP2<='0';
ENDIF;
ENDIF;
ENDPROCESS;
CK<=CLK_TEMP1ORCLK_TEMP2;
CK0<=CK;
PROCESS(CK)
BEGIN
IFCK'EVENTANDCK='1'THEN
IFHS_CNT=THp-1THEN
Hsync<='1';HS_CNT<=HS_CNT+1;
ELSIFHS_CNT=THp+THb+THd+THf-1THEN--524
HS_CNT<=0;Hsync<='0';
IFVS_CNT=TVp+TVb+TVd+TVf-1THEN--285VS
VS_CNT<=0;Vsync<='0';DISP<='1';
ELSIFVS_CNT=TVp-1THEN
Vsync<='1';VS_CNT<=VS_CNT+1;
ELSEVS_CNT<=VS_CNT+1;
ENDIF;
ELSEHS_CNT<=HS_CNT+1;
ENDIF;ENDIF;
ENDPROCESS;
ENDWX;
图12显示图像模块
图13系统的仿真图形
第5章课程设计总结