自动打铃EDA设计报告.docx
《自动打铃EDA设计报告.docx》由会员分享,可在线阅读,更多相关《自动打铃EDA设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
自动打铃EDA设计报告
考试序号:
##
自动打铃系统设计说明书
学生姓名:
###
学号:
########
专业班级:
#######
报告提交日期:
2014.12.5
湖南理工学院物电学院
第一部分:
设计题目及总体要求简介
1.设计题目:
自动打铃系统设计。
2.设计要求简介:
①基本计时和显示功能(24小时制显示),包括:
1.24小时制显示;
2.动态扫描显示;
3.显示格式:
88-88-88;
②能设置当前时间(含时、分);
③能实现基本打铃功能,规定:
06:
00起床铃,打铃5s;
clk:
标准时钟信号;
clk_1k:
扫描时钟;
mode:
功能控制信号;
为0:
计时功能;
为1:
闹钟功能;
为2:
手动校时功能;
turn:
接按键,在手动校时功能时,选择是调整小时,还是分钟;
change:
接按键,手动调整时,每按一次,计数器加1;
alert:
输出到扬声器的信号,用于产生打铃声;
第二部分:
设计方案说明
设计方案:
自动打铃是一种现代提醒工具,有着广泛的应用。
例如学校的上课铃声,每天在既定的时间响铃,这就是自动打铃系统的具体应用之一。
打铃系统设置从早上的6点开始起床打铃,铃声持续响5秒。
利用IF语句控制打铃的时间,在规定的时间内到打设既定的打铃间隔时间时给出一个5秒的高电平脉冲,让铃声连续响起。
还需要一个校时功能。
本次设计主要采用VerilogHDL硬件描述性语言、分模块法去设计。
由于这次开发板提供的是50M晶振,所以首先要对时钟进行分频,当计时到2FA_F07F时完成1s分频,通过计时到60s产生分钟进位信号,再通过60分钟产生进位信号。
最后通过6个寄存器对时分进行锁存最终输出到8个数码管上完成显示。
当显示时钟和默认闹钟时钟相等时,驱动打铃模块。
通过mode,turn,change查看闹钟,时钟显示,调整时钟。
总体设计框图如下图所示。
部分软件控制流程示意图如下:
开始
mode
校时功能
闹铃功能
计时功能
调整小时
调整小时
调整分钟
调整分钟
返回计时
返回计时
turn
LD_hour亮
LD_min亮
LD_alert亮
change
第三部分:
各部分功能介绍及程序(部分)
1.系统框图
顶层电路主要由FPGA实现,输出信号接到八位数码管、LED指示灯及扬声器上,系统框图如图所示
clk
clk_1k
mode
change
alert
LD_alert
LD_hour
LD_min
ture
(hour、min、sec)out
Altera
顶层模块
2.选择的FPGA芯片及配置
▪EP1K10TC100-3
本系统采用ACEX1K系列的EP1K10TC100-3,由于FPGA器件的规模可以做的非常大,其内部主要由大量纵横排列的逻辑块(LogicBlock,LB)构成,大量这样的逻辑块通过内部连线和开关就可以实现非常复杂的逻辑功能。
由于FPGA是基于SRAM结构的,具有易失性,在此采用被动串行配置(PS)方式,由外部的计算机控制配置过程,使用USB-Blaster下载电缆下载程序。
ACEX系列是当今AlteraCPLD中应用前景最好的器件系列之一[1,2]。
该系列的FPGA由逻辑阵列块,LAB、嵌入式阵列块EAB、快速互联一计IO单元构成,每个逻辑阵列块包含8个逻辑单元LE(logicelement)和一个局部互联。
每个逻辑单元则有一个4输入查找表(LUT)、一个可编程触发器、快速进位链、级连链组成,对个LAB和多个EAB则可通过快速通道互相连接。
EAB是ACEX系列器件在结构设计上的一个重要的部件,他是输入端口和输出端口都带有的触发器的一种灵活的RAM快,其主要功能是实现一些规模不太大FIFO,ROM、RAM和双端口RAM等
▪8段共阴极LED显示(seg3-seg10)
▪扬声器
▪开关及校时按钮
3.各模块(元件)说明
▪各子模块说明
(1)校正模块:
在实验中,产生基准信号,校正时间。
always@(posedgeclk)
beginclk_2hz<=~clk_2hz;
if(sound==3)beginsound<=0;ear<=1;end//ear用于产生或屏蔽声音信号
elsebeginsound<=sound+1;ear<=0;end
end
always@(posedgeclk_2hz)//用4hz的输入信号产生1hz的时基信号
clk_1hz<=~clk_1hz;
(2)计时和闹铃模块下的调整模块:
当mode信号为0时,在基准时钟信号clk下,系统按60进制加1计时;当mode信号为2时,若检测到turn信号的脉冲时,在校对小时和分钟之间作切换,当前的调整状态可通过LD_hour或LD_min指示灯查看,change信号每来一个脉冲,计数器加1,这样可以将系统当前的时间调到任意时刻。
当mode信号为2,在检测到turn信号的脉冲时,闹铃定时在小时和分钟之间作切换,当前的调整状态可通过LD_hour或LD_min指示灯查看,change信号每来一个脉冲,计数器加1,这样可以给系统设置任意时刻的闹铃,设置完成之后LD_alert指示灯会常亮。
always@(negedgeclk)//如果长按"change"信号,则生成信号用于连续快速加1
if(count2)begin
if(loop1==3)num1<=0;
elsebeginloop1<=loop1+1;num1<=0;end
end
elsebeginloop1<=0;num1<=0;end
always@(negedgeclk)//产生num2信号
if(countb)begin
if(loop2==3)num2<=1;
elsebeginloop2<=loop2+1;num2<=0;end
end
elsebeginloop2<=0;num2<=0;end
always@(negedgeclk)
if(count1)begin
if(loop3==3)num3<=1;
elsebeginloop3<=loop3+1;num3<=0;end
end
elsebeginloop3<=0;num3<=0;end
always@(negedgeclk)
if(counta)begin
if(loop4==3)num4<=1;
elsebeginloop4<=loop4+1;num4<=0;end
end
elsebeginloop4<=0;num4<=0;end
assignct1=(num3&clk)|(!
num3&m_clk);//ct1用于及计时、较时中的分钟计数
assignct2=(num1&clk)|(!
num1&count2);//ct2用于定时状态下调整分钟信号
assigncta=(num4&clk)|(!
num3&h_clk);//cta用于及计时、较时中的小时计数
assignctb=(num2&clk)|(!
num3&countb);//ctb用于定时状态下调整小时信号
always@(posedgeclk_1hz)//秒计时和秒调整进程
if(!
(sec1^8'h59)|turn&(!
m))
beginsec1<=0;if(!
(turn&(!
m)))minclk<=1;end//按住"turn"秒信号清0
elsebegin
if(sec1[3:
0]==4'b1001)
beginsec1[3:
0]<=4'b0000;sec1[7:
4]<=sec1[7:
4]+1;end
elsesec1[3:
0]<=sec1[3:
0]+1;minclk<=0;
end
assignm_clk=minclk||count1;
always@(posedgect1)//分计时和分调整进程
begin
if(min1==8'h59)beginmin1<=0;hclk<=1;end
elsebeginif(min1[3:
0]==9)
beginmin1[3:
0]<=0;min1[7:
4]<=min1[7:
4]+1;end
elsemin1[3:
0]<=min1[3:
0]+1;hclk<=0;
end
end
assignh_clk=hclk||counta;
always@(posedgecta)//小时计时和小时调整进程
if(hour1==8'h23)hour1<=0;
elseif(hour1[3:
0]==9)
beginhour1[7:
4]<=hour1[7:
4]+1;hour1[3:
0]<=0;end
elsehour1[3:
0]<=hour1[3:
0]+1;
always@(posedgect2)//闹钟定时功能中的分钟调整进程
if(amin==8'h59)amin<=0;
elseif(amin[3:
0]==9)
beginamin[7:
4]<=amin[7:
4]+1;amin[3:
0]<=0;end
elseamin[3:
0]<=amin[3:
0]+1;
always@(posedgectb)//闹钟定时功能中的小时调整进程
if(ahour==8'h23)ahour<=0;
elseif(ahour[3:
0]==9)
beginahour[7:
4]<=ahour[7:
4]+1;ahour[3:
0]<=0;end
elseahour[3:
0]<=ahour[3:
0]+1;
always//闹铃功能
if((min1==amin)&&(hour1==ahour)&&(amin|ahour)&&(!
change))
//若按住键不放,可屏蔽闹铃音
if(sec1<8'h20)alert1<=1;//控制闹铃的时间长短
elsealert1<=0;
elsealert1<=0;
always//时、分、秒的显示控制
case(m)
3'b00:
beginhour<=hour1;min<=min1;sec<=sec1;
end//计时状态下的时、分、秒显示
3'b01:
beginhour<=ahour;min<=amin;sec<=8'hzz;
end//定时状态下的时、分、秒显示
3'b10:
beginhour<=h