基于EDA自动打铃系统设计课后作业资料.docx
《基于EDA自动打铃系统设计课后作业资料.docx》由会员分享,可在线阅读,更多相关《基于EDA自动打铃系统设计课后作业资料.docx(15页珍藏版)》请在冰点文库上搜索。
基于EDA自动打铃系统设计课后作业资料
考试序号:
**
自动打铃系统设计说明书
学生姓名:
***
学号:
*******1610
专业班级:
电子13-1BF
报告提交日期:
2015.11.18
理工学院物电学院
自动打铃系统设计
第一章设计题目及总体要求简介2
第二章设计方案说明3
第三章各部分功能介绍及程序4
3.1系统框图4
3.2选择的FPGA芯片及配置4
3.3各模块(元件)说明4
3.3.1计时器模块及手动校时模块4
3.3.2闹钟模块5
3.3.3显示模块6
3.3.4顶层设计及原理图7
附录:
8
第一章设计题目及总体要求简介
随着EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,对以硬件语言HDL为系统逻辑描述手段完成的设计文件,然后由是计算机自动地完成逻辑编辑、化简、分割、综合、优化、布局、布线、和仿真直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
本设计是基于VHDL语言的自动打铃系统。
在论文中,介绍了基于CHDL语言自动打铃系统的思路,整个系统需包含计时模块、校时模块、打铃模块。
在QuartusII开发环境中编译和仿真所设计的程序,并逐一调试验证程序的运行状况。
仿真和验证的结果证明,该设计方法切实可行,该打铃系统可以实现调时定时打铃功能,具有一定的实际应用性
本设计是基于VHDL的自动打铃系统,而自动打铃就像是现在的闹钟一样,起到提醒作用,6点起床闹铃,闹铃延迟时间5秒,本设计还是一个实时时钟,通过功能选择键选择计时功能、闹钟功能、手动校时功能。
第二章设计方案说明
自动打铃是一种现代提醒工具,有着广泛的应用,本设计具体实现如下:
(1)计时功能,24小时制显示、动态扫描显示、显示格式88-88-88;
(2)闹钟功能,6点闹钟,打铃5S;
(3)手动校时功能;可设置分、时;
为了高效率验证设计的结果另外增加了一个手动校时模块,用两个按键(选择调分或调时,计数器增加)。
在整个设计中,首先先做一个顶层模块,以top命名,然后再将各个模块在顶层模块中做好再生成各模块元器件,最后在top模块中将各个元件按功能要求连接好后进行编译,看是否通过,设置引脚后对顶层文件编译,在进行波形仿真,如果时序仿真与功能仿真的波形都正确,最后在实验箱上验证铃声是否能响起。
第三章各部分功能介绍及程序
3.1系统框图
图3.1自动打铃系统框图
3.2选择的FPGA芯片及配置
本设计选择ACEX1K系列EP1K100QC208-3芯片。
3.3各模块(元件)说明
3.3.1计时器模块及手动校时模块
计数器模块包括秒计数器模块、分计数器模块、时计数器模块以及功能按键的设计。
给定固定频率的时钟信号,输入计数60秒的计数器模块,等到计数器到60秒的瞬间,进位至60分的分计数器模块加1后,秒计数器模块同时清零从新计时,时计时模块与秒、分计时模块类似,当来自分计时模块的进位达到24瞬间,时计数器模块清零,再从零进行计时。
这样秒、分、时计时模块依次进行计时完成24进制的计时功能。
本设计将计时模块集成与一体,还添加了手动校时模块,通过编译后生成计时模块的元器件如图3.1。
图3.1计时、校时模块的元器件
通过对该模块的仿真,得到如图3.2的秒计时仿真图,图3.3的分计时仿真图,图3.4的时计时仿真图。
图3.2秒计时仿真图
图3.3分计时仿真图
图3.4时计时仿真图
校时模块的仿真图如图3.5所示。
图3.5校时按键功能仿真
模块说明:
K1按键是功能选择按键,若没按下,则默认为普通计时模式,若按下一次,则为闹钟模式,若按下两次,则为手动校时模块。
按键turn则为,在模式2下的分校时、时校时选择按键,而m则是哪种校时选择的状态显示变量,按键change则为校时增加按键。
由仿真波形可以看出:
在模式2中,当turn按下时m的值反转,校时由分校时变为时校时。
3.3.2闹钟模块
闹钟模块利用IF语句实现时间控制,在预设的铃声响起时间给alert一段连续的5S高电平。
通过对代码的编译后生成的的闹钟模块的元器件如图3.6所示:
图3.6闹钟模块元器件
仿真图如图3.7所示:
图3.7闹钟模块仿真图
仿真说明:
有仿真图可得,闹钟时间为06:
00,当到6:
00时,给alert一个高电平。
3.3.3显示模块
本设计用6位数码管显示,同过位选信号outb经过3-8译码后选择1位数码管,段选信号outa将要显示数据传给数码管,完成显示功能。
对代码编译、生成元器件如图3.8所示,仿真图如图3.9所示:
图3.8显示模块元器件
图3.9显示模块仿真图
3.3.4顶层设计及原理图
顶层模块说明:
顶层设计即把电路的各个模块放在一个顶层模块中,建立一个TOP顶层文件,在这个模块中分别完成每个模块的编译,统一设定结束时间我1MS。
在完成单个模块编译前先把这个模块置顶,成为活的窗口,否则就找不到对应的模块,就会出错。
但要注意的是,整个模块名一定为TOP,而且每个模块的名称一定要用英文,在一个单独的模块编译通过时要生成元器件,以便在之后的顶层文件画电路图时用到该元器件。
等各个模块都编译完成后,进行模块连接,将每个模块按照其所要求的实现的功能进行连接起来,然后进行引脚设定,设定后的顶层模块电路图如3.10所示:
图3.10顶层模块的电路图
顶层设计波形仿真:
先给一个CLK脉冲,若不按K1,则为默认的24小时计时器,按下K1的次数不同即选择不同的功能,1次为闹铃功能,2次为手动校时功能。
本设计中,闹铃功能,闹铃时间为6:
00。
附录:
源程序:
moduleconter_time(
SL,
SH,
ML,
MH,
HL,
HH,
clr,
clk,
k1,
turn,
change
);
output[3:
0]SL,SH,ML,MH,HL,HH;
inputclr,clk,k1,turn,change;
reg[3:
0]SL=0;
reg[3:
0]SH=0;
reg[3:
0]ML=0;
reg[3:
0]MH=0;
reg[3:
0]HL=0;
reg[3:
0]HH=0;
regm=1'b0;
reg[1:
0]mode=2'd0;
always@(posedgeclk)
begin
if(k1==1)
begin
if(mode==2)
mode<=0;
else
mode<=mode+1;
end
end
always@(posedgeclk)
begin
if(turn==1)
begin
m<=!
m;
end
end
always@(posedgeclk)
begin
if(clr==1)//1系统复位
begin
SL<=0;
SH<=0;
ML<=0;
MH<=0;
HL<=0;
HH<=0;
end
else
begin
if(SL==9)
begin
SL<=0;
if(SH==5)
begin
SH<=0;
if(ML==9)
begin
ML<=0;
if(MH==5)
begin
MH<=0;
if(HL==((HH==2)?
3:
9))
begin
HL<=0;
if(HH==2)
begin
HH<=0;
end
elseHH<=HH+1;
end
elsebegin
HL<=HL+1;
end
end
elseMH<=MH+1;
end
elsebegin
ML<=ML+1;
if(change==1)
if(mode==2)
begin
case(m)
1'd0:
ML<=ML+1;
1'd1:
HL<=HL+1;
endcase
end
end
end
elseSH<=SH+1;
end
elseSL<=SL+1;
end
end
endmodule
/*******************显示*********************/
moduleshow(clr,
clk,
outa,
outb,
sl,sh,
ml,mh,
hh,hl
);
input[3:
0]ml;
input[3:
0]mh;
input[3:
0]hl;
input[3:
0]hh;
input[3:
0]sl;
input[3:
0]sh;
inputclk;
inputclr;
output[7:
0]outa;
output[2:
0]outb;
reg[3:
0]mseg;
reg[2:
0]st;
reg[2:
0]outb;
reg[7:
0]outa;
always@(posedgeclkorposedgeclr)
begin
if(clr==1)
st<=3'b0;
else
st<=st+1;
end
always@(st)
begin
case(st)
3'b000:
begin
mseg<=sl;
outb<=3'b000;
end
3'b001:
begin
mseg<=sh;
outb<=3'b001;
end
3'b010:
begin
mseg<=ml;
outb<=3'b010;
end
3'b011:
begin
mseg<=mh;
outb<=3'b011;
end
3'b100:
begin
mseg<=hl;
outb<=3'b100;
end
3'b101:
begin
mseg<=hh;
outb<=3'b101;
end
default:
begin
mseg<=0;
end
endcase
end
always@(mseg)//数码管显示
begin
case(mseg)
4'b0001:
outa<=8'b00000110;
4'b0010:
outa<=8'b01011011;
4'b0011:
outa<=8'b01001111;
4'b0100:
outa<=8'b01100110;
4'b0101:
outa<=8'b01101101;
4'b0110:
outa<=8'b01111101;
4'b0111:
outa<=8'b00000111;
4'b1000:
outa<=8'b01111111;
4'b1001:
outa<=8'b01101111;
4'b0000:
outa<=8'b00111111;
default:
outa<=8'b00111111;
endcase
end
endmodule
/*******闹铃*********/
moduleclock(ml,
mh,
hl,
hh,
clk,
alert,
);
input[3:
0]ml,mh,hl,hh;
inputclk;
outputalert;
regalert;
always@(posedgeclk)
begin
if({hh,hl,mh,ml}==16'h0600)
begin
alert<=1'b1;
end
else
alert<=1'b0;
end
endmodule
致读者:
本设计为本人的课后作业,按键功能尚未实现,也有很多不正确的地方,望指正。
谢谢。