LCD课程设计128X64液晶显示程序设计.docx
《LCD课程设计128X64液晶显示程序设计.docx》由会员分享,可在线阅读,更多相关《LCD课程设计128X64液晶显示程序设计.docx(23页珍藏版)》请在冰豆网上搜索。
![LCD课程设计128X64液晶显示程序设计.docx](https://file1.bdocx.com/fileroot1/2023-2/9/fa127cd8-61ea-478c-b96b-693df6f36f13/fa127cd8-61ea-478c-b96b-693df6f36f131.gif)
LCD课程设计128X64液晶显示程序设计
《CPLD/FPGA》
课程设计报告
题目:
128X64液晶显示程序设计
院(系):
信息科学与工程学院
专业班级:
通信1001班
学生姓名:
訚鹏
学号:
20101181021
同组学生:
秦佩
指导教师:
吴莉
2013年10月14日至2013年10月25日
华中科技大学武昌分校制
128X64液晶显示程序设计课程设计任务书
一、设计(调查报告/论文)题目
128X64液晶显示程序设计
二、设计(调查报告/论文)主要内容
下述设计内容需由学生个人独立完成:
1.设计EP1C6Q240C8控制128X64液晶屏显示电路原理图;
2.分析128X64液晶工作原理;
3.能按要求进行元器件的焊接;
4.能正确处理安装与调试过程中所遇到的问题;
三、原始资料
1.通信与电子系统实验指导书;
2.128X64液晶显示电路制作套件。
四、要求的设计(调查/论文)成果
1.元件布局美观,硬件焊接可靠,无虚焊,短路;
2.能在液晶屏上正确显示相关文字信息;
3.结合实际编出具有特色功能程序,程序结构合理,语言简洁,格式规范,注释详细;
4.按要求完成课程设计报告,格式符合学校规范标准,字数不少于2000字。
五、进程安排
第1天理论讲解,材料发放,学生进行元器件清理并检测;
第2天安装焊接,电路调试,硬件故障排查;
第3天,软件编程调试;
第4-5天调测,验收,评分。
六、主要参考资料
[1]陈曦.通信与电子系统实验指导书,武汉:
华中科技大学武昌分校.
[2]谭会生.EDA技术及应用,西安:
西安电子科技大学出版社,2010.
[3]潘松,黄继业.EDA技术与VHDL,北京:
清华大学出版社,2009.
指导教师(签名):
20年月日
摘要…………………………………………………………………………………3
1.课程设计的目的…………………………………………………………………4
2.课程设计题目和要求……………………………………………………………4
3.课程设计报告内容………………………………………………………………4
3.1课程设计原理…………………………………………………………………4
3.2课程设计相关图………………………………………………………………5
3.3课程设计程序…………………………………………………………………6
3.4课程设计的结果………………………………………………………………14
3.5课程设计的波形仿真…………………………………………………………15
4.课程设计所遇到的问题及解决方案…………………………………………15
5.课程设计总结……………………………………………………………………17
摘要
在硬件电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,而VHDL语言是EDA的关键技术之一,它采用自顶向下的设计方法,即从系统总体出发,自上至下地将设计任务分为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。
本课设主要是基于FPGA的128X64的液晶显示控制器。
控制部分采用VHDL语言编写,主体程序采用状态机作为主要控制方式。
关键字:
VHDL,状态机,12864
1课程设计的目的
通过对液晶屏的安装调试,需学习掌握:
(1)液晶屏显示文字的整体设计流程。
(2)Quartus2软件的调试方法及相关工具的使用。
(3)液晶屏LCD12864的使用方法。
(4)各种常见元器件的选择及使用。
2课程设计题目描述和要求
题目描述:
频率计的设计
制作要求:
用VHDL编程控制LCD12864显示的频率计。
(1)用LCD12864显示“频率及姓名”等内容。
(2)显示过程:
实验板通电开机后,下载运行之后,LCD显示器显示“频率及姓名”,本组成员等内容。
(3)熟悉单片机系统的工作原理及调测方法。
软硬件安装调测完成后根据系统的工作原理、过程、测试数据及遇到的问题与处理情况、体会等完成课设报告。
3课程设计报告内容
3.1课程设计原理
该设计分为三个模块:
信号源模块,频率计模块,显示模块。
通过软件程序下载运行在LCD上显示频率等信息。
采用一个标准的基准时钟,在单位时间如(1s)里对被测信号的脉冲数进行计数,即为信号的频率。
由于闸门起始和结束时刻对于信号来说是随机的,将会有一个脉冲周期的量化误差。
进一步分析测量准确度:
设待测信号脉冲周期为TX,频率为FX,当测量时间为T=1s时,测量精度为&=TX/T=1/FX..由此可知直接测频法的测量准确度与信号的频率有关:
当代侧信号频率较高时,测量准确度也较高。
反之测量准确度较低。
因此直接测频法适合频率较高的信号,不能满足在整个测量频段内的测量进度保持不变的要求。
若要得到整个频段内较高的精确度,应该考虑等精度测量等其他方法。
最后将测得的频率送到显示部分显示。
3.2课设相关图
(1)顶层原理图
(2)频率计原理图
(3)引脚匹配
(4)硬件电路
3.3课程设计程序
1.信号源模块(信号源是为了产生1HZ的门控信号和待测的定频信号,而对输入系统时钟clk(50MHZ)进行分频的模块):
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNTIS
PORT(CLK:
INSTD_LOGIC;
FREQ1:
OUTSTD_LOGIC;
FREQ488:
OUTSTD_LOGIC;
FREQ1953:
OUTSTD_LOGIC;
FREQ7812:
OUTSTD_LOGIC;
FREQ31250:
OUTSTD_LOGIC;
FREQ125K:
OUTSTD_LOGIC;
FREQ500K:
OUTSTD_LOGIC);
ENDCNT;
ARCHITECTUREBEHVOFCNTIS
SIGNALTEMP:
STD_LOGIC_VECTOR(19DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFTEMP="11110100001000111111"THEN
TEMP<="00000000000000000000";
ELSE
TEMP<=TEMP+1;
ENDIF;
ENDIF;
ENDPROCESS;
FREQ1<=TEMP(19);
FREQ488<=TEMP(10);
FREQ1953<=TEMP(8);
FREQ7812<=TEMP(6);
FREQ31250<=TEMP(4);
FREQ125K<=TEMP
(2);
FREQ500K<=TEMP(0);
ENDBEHV;
2.FREQ模块:
是通过元件例化将各个功能模块组合在一起的。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFREQIS
PORT(CLK:
INSTD_LOGIC;
FSIN:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDFREQ;
ARCHITECTUREBEHVOFFREQIS
COMPONENTTESTCTL
PORT(CLK:
INSTD_LOGIC;
TSTEN:
OUTSTD_LOGIC;
CLR_CNT:
OUTSTD_LOGIC;
LOAD:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTCNT10
PORT(CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
ENA:
INSTD_LOGIC;
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTREG32B
PORT(LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCOMPONENT;
SIGNALLOAD1,TSTEN1,CLR_CNT1:
STD_LOGIC;
SIGNALDTO1:
STD_LOGIC_VECTOR(31DOWNTO0);
SIGNALCARRY_OUT1:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN
U1:
TESTCTLPORTMAP(CLK=>CLK,TSTEN=>TSTEN1,CLR_CNT=>CLR_CNT1,LOAD=>LOAD1);
U2:
REG32BPORTMAP(LOAD=>LOAD1,DIN=>DTO1,DOUT=>DOUT);
U3:
CNT10PORTMAP(CLK=>FSIN,CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(3DOWNTO0),CARRY_OUT=>CARRY_OUT1(0));
U4:
CNT10PORTMAP(CLK=>CARRY_OUT1(0),CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(7DOWNTO4),CARRY_OUT=>CARRY_OUT1
(1));
U5:
CNT10PORTMAP(CLK=>CARRY_OUT1
(1),CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(11DOWNTO8),CARRY_OUT=>CARRY_OUT1
(2));
U6:
CNT10PORTMAP(CLK=>CARRY_OUT1
(2),CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(15DOWNTO12),CARRY_OUT=>CARRY_OUT1(3));
U7:
CNT10PORTMAP(CLK=>CARRY_OUT1(3),CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(19DOWNTO16),CARRY_OUT=>CARRY_OUT1(4));
U8:
CNT10PORTMAP(CLK=>CARRY_OUT1(4),CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(23DOWNTO20),CARRY_OUT=>CARRY_OUT1(5));
U9:
CNT10PORTMAP(CLK=>CARRY_OUT1(5),CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(27DOWNTO24),CARRY_OUT=>CARRY_OUT1(6));
U10:
CNT10PORTMAP(CLK=>CARRY_OUT1(6),CLR=>CLR_CNT1,ENA=>TSTEN1,
CQ=>DTO1(31DOWNTO28));
ENDBEHV;
3.分频模块(50MHZ经过50分频得到1MHZ)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitypin1mhzis
port(clkin:
instd_logic;
clkout:
outstd_logic);
endpin1mhz;
architectureaofpin1mhzis
begin
process(clkin)
variablecnttemp:
integerrange0to49;
begin
ifclkin='1'andclkin'eventthen
ifcnttemp=49thencnttemp:
=0;
else
ifcnttemp<25thenclkout<='1';
elseclkout<='0';
endif;
cnttemp:
=cnttemp+1;
endif;
endif;
endprocess;
endarchitecturea;
4.显示模块(由状态机来完成液晶屏的时序)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useIEEE.STD_LOGIC_ARITH.ALL;
entityclock_lcd_dispis
generic(divide_to_100k:
integer:
=500);
port(clk:
instd_logic;
DATAIN:
instd_logic_vector(31downto0);
rw,rs,e,lcd_rst:
outstd_logic;
lcd_data:
outstd_logic_vector(7downto0));
endclock_lcd_disp;
architecturetclofclock_lcd_dispis
signalclk_100k:
std_logic;
signalclkout:
std_logic;
signaltemp:
std_logic_vector(7downto0);
typestateis
(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12);
signalcurrent_s:
state;
typedata_bufferisarray(0to15)of
std_logic_vector(7downto0);
typedata_buffer1isarray(0to7)of
std_logic_vector(7downto0);
signaltime:
std_logic_vector(23downto0);
signaldisp_time:
data_buffer1:
=(
x"31",x"32",x"3a",x"33",
x"34",x"3a",x"35",x"36");
constantdata_buf0:
data_buffer:
=
(x"c6",x"b5",x"c2",x"ca",--频率
x"20",x"20",x"20",x"20",--空格
x"20",x"20",x"20",x"20",
x"20",x"20",x"20",x"20");
constantdata_buf1:
data_buffer:
=
(x"20",x"20",x"20",x"20",--
x"20",x"20",x"20",x"20",
x"20",x"20",x"20",x"20",
x"20",x"20",x"20",x"20");
constantdata_buf2:
data_buffer:
=
(x"c7",x"d8",x"c5",x"e5",--秦佩
x"a1",x"aa",x"a1",x"aa",--——
x"d1",x"d4",x"c5",x"f4",--訚鹏
x"20",x"20",x"20",x"20");
begin
--U1:
divclk1portmap(clk,clk_100k);
process(clk)
variablecnt:
integerrange0todivide_to_100k;
begin
if(clk'eventandclk='1')thencnt:
=cnt+1;
if(cnt=divide_to_100k)thencnt:
=0;
endif;
if(cntelseclk_100k<='1';
endif;
endif;
endprocess;
disp_time(7)<=DATAIN(3downto0)+x"30";
disp_time(6)<=DATAIN(7downto4)+x"30";
disp_time(5)<=DATAIN(11downto8)+x"30";
disp_time(4)<=DATAIN(15downto12)+x"30";
disp_time(3)<=DATAIN(19downto16)+x"30";
disp_time
(2)<=DATAIN(23downto20)+x"30";
disp_time
(1)<=DATAIN(27downto24)+x"30";
disp_time(0)<=DATAIN(31downto28)+x"30";
read_time:
process(time)
begin
endprocess;
process(clk_100k)
variablecnt1:
integerrange0to10000;
variablecnt_1:
integerrange0to1000;
variablecode_cnt:
integerrange0to13;
variabledata_cnt:
integerrange0to480;
begin
if(clk_100k'eventandclk_100k='1')then
casecurrent_sis
whens0=>rw<='1';rs<='1';e<='1';cnt1:
=cnt1+1;
ifcnt1<500thenlcd_rst<='0';
elsifcnt1<1000thenlcd_rst<='1';
elsifcnt1=1000then
lcd_rst<='1';cnt1:
=0;current_s<=s1;
endif;
whens1=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3then
e<='1';rs<='0';rw<='0';
elsifcnt_1<2*3then
lcd_data<=x"0c";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3then
cnt_1:
=0;current_s<=s2;
endif;
whens2=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3then
e<='1';rs<='0';rw<='0';
elsifcnt_1<2*3then
lcd_data<=x"90";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3then
cnt_1:
=0;current_s<=s3;
endif;
whens3=>
ifcnt_1<1*3then
e<='1';rs<='1';rw<='0';
elsifcnt_1<2*3then
lcd_data<=data_buf1(data_cnt);
elsifcnt_1=2*3then
data_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=16then
current_s<=s4;
data_cnt:
=0;
endif;
endif;
whens4=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3then
e<='1';rs<='0';rw<='0';
elsifcnt_1<2*3then
lcd_data<=x"88";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3then
cnt_1:
=0;current_s<=s5;
endif;
whens5=>
ifcnt_1<1*3then
e<='1';rs<='1';rw<='0';
elsifcnt_1<2*3then
lcd_data<=data_buf2(data_cnt);
elsifcnt_1=2*3then
data_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=16then
current_s<=s6;
data_cnt:
=0;
endif;
endif;
whens6=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3then
e<='1';rs<='0';rw<='0';
elsifcnt_1<2*3then
lcd_data<=x"80";
elsifcnt_1<10*3thene<='0';
elsifcnt_1=10*3then
cnt_1:
=0;current_s<=s7;
endif;
whens7=>
ifcnt_1<1*3then
e<='1';rs<='1';rw<='0';
elsifcnt_1<2*3then
lcd_data<=data_buf0(data_cnt);
elsifcnt_1=2*3then
data_cnt:
=data_cnt+1;
elsifcnt_1<100thene<='0';
endif;
cnt_1:
=cnt_1+1;
ifcnt_1=100thencnt_1:
=0;
ifdata_cnt=16then
current_s<=s8;
data_cnt:
=0;
endif;
endif;
--动态显示
whens8=>cnt_1:
=cnt_1+1;
ifcnt_1<1*3then
e<='1';rs<='0';rw<='0';
elsifcnt_1<5*3then
lcd_data<=x"90";
elsifcnt_1<20*3thene<='0';
el