自动打铃EDA设计报告Word文件下载.docx
- 文档编号:20766427
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:19
- 大小:287.74KB
自动打铃EDA设计报告Word文件下载.docx
《自动打铃EDA设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《自动打铃EDA设计报告Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
设计方案说明
设计方案:
自动打铃是一种现代提醒工具,有着广泛的应用。
例如学校的上课铃声,每天在既定的时间响铃,这就是自动打铃系统的具体应用之一。
打铃系统设置从早上的6点开始起床打铃,铃声持续响5秒。
利用IF语句控制打铃的时间,在规定的时间内到打设既定的打铃间隔时间时给出一个5秒的高电平脉冲,让铃声连续响起。
还需要一个校时功能。
本次设计主要采用VerilogHDL硬件描述性语言、分模块法去设计。
由于这次开发板提供的是50M晶振,所以首先要对时钟进行分频,当计时到2FA_F07F时完成1s分频,通过计时到60s产生分钟进位信号,再通过60分钟产生进位信号。
最后通过6个寄存器对时分进行锁存最终输出到8个数码管上完成显示。
当显示时钟和默认闹钟时钟相等时,驱动打铃模块。
通过mode,turn,change查看闹钟,时钟显示,调整时钟。
总体设计框图如下图所示。
部分软件控制流程示意图如下:
第三部分:
各部分功能介绍及程序(部分)
1.系统框图
顶层电路主要由FPGA实现,输出信号接到八位数码管、LED指示灯及扬声器上,系统框图如图所示
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<
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<
elsebeginloop1<
=loop1+1;
num1<
end
elsebeginloop1<
num1<
always@(negedgeclk)//产生num2信号
if(countb)begin
if(loop2==3)num2<
=1;
elsebeginloop2<
=loop2+1;
num2<
end
elsebeginloop2<
num2<
always@(negedgeclk)
if(count1)begin
if(loop3==3)num3<
elsebeginloop3<
=loop3+1;
num3<
elsebeginloop3<
num3<
if(counta)begin
if(loop4==3)num4<
elsebeginloop4<
=loop4+1;
num4<
elsebeginloop4<
num4<
assignct1=(num3&
clk)|(!
num3&
m_clk);
//ct1用于及计时、较时中的分钟计数
assignct2=(num1&
num1&
count2);
//ct2用于定时状态下调整分钟信号
assigncta=(num4&
h_clk);
//cta用于及计时、较时中的小时计数
assignctb=(num2&
countb);
//ctb用于定时状态下调整小时信号
always@(posedgeclk_1hz)//秒计时和秒调整进程
if(!
(sec1^8'
h59)|turn&
(!
m))
beginsec1<
(turn&
m)))minclk<
end//按住"
turn"
秒信号清0
elsebegin
if(sec1[3:
0]==4'
b1001)
beginsec1[3:
0]<
=4'
b0000;
sec1[7:
4]<
=sec1[7:
4]+1;
elsesec1[3:
=sec1[3:
0]+1;
minclk<
end
assignm_clk=minclk||count1;
always@(posedgect1)//分计时和分调整进程
begin
if(min1==8'
h59)beginmin1<
hclk<
elsebeginif(min1[3:
0]==9)
beginmin1[3:
min1[7:
=min1[7:
elsemin1[3:
=min1[3:
hclk<
assignh_clk=hclk||counta;
always@(posedgecta)//小时计时和小时调整进程
if(hour1==8'
h23)hour1<
elseif(hour1[3:
beginhour1[7:
=hour1[7:
hour1[3:
elsehour1[3:
=hour1[3:
always@(posedgect2)//闹钟定时功能中的分钟调整进程
if(amin==8'
h59)amin<
elseif(amin[3:
beginamin[7:
=amin[7:
amin[3:
elseamin[3:
=amin[3:
always@(posedgectb)//闹钟定时功能中的小时调整进程
if(ahour==8'
h23)ahour<
elseif(ahour[3:
beginahour[7:
=ahour[7:
ahour[3:
elseahour[3:
=ahour[3:
always//闹铃功能
if((min1==amin)&
&
(hour1==ahour)&
(amin|ahour)&
change))
//若按住键不放,可屏蔽闹铃音
if(sec1<
8'
h20)alert1<
//控制闹铃的时间长短
elsealert1<
always//时、分、秒的显示控制
case(m)
3'
b00:
beginhour<
=hour1;
min<
=min1;
sec<
=sec1;
end//计时状态下的时、分、秒显示
b01:
=ahour;
=amin;
=8'
hzz;
end//定时状态下的时、分、秒显示
b10:
end//校时状态下的时、分、秒显示
endcase
(3)模式控制子模块:
此模块通过mode信号0、1、2三种状态的控制,使系统分别在计时、闹铃、校时三种模式下工作。
always@(posedgemode)//mode信号控制系统在三种功能间的转换
beginif(m==2)m<
elsem<
=m+1;
end
always@(posedgeturn)
fm<
=~fm;
always//产生count1,count2,counta,countb四个信号
case(m)
2:
beginif(fm)
begincount1<
=change;
{LD_min,LD_hour}<
=2;
else
begincounta<
{counta,countb}<
end
1:
begincount2<
else
begincountb<
{count1,countb}<
=2'
b00;
default:
{count1,count2,counta,countb,LD_min,LD_hour}<
endcase
(4)六点闹铃5s模块
assignLD_alert=(ahour|amin)?
1:
0;
assignalert=((alert1)?
clk_1k&
clk:
0)|alert2;
always
if((hour1==8'
h06)&
(min1==8'
h00)&
(sec1<
h05)||(!
(hour1|min1|sec1)))
if(sec1<
8'
h05)alert2<
=ear&
clk_1k;
elsealert2<
=!
ear&
(5)数码管显示译码模块:
此模块用于将实时时间(包括调整过程中时钟的状态)输出到八位数码管中,通过sel信号位选的控制动态扫描显示当前时钟。
moduledecoder(decodeout,dec_in);
output[7:
0]decodeout;
input[3:
0]dec_in;
reg[7:
always@(dec_in)
begin
case(dec_in)
4'
h0:
decodeout<
=8'
b00111111;
h1:
b00000110;
h2:
b01011011;
h3:
b01001111;
h4:
b01100110;
h5:
b01101101;
h6:
b01111101;
h7:
b00000111;
h8:
b01111111;
h9:
b01101111;
h-:
b01000000;
endmodule
(6)数码管扫描时钟产生模块
modulecount8(out,clk);
output[2:
0]out;
inputclk;
reg[2:
out<
=out+1;
(7)数码管段选扫描模块
modulesegscan(dout,din,sel);
output[3:
0]dout;
input[31:
0]din;
input[2:
0]sel;
reg[3:
always@(sel,din)
case(sel)
3'
b000:
dout<
=din[31:
28];
b001:
=din[27:
24];
b010:
=din[23:
20];
b011:
=din[19:
16];
b100:
=din[15:
12];
b101:
=din[11:
8];
b110:
=din[7:
4];
b111:
=din[3:
0];
▪顶层文件说明
//定义各控制信号的控制变量的符号
modulealarmclock(clk,clk_1k,mode,change,turn,alert,hour,min,sec,LD_alert,LD_hour,LD_min);
inputclk,clk_1k,mode,change,turn;
outputalert,LD_alert,LD_hour,LD_min;
0]hour,min,sec;
0]hour,min,sec,hour1,min1,sec1,ahour,amin;
reg[1:
0]m,fm,num1,num2,num3,num4;
0]loop1,loop2,loop3,loop4,sound;
regLD_hour,LD_min;
regclk_1hz,clk_2hz,minclk,hclk;
regalert1,alert2,ear;
regcount1,count2,counta,countb;
wirect1,ct2,cta,ctb,m_clk,h_clk;
▪端口说明
LD_alert:
指示是否设置了闹钟功能;
LD_hour:
指示当前调整的是小时信号;
LD_min:
指示当前调整的是分钟信号;
hour[7..0]:
小时信号的输出
min[7..0]:
分钟信号的输出
sec[7..0]:
秒信号的输出
▪顶层文件引脚映射说明
输入引脚5个,输出引脚15个,引脚锁定关系如图所示
第四部分:
仿真结果(附图)
1.仿真结果图
1计时仿真图(以12:
59:
59计时进位为例)
计时进位具体理解为:
时钟每产生一个时钟脉冲,秒钟加一,秒钟总加满六十次时,产生一个进位,然后分钟加一,当分钟加满六十次时,产生一个时钟进位,然后时钟加一,当时钟加满二十四次时,进行一次初始化。
②手动校时仿真图(以手动调到7:
06为例)
手动校时具体操作为:
首先给mode输入2个连续的高脉冲使系统进入校时模式,再给change输入7个连续高脉冲使小时调到七,此过程中LD_hour指示灯亮,再给turn一个高脉冲切换到调分钟状态,再给change输入6个连续高脉冲使小时调到六分钟,此过程中LD_min指示灯亮,再给mode一个高脉冲回到计时模式,系统从07:
06分开始计时。
3打铃仿真图(以六点整闹铃为例,打铃5s)
2.说明
▪输入激励信号说明
标准时钟信号;
数码管扫描时钟;
功能模式控制信号,
闹铃功能;
校时功能;
接按键,在手动校时功能时,选择调整小时/分钟;
接按键,手动调整时,每按一次,计数器加1;
▪输出结果说明
输出到扬声器的信号,用于产生闹铃声;
接LED,灯亮表示设置了闹铃;
接LED,灯亮表示正在调整小时;
接LED,灯亮表示正在调整分钟。
hour,min,sec:
分别表示时\分\秒信号,采用BCD码计数,分别驱动6个数码显示管显示时间;
附录:
源程序(附注释)
(程序来自于《EDA技术与Verilog设计》P268~P272)
/*信号定义:
标准时钟信号;
扫描时钟;
功能控制信号:
为0:
为1:
为2:
接按键,在手动校时功能时,选择是调整小时,还是分钟;
接按键,手动调整时,每按一次,计数器加1;
hour,min,sec:
分别表示时\分\秒信号,采用BCD码计数,分别驱动6个数码显示管显示时间;
输出到扬声器的信号,用于产生打铃声;
LD_alert:
接发光二极管,指示是否设置了闹钟功能;
LD_hour:
接发光二极管,指示当前调整的是小时信号;
LD_min:
接发光二极管,指示当前调整的是分钟信号.*/
moduleclock(clk,clk_1k,mode,change,turn,alert,hour,min,sec,LD_alert,
LD_hour,LD_min);
regclk_1Hz,clk_2Hz,minclk,hclk;
beginclk_2Hz<
=~clk_2Hz;
end//ear用于产生或屏蔽声音信号
always@(posedgeclk_2Hz)//用4hz的输入信号产生1hz的时基信号
clk_1Hz<
=~clk_1Hz;
always@(posedgemode)//mode信号控制系统在三种功能间的转换
always//产生count1,count2,counta,countb四个信号
beginco
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动 打铃 EDA 设计 报告