基于FPGA的字符显示屏的设计.docx
《基于FPGA的字符显示屏的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的字符显示屏的设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于FPGA的字符显示屏的设计
EDA电子设计自动化
基于FPGA的字符显示屏的设计
学院:
通信与信息工程学院
专业:
电子与通信工程
姓名:
毛岩琪
学号:
S100131058
一需求分析
1.功能描述:
本设计主要功能是12864的LCD来显示汉字。
参考LCD12864datasheet,由verilog硬件描述语言设计,最后通过LCD显示屏的中文显示,显示字符包括:
第一行:
重庆邮电大学;第二行:
EDA—电子设计实验;第三行:
制作者—毛岩琪;第四行:
制作日期10-12-22。
同时由独立按键rst来对LCD进行刷新。
2.其他要求:
本设计可以直接运行教学实验箱的模式七。
二总体设计
1.设计思路
参考LCD12864资料,由verilog硬描述件语言设计,最后通过LCD显示屏显示。
整个设计模块主要包括对LCD12864的初始化,时钟分频,字符查找显示等。
同时由独立按键rst来对LCD进行刷新。
2.器件选择
CycloneIIILCD12864独立按键
3.开发环境
QuartusIIEDA教学实验箱
三硬件设计
1.系统电路图
该系统电路主要功能:
系统开始工作后,12864自动显示预设中文字符,分行显示,第一行:
重庆邮电大学;第二行:
EDA—电子设计实验;第三行:
制作者—毛岩琪;第四行:
制作日期10-12-22。
2各模块电路图
2.1时钟分频模块
LCD时钟分频信号模块
通过对系统时钟进行分频,得到clk_lcd,驱动LCD12864工作。
2.2显示模块
显示模块
显示模块是系统的核心模块。
系统开始工作后,LCD12864显示预设中文字符。
四软件设计
1.系统框图
2.模块流程图
2.1计数模块框图
通过对系统时钟的分频,来达到驱动液晶和芯片工作的目的。
2.2显示模块框图
经过上面操作后,LCD完成初始化,系统上电后,开始显示预设字符
五测试结果
在EDA实验箱上运行,结果显示如下,达到设计预期目的。
六问题分析
刚开始LCD时钟不显示,后经查找程序发现,对寄存器的赋初始值有问题。
在制作过程中对寄存器的的操作有待提高,对这种复杂的器件初始化操作还有待进一步加强。
经过此次设计,基本学会了基于FPGA对LCD12864的字符显示设计和阅读datasheet的技巧。
七总结:
经过一学期的EDA的学习,基本掌握了电子设计的流程,熟悉了keil,protues,QuartusII等开发工具,基本达到了预期的学习目的。
最后感谢张老师的辛勤指导,感谢樊忠,张灵至等同学热心帮助。
参考文献
[1]夏宇闻.Verilog数字系统设计[M].北京:
北京航空航天大学出版社.2008.
[2]吴厚航.深入浅出玩转FPGA[M].北京:
北京航空航天大学出版社.2010.
[3]FPGA/CPLD组学小组.
[4]EDN博客.http:
//
附程序代码:
modulelcd_dis(clk0,rst,RW,EN,RS,DATA);
inputclk0;
inputrst;
outputRW;
outputEN;
outputregRS;
outputreg[7:
0]DATA;
regclk1;
regCLK_LCD;
reg[23:
0]cnt1;
reg[15:
0]cnt2;
//***时钟分频***//
always@(posedgeclk0ornegedgerst)
begin
if(!
rst)
begin
cnt1<=24'b0;
CLK_LCD<=0;
end
elseif(cnt1==199999)
begin
cnt1<=0;
CLK_LCD<=~CLK_LCD;
end
else
cnt1<=cnt1+1'b1;
end
always@(posedgeCLK_LCDornegedgerst)
begin
if(!
rst)//rst按键按下为低电平
begin
cnt2<=16'b0;
clk1<=0;
end
elseif(cnt2==49)
begin
cnt2<=0;
clk1<=~clk1;
end
else
cnt2<=cnt2+1'b1;
end
//***12864初始化***//
reg[8:
0]state;
regflag;
reg[6:
0]char_cnt;
reg[7:
0]data_disp;
parameterIDLE=9'b00000000,
CLEAR=9'b00000001,
SETFUNCTION=9'b00000010,点阵字符
SWITCHMODE=9'b00000100,闭
SETMODE=9'b00001000,
SHIFT=9'b00010000,
SETDDRAM=9'b00100000,
WRITERAM=9'b01000000,
STOP=9'b10000000;
assignRW=1'b0;
assignEN=(flag==1)?
CLK_LCD:
1'b0;
always@(posedgeCLK_LCDornegedgerst)
begin
if(!
rst)
RS<=1'b0;
elseif(state==WRITERAM)
RS<=1'b1;
else
RS<=1'b0;
end
always@(posedgeCLK_LCDornegedgerst)
begin
if(!
rst)
begin
state<=IDLE;
DATA<=8'bzzzzzzzz;
char_cnt<=5'b0;
flag<=1'b1;
end
else
begin
case(state)
IDLE:
begin
flag<=1'b1;
state<=CLEAR;
DATA<=8'bzzzzzzzz;
end
CLEAR:
begin
state<=SETFUNCTION;
DATA<=8'b00000001;
end
SETFUNCTION:
begin
state<=SWITCHMODE;
DATA<=8'b00110000;
end
SWITCHMODE:
begin
state<=SETMODE;
DATA<=8'b00001100;
end
SETMODE:
begin
state<=SETDDRAM;
DATA<=8'b00000110;
end
SETDDRAM:
begin
state<=WRITERAM;
if(char_cnt==0)
begin
DATA<=8'b1000_0000;//Line1(80h)
end
elseif(char_cnt==16)
begin
DATA<=8'b1001_0000;//Line2(90h)
end
elseif(char_cnt==32)
begin
DATA<=8'b1000_1000;//Line3(88h)
end
elseif(char_cnt==48)
begin
DATA<=8'b1001_1000;//Line4(98h)
end
end
WRITERAM:
begin
if(char_cnt<=15)
begin
char_cnt<=char_cnt+1'b1;
DATA<=data_disp;
if(char_cnt==15)
state<=SETDDRAM;
else
state<=WRITERAM;
end
elseif(char_cnt>=16&&char_cnt<=31)
begin
char_cnt<=char_cnt+1'b1;
DATA<=data_disp;
if(char_cnt==31)
state<=SETDDRAM;
else
state<=WRITERAM;
end
elseif(char_cnt>=32&&char_cnt<=47)
begin
char_cnt<=char_cnt+1'b1;
DATA<=data_disp;
if(char_cnt==47)
state<=SETDDRAM;
else
state<=WRITERAM;
end
elseif(char_cnt>=48&&char_cnt<=64)
begin
DATA<=data_disp;
if(char_cnt==64)
begin
state<=STOP;
char_cnt<=5'b0;
flag<=1'b0;
end
else
begin
state<=WRITERAM;
char_cnt<=char_cnt+1'b1;end
end
end
STOP:
begin
flag<=1'b1;
state<=SETDDRAM;
end
default:
state<=IDLE;
endcase
end
end
//***字符显示***//
always@(char_cnt)
begin
case(char_cnt)
//重庆邮电大学
7'd0:
data_disp=8'ha2;
7'd1:
data_disp=8'ha0;
7'd2:
data_disp=8'hd6;
7'd3:
data_disp=8'hd8;
7'd4:
data_disp=8'hC7;
7'd5:
data_disp=8'hec;
7'd6:
data_disp=8'hd3;
7'd7:
data_disp=8'hca;
7'd8:
data_disp=8'hb5;
7'd9:
data_disp=8'he7;
7'd10:
data_disp=8'hb4;
7'd11:
data_disp=8'hf3;
7'd12:
data_disp=8'hd1;
7'd13:
data_disp=8'ha7;
7'd14:
data_disp=8'ha2;
7'd15:
data_disp=8'ha0;
//EDA—电子设计实验
7'd16:
data_disp="E";
7'd17:
data_disp="D";
7'd18:
data_disp="A";
7'd19:
data_disp="-";
7'd20:
data_disp=8'hb5;
7'd21:
data_disp=8'he7;
7'd22:
data_disp=8'hd7;
7'd23:
data_disp=8'hd3;
7'd24:
data_disp=8'hc9;
7'd25:
data_disp=8'he8;
7'd26:
data_disp=8'hBC;
7'd27:
data_disp=8'hC6;
7'd28:
data_disp=8'hCA;
7'd29:
data_disp=8'hB5;
7'd30:
data_disp=8'hD1;
7'd31:
data_disp=8'hE9;
//制作者—毛岩琪
7'd32:
data_disp=8'ha2;
7'd33:
data_disp=8'ha0;
7'd34:
data_disp=8'hd6;
7'd35:
data_disp=8'hc6;
7'd36:
data_disp=8'hd7;
7'd37:
data_disp=8'hF7;
7'd38:
data_disp=8'hd5;
7'd39:
data_disp=8'hdf;
7'd40:
data_disp="-";
7'd41:
data_disp="-";
7'd42:
data_disp=8'hc3;
7'd43:
data_disp=8'hab;
7'd44:
data_disp=8'hd1;
7'd45:
data_disp=8'hd2;
7'd46:
data_disp=8'he7;
7'd47:
data_disp=8'hf7;
//制作时间
7'd48:
data_disp=8'hd6;
7'd49:
data_disp=8'hc6;
7'd50:
data_disp=8'hd7;
7'd51:
data_disp=8'hF7;
7'd52:
data_disp=8'hc8;
7'd53:
data_disp=8'hd5;
7'd54:
data_disp=8'hc6;
7'd55:
data_disp=8'hda;
7'd56:
data_disp="1";
7'd57:
data_disp="0";
7'd58:
data_disp="-";
7'd59:
data_disp="1";
7'd60:
data_disp="2";
7'd61:
data_disp="-";
7'd62:
data_disp="2";
7'd63:
data_disp="2";
default:
data_disp=8'ha9;
endcase
end
endmodule