基于FPGA的广告显示屏的设计.docx
- 文档编号:13496022
- 上传时间:2023-06-14
- 格式:DOCX
- 页数:20
- 大小:223.11KB
基于FPGA的广告显示屏的设计.docx
《基于FPGA的广告显示屏的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的广告显示屏的设计.docx(20页珍藏版)》请在冰点文库上搜索。
基于FPGA的广告显示屏的设计
电子设计自动化
基于FPGA的广告显示屏的设计
学院:
通信与信息工程学院
专业:
通信与信息系统
姓名:
樊忠S1*******5
一需求分析
1.功能描述:
随着现在经济的飞速发展,城市的建设与美观也越来越正规化。
广告的设计与要求也越来越严格,环顾我们周围,广告商满大街的拉横幅。
虽然起到了很大的宣传作用,但让城市的美观降低了层次,同时也增加了很大的安全隐患。
用电子广告显示屏来做宣传,不仅美观大方,可以根据实际需要,对广告内容及时修改。
不会像其它形式的广告宣传产生巨大的资源消耗,环境污染符合当今低碳生活要求。
2.其他要求:
本设计可以直接运行教学实验箱的模式七。
二总体设计
1.设计思路
参考LCD12864资料,由verilog语言对电子广告显示屏的中文显示,时间显示,时间调节等功能进行描述,实现电子广告显示屏的功能。
同时独立按键可以对显示屏进行实时时间调节。
2.器件选择
CycloneIIILCD12864独立按键
3.开发环境
QuartusIIEDA教学实验箱
三硬件设计
1.系统电路图
该系统电路主要功能:
系统开始工作后,12864自动显示预设中文字符,在液晶的最后一行显示时间,可以通过独立按键对月,日,时,分,秒进行调整。
2各模块电路图
2.1时钟分频模块
LCD时钟分频信号模块时间显示计数分频信号模块
通过对系统时钟进行分频,得到clk_lcd和clk1,分别驱动12864和计时时钟信号。
2.2计时显示模块
计时显示模块
计时显示模块是系统的核心模块。
系统开始工作后,LCD显示预设中文字符,在液晶的最后一行显示时间,可以通过按键对月,日,时,分,秒进行调整。
四软件设计
1.信号流程图
2.模块信号流程图
2.1计数信号流程图
通过对系统时钟的分频,来达到驱动液晶和芯片工作的目的。
2.2计时调时信号流程图
通过实时查询来判断月,日,时,分,秒。
按键可以随时调整显示的时间。
五测试结果
在EDA实验箱上运行,结果显示如下,达到设计预期目的。
六问题分析
对功能寄存器的正确操作是操作LCD12864的重要工作组成部分。
最初上电实验时,液晶无任何显示的主要原因就是没有正确操作寄存器。
七总结
经过一学期的紧张学习,我们基本掌握了电子设计的设计流程,熟练使用keil软件,protues软件,QuartusII软件,能通过实践来实现一些小题目,达到了预期的学习目标。
借此机会向一直兢兢业业工作的张老师表示感谢,向一直共同进取,相互学习的同学表示感谢。
在今后的日子里,我们会更加努力学习,积极进取,努力在硬件设计方面做出些成绩。
参考文献
[1]夏宇闻.Verilog数字系统设计[M].北京:
北京航空航天大学出版社.2008.
[2]吴厚航.深入浅出玩转FPGA[M].北京:
北京航空航天大学出版社.2010.
[3]FPGA/CPLD组学小组.
[4]EDN博客.http:
//
附程序代码:
时钟分频程序模块
moduledivclk_clk1(CLK_LCD,rst,clk1);
inputCLK_LCD,rst;
outputclk1;
regclk1;
reg[15:
0]cnt2;
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
endmodule
moduledivclk_lcd(clk0,rst,clk_lcd);
inputclk0,rst;
outputclk_lcd;
regCLK_LCD;//LCD时钟信号
reg[23:
0]cnt1;
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
endmodule
计时调时模块
modulelcd_time_key(clk0,clk1,rst,key4,key3,
key2,key1,key0,month,day,hour,min,sec);
inputclk0,clk1,rst,key4,key3,key2,key1,key0;
outputmonth[7:
4],month[3:
0],day[7:
4],
day[3:
0],hour[7:
4],hour[3:
0],
min[7:
4],min[3:
0],sec[7:
4],sec[3:
0];
reg[7:
0]hour,min,sec;
reg[7:
0]month,day;
wireseccar,mincar;
always@(posedgetemp_sec)
begin
if(sec==8'h59)
begin
sec<=0;
end
elseif(sec[3:
0]==9)
begin
sec[3:
0]<=0;
sec[7:
4]<=sec[7:
4]+1;
end
else
sec[3:
0]<=sec[3:
0]+1;
end
assignseccar=(sec==8'h59)?
1:
0;
always@(negedgetemp_min)
begin
if(min==8'h59)
begin
min<=0;
end
elseif(min[3:
0]==9)
begin
min[3:
0]<=0;
min[7:
4]<=min[7:
4]+1;
end
else
min[3:
0]<=min[3:
0]+1;
end
assignmincar=(min==8'h59)?
1:
0;
always@(negedgetemp_hour)
begin
if(hour==8'h23)
begin
hour<=0;
end
elseif(hour[3:
0]==9)
begin
hour[3:
0]<=0;
hour[7:
4]<=hour[7:
4]+1;
end
elsehour[3:
0]<=hour[3:
0]+1;
end
always@(negedgetemp_month)
begin
if(month==8'h12)
begin
month<=0;
end
elseif(month[3:
0]==9)
begin
month[3:
0]<=0;
month[7:
4]<=month[7:
4]+1;
end
elsemonth[3:
0]<=month[3:
0]+1;
end
always@(negedgetemp_day)
begin
if(day==8'h31)
begin
day<=0;
end
elseif(day[3:
0]==9)
begin
day[3:
0]<=0;
day[7:
4]<=day[7:
4]+1;
end
elseday[3:
0]<=day[3:
0]+1;
end
reg[4:
0]key_rst;
always@(posedgeclk0ornegedgerst)
if(!
rst)key_rst<=5'b11111;
elsekey_rst<={key4,key3,key2,key1,key0};
reg[4:
0]key_rst_r;
always@(posedgeclk0ornegedgerst)
if(!
rst)key_rst_r<=5'b11111;
elsekey_rst_r<=key_rst;
wire[4:
0]key_an=key_rst_r&(~key_rst);
reg[19:
0]cnt;
always@(posedgeclk0ornegedgerst)
if(!
rst)cnt<=20'd0;
elseif(key_an)cnt<=20'd0;
elsecnt<=cnt+1'b1;
reg[4:
0]low_sw;
always@(posedgeclk0ornegedgerst)
if(!
rst)low_sw<=5'b11111;
elseif(cnt==20'hfffff)
low_sw<={key4,key3,key2,key1,key0};
reg[4:
0]low_sw_r;
always@(posedgeclk0ornegedgerst)
if(!
rst)low_sw_r<=5'b11111;
elselow_sw_r<=low_sw;
wire[4:
0]sw_ctrl=
low_sw_r[4:
0]&(~low_sw[4:
0]);
wiretemp_sec,temp_min,
temp_hour,temp_month,tri_day;
assigntemp_sec=sw_ctrl[0]|clk1;
assigntemp_min=sw_ctrl[1]|seccar;
assigntemp_hour=sw_ctrl[2]|mincar;
assigntemp_month=sw_ctrl[3];
assigntemp_day=sw_ctrl[4];
endmodule
液晶初始化模块:
reg[8:
0]state;parameter
IDLE=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;
regflag;
reg[6:
0]char_cnt;
reg[7:
0]data_disp;
assignRW=1'b0;ssignEN=(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)//StateMachine
begin
if(!
rst)
begin
state<=IDLE;
DATA<=8'bzzzzzzzz;
char_cnt<=5'b0;
flag<=1'b1;
end
else
begin
case(state)
IDLE:
beginflag<=1'b1;
state<=CLEAR;
DATA<=8'bzzzzzzzz;
end
CLEAR:
beginstate<=SETFUNCTION;
DATA<=8'b00000001;end
SETFUNCTION:
begin
state<=SWITCHMODE;
DATA<=8'b00110000;end
SWITCHMODE:
begin
tate<=SETMODE;
DATA<=8'b00001100;
end
SETMODE:
beginstate<=SETDDRAM;
DATA<=8'b00000110;
end
beginstate<=SETDDRAM;
DATA<=8'b0001_0000;end
SETDDRAM:
begin
state<=WRITERAM;
if(char_cnt==0)begin
DATA<=8'b1000_0000;end
elseif(char_cnt==16)
begin
DATA<=8'b1001_0000;
end
elseif(char_cnt==32)begin
DATA<=8'b1000_1000;
end
elseif(char_cnt==48)
begin
DATA<=8'b1001_1000;
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;
elsestate<=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'ha2;
7'd3:
data_disp=8'ha0;
7'd4:
data_disp=8'hbb;
7'd5:
data_disp=8'hb6;
7'd6:
data_disp=8'hd3;
7'd7:
data_disp=8'had;
7'd8:
data_disp=8'hb9;
7'd9:
data_disp=8'he2;
7'd10:
data_disp=8'hc1;
7'd11:
data_disp=8'hd9;7'd12:
data_disp=8'ha2;
7'd13:
data_disp=8'ha0;
7'd14:
data_disp=8'ha2;
7'd15:
data_disp=8'ha0;
7'd16:
data_disp=8'ha2;
7'd17:
data_disp=8'ha0;
7'd18:
data_disp=8'hd6;
7'd19:
data_disp=8'hd8;
7'd20:
data_disp=8'hc7;
7'd21:
data_disp=8'hec;
7'd22:
data_disp=8'hd3;
7'd23:
data_disp=8'hca;
7'd24:
data_disp=8'hb5;
7'd25:
data_disp=8'he7;
7'd26:
data_disp=8'hb4;
7'd27:
data_disp=8'hf3;
7'd28:
data_disp=8'hd1;
7'd29:
data_disp=8'ha7;
7'd30:
data_disp=8'ha2;
7'd31:
data_disp=8'ha0;
7'd32:
data_disp=8'ha2;
7'd33:
data_disp=8'ha0;
7'd34:
data_disp=8'ha2;
7'd35:
data_disp=8'ha0;
7'd36:
data_disp=8'ha2;
7'd37:
data_disp=8'ha0;
7'd38:
data_disp=8'ha2;
7'd39:
data_disp=8'ha0;
7'd40:
data_disp=8'ha2;
7'd41:
data_disp=8'ha0;
7'd42:
data_disp=8'ha2;
7'd43:
data_disp=8'ha0;
7'd44:
data_disp=8'ha2;
7'd45:
data_disp=8'ha0;7'd46:
data_disp=8'ha2;
7'd47:
data_disp=8'ha0;
7'd48:
data_disp=".";
7'd49:
data_disp={4'b0011,month[7:
4]};
7'd50:
data_disp={4'b0011,month[3:
0]};
7'd51:
data_disp="-";
7'd52:
data_disp={4'b0011,day[7:
4]};
7'd53:
data_disp={4'b0011,day[3:
0]};
7'd54:
data_disp=8'ha2;
7'd55:
data_disp=8'ha0;
7'd56:
data_disp={4'b0011,h[7:
4]};
7'd57:
data_disp={4'b0011,h[3:
0]};
7'd58:
data_disp="-";
7'd59:
data_disp={4'b0011,m[7:
4]};
7'd60:
data_disp={4'b0011,m[3:
0]};
7'd61:
data_disp="-";
7'd62:
data_disp={4'b0011,s[7:
4]};
7'd63:
data_disp={4'b0011,s[3:
0]};
default:
data_disp=8'ha9;
endcase
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 广告 显示屏 设计