FPGAVerilog程序设计lcd.docx
- 文档编号:3384345
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:8
- 大小:17.53KB
FPGAVerilog程序设计lcd.docx
《FPGAVerilog程序设计lcd.docx》由会员分享,可在线阅读,更多相关《FPGAVerilog程序设计lcd.docx(8页珍藏版)》请在冰豆网上搜索。
FPGAVerilog程序设计lcd
哈尔滨工业大学大学
EDA实验-利用LCD显示英文字
年级:
学号:
姓名:
专业:
电气工程及其自动化
指导老师:
二零一三年十一月
课程设计任务书
班级学生姓名学号专业电气工程及其自动化
题目在FPGA上利用LCD显示英文字
一、设计任务及要求
要求同学们自己查找或编写一个实验程序,并仿真将最后的实验结果在FPGA开发板上显示出来。
如程序为在网上查找需要弄清楚每段程序所代表的内容,及程序的语法。
二、应完成的硬件或软件实验
利用Quatusii编写程序和modelsim软件进行仿真程序,最后在FPGA开发板上显示出实验内容。
三、应交出的设计文件及实物(包括设计论文、程序清单或磁盘、实验装置或产品等)
上交报告电子版和纸质版各一份以及程序附件发至老师邮箱
摘要
以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。
这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。
在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
本实验要求通过verilog语言,在软件Quatusii上编写程序,并利用modelsim软件进行仿真,最终在fpga开发板的液晶显示器上显示出英文字体。
关键词:
fpga;lcd;显示英文
1.1完整的程序内容
//本实验是用LCD1602显示英文。
(LCD带字库)
modulelcd(clk,rs,rw,en,dat);
inputclk;//系统时钟输入50M
output[7:
0]dat;//LCD的8位数据口
outputrs,rw,en;//LCD的控制脚
rege;
reg[7:
0]dat;
regrs;
reg[15:
0]counter;
reg[4:
0]current,next;
regclkr;
reg[1:
0]cnt;
parameterset0=4'h0;
parameterset1=4'h1;
parameterset2=4'h2;
parameterset3=4'h3;
parameterdat0=4'h4;
parameterdat1=4'h5;
parameterdat2=4'h6;
parameterdat3=4'h7;
parameterdat4=4'h8;
parameterdat5=4'h9;
parameterdat6=4'hA;
parameterdat7=4'hB;
parameterdat8=4'hC;
parameterdat9=4'hD;
parameterdat10=4'hE;
parameterdat11=5'h10;
parameternul=4'hF;
always@(posedgeclk)
begin
counter=counter+1;
if(counter==16'h000f)
clkr=~clkr;
end
always@(posedgeclkr)
begin
current=next;
case(current)
set0:
beginrs<=0;dat<=8'h31;next<=set1;end//*设置8位格式,2行,5*7*
set1:
beginrs<=0;dat<=8'h0C;next<=set2;end//*整体显示,关光标,不闪烁*/
set2:
beginrs<=0;dat<=8'h6;next<=set3;end//*设定输入方式,增量不移位*/
set3:
beginrs<=0;dat<=8'h1;next<=dat0;end//*清除显示*/
//上面是LCD的初始化
dat0:
beginrs<=1;dat<=8'h3C;next<=dat1;end
dat1:
beginrs<=1;dat<="F";next<=dat2;end
dat2:
beginrs<=1;dat<="P";next<=dat3;end
dat3:
beginrs<=1;dat<="G";next<=dat4;end
dat4:
beginrs<=1;dat<="A";next<=dat5;end
dat5:
beginrs<=1;dat<=8'h3E;next<=dat6;end
dat6:
beginrs<=1;dat<="G";next<=dat7;end
dat7:
beginrs<=1;dat<="O";next<=dat8;end
dat8:
beginrs<=1;dat<="O";next<=dat9;end
dat9:
beginrs<=1;dat<="D";next<=dat10;end
dat10:
beginrs<=1;dat<="!
";next<=dat11;end
dat11:
beginrs<=1;dat<="!
";next<=nul;end
//上面是在这12个状态中要显示的字符FPGAGOOD!
!
nul:
beginrs<=0;dat<=8'h00;//行一遍然后把液晶的E脚拉高if(cnt!
=2'h2)
if(cnt!
=2'h2)
begin
e<=0;next<=set0;cnt<=cnt+1;
end
else
beginnext<=nul;e<=1;
end
end
default:
next=set0;
endcase
end
assignen=clkr|e;
assignrw=0;
assignon=1;
assignblon=1;
endmodule
1.2各段程序意义的声明
1.2.1以下为程序的首部分,各变量类型的声明,是编写每个程序的必要部分:
modulelcd(clk,rs,rw,en,dat);
inputclk;//系统时钟输入50M
output[7:
0]dat;//LCD的8位数据口
outputrs,rw,en;//LCD的控制脚
rege;
reg[7:
0]dat;
regrs;
reg[15:
0]counter;
reg[4:
0]current,next;
regclkr;
reg[1:
0]cnt;
1.2.2程序中将要用到的常量的声明,为方便在接下来的程序中将要用到这些变量时重复表示的麻烦和修改其中一个值时的繁琐,因此进行如下定义:
parameterset0=4'h0;
parameterset1=4'h1;
parameterset2=4'h2;
parameterset3=4'h3;
parameterdat0=4'h4;
parameterdat1=4'h5;
parameterdat2=4'h6;
parameterdat3=4'h7;
parameterdat4=4'h8;
parameterdat5=4'h9;
parameterdat6=4'hA;
parameterdat7=4'hB;
parameterdat8=4'hC;
parameterdat9=4'hD;
parameterdat10=4'hE;
parameterdat11=5'h10;
parameternul=4'hF;
1.2.3以下为分频段落:
always@(posedgeclk)
begin
counter=counter+1;
if(counter==16'h000f)
clkr=~clkr;
end
1.2.4接下来为lcd的初始化程序,用到了case语句:
always@(posedgeclkr)
begin
current=next;
case(current)
set0:
beginrs<=0;dat<=8'h31;next<=set1;end//*设置8位格式,2行,5*7*
set1:
beginrs<=0;dat<=8'h0C;next<=set2;end//*整体显示,关光标,不闪烁*/
set2:
beginrs<=0;dat<=8'h6;next<=set3;end//*设定输入方式,增量不移位*/
set3:
beginrs<=0;dat<=8'h1;next<=dat0;end//*清除显示*/
1.2.5以下程序为在FPGA开发板上显示“FPGAGOOD”:
dat0:
beginrs<=1;dat<=8'h3C;next<=dat1;end
dat1:
beginrs<=1;dat<="F";next<=dat2;end
dat2:
beginrs<=1;dat<="P";next<=dat3;end
dat3:
beginrs<=1;dat<="G";next<=dat4;end
dat4:
beginrs<=1;dat<="A";next<=dat5;end
dat5:
beginrs<=1;dat<=8'h3E;next<=dat6;end
dat6:
beginrs<=1;dat<="G";next<=dat7;end
dat7:
beginrs<=1;dat<="O";next<=dat8;end
dat8:
beginrs<=1;dat<="O";next<=dat9;end
dat9:
beginrs<=1;dat<="D";next<=dat10;end
dat10:
beginrs<=1;dat<="!
";next<=dat11;end
dat11:
beginrs<=1;dat<="!
";next<=nul;end
1.2.6以下程序将E脚电平拉高,并返回继续执行前段程序:
nul:
beginrs<=0;dat<=8'h00;
if(cnt!
=2'h2)
if(cnt!
=2'h2)
begin
e<=0;next<=set0;cnt<=cnt+1;
end
else
beginnext<=nul;e<=1;
end
end
default:
next=set0;
endcase
end
assignen=clkr|e;
assignrw=0;
assignon=1;
assignblon=1;
endmodule
1.3程序意义说明
该程序目的在于实现在fpga开发板的lcd上显示英文字体,用Quatusii进行verilog语言的程序编写,并用modelsim软件进行仿真,然后进行管脚的分配,最后下载在fpga的开发板上进行试验结果的观察。
改程序并不复杂,在程序中用到了大量的case循环语句,进行lcd的初始化和显示英文字符,在初始化前首先进行了对时钟的分频,以保证显示的稳定。
1.4实验中遇到的问题及解决办法
第一次将实验程序下载到开发板上并进行观察时发现,lcd的显示屏上应显示的“FPGAGOOD”只能在下载的过程中在开发板上显示,下载完成后即消失,经老师的检查发现需要在程序的最后添加上“assignon=1;assignblon=1;”即可,因为lcd的电路原理要求在高电平时才能显示,在下载过程中被拉至高阻状态,会有符合电路要求的时刻,因此会短暂的显示出实验结果,在下载完成后又被至于低电平,因此没有显示的结果,而在加上这两句连续赋值语句后即可满足电路的要求。
参考文献
(著作图书文献)
[1]作者,作者.书名.版次.出版社,出版年:
引用部分起止页
[2]作者.书名.出版社,出版年.
(翻译图书文献)
[3]作者.书名.译者.版次.出版者,出版年:
引用部分起止页
(学术刊物文献)
[4]作者.文章名.学术刊物名.年,卷(期):
引用部分起止页
(学术会议文献)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGAVerilog 程序设计 lcd