VHDL实验报告自动打铃系统曹刚DOC.docx
- 文档编号:8703421
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:21
- 大小:190.61KB
VHDL实验报告自动打铃系统曹刚DOC.docx
《VHDL实验报告自动打铃系统曹刚DOC.docx》由会员分享,可在线阅读,更多相关《VHDL实验报告自动打铃系统曹刚DOC.docx(21页珍藏版)》请在冰豆网上搜索。
VHDL实验报告自动打铃系统曹刚DOC
第二次实验
自动打铃系统(14)
姓名:
曹刚
学号:
1228401082
班级:
12电子信息工程
一.实验目的
1、综合运用EDA技术,完成自动打铃系统的设计与操作;
2、进一步熟悉EDA技术的开发流程,掌握文件编辑、编译、仿真、下载验证等环节的实现方法和应用技巧;
3、通过本实践环节,培养科学和严谨的工作作风。
二.实验要求
1.用6个数码管实现时,分、秒的数字显示;
2.能设置当前时间;
3.能实现上、下课打铃及起床铃、熄灯铃功能;
4.能实现整点报时功能,并能控制启动和关闭;
5.能实现调整打铃时间和间歇长短的功能;
三.实验设计说明
根据设计要求,可以将自动打铃系统的划分为以下几个模块:
1.状态机:
系统有多种显示模式,设计中将每种模式当成一种状态,采用用状态机来进行模式切换,将其作为系统的中心控制模块;
2.计时调时模块:
用于完成基本的数字钟功能;
3.打铃时间设定模块:
系统中要求打铃时间可调,此部分功能相对独立,单独用一个模块实现;
4.打铃长度设定模块:
用以设定打铃时间的长短;
5.显示控制模块:
根据当前时间和打铃时间等信息决定当前显示的内容;
6.打铃控制模块:
用于控制铃声音乐的输出;
7.分频模块、分位模块、七段数码管译码模块等;
以上各模块可用下图表示其间的联系。
四.实验原理
用层次化设计的方法以VHDL语言编程实现以下功能:
【1】具有“时”、“分”、“秒”计时功能;时为24进制,分和秒都为60进制。
【2】具有消抖功能:
手工按下键盘到是否这个过程大概50ms左右,在按下开始到弹簧片稳,定接触这段时间为5-10ms,从释放到弹片完全分开也是5-10ms,在达到稳定接触和完全分开的微观过程中,电平是时高时低的,因此如果在首次检测到键盘按下时延时10ms再检测就不会检测到抖动的毛刺电平了。
64Hz的信号周期为15.6ms,正适合做消抖信号。
【3】具有校时和清零功能,能够用4Hz脉冲对“小时”和“分”进行调整,并可进行秒清零;
【4】具有整点报时功能。
在59分51秒、53秒、55秒、57秒发出低音512Hz信号,在59分59秒发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。
【5】具有一键设定闹铃及正常计时与闹铃时间的显示转换。
闹时时间为一分钟。
【6】具有学校的上下课铃,熄灯铃的功能,并且可以控制打铃时间的长短。
总体的设计框图如下
图自动打铃系统总体设计框图
五.实验模块
1.时钟模块设计:
时钟模块是学校打铃器最基本的模块,主要实现基本计时、调时、调分功能,包括秒计数模块、分计数模块、时计数模块。
1秒计数模块:
如图所示为秒计数模块符号图。
输入端口clr是秒计数模块的清零信号,也是整个数字中的使能信号,低电平有效;clk是秒脉冲输入端口,外接分频模块频率为1Hz的时钟信号;输出端口cq0[3..0]是秒时钟的低位,cq1[3..0]是高位;co端口是进位输出端口,当秒计数到59时输出高电平,其它时候输出低电平。
模块图如图。
六十进制带进位计数器,可清零,当q0计满9后q1增加1,当q0满9且q1记满5,q1、q0同时归零,co输出为高电平。
q1为十位q0为个位。
②分计数模块:
如图所示为分计数模块符号图。
输入端口clr1是分计数模块的清零信号,也是整个数字中的使能信号,低电平有效;clk1是秒脉冲输入端口端口;cq2[3..0]是分计时的低位,cq3[3..0]是分计时的高位;cout端口是进位输出端口,接时计数的clk1作为时钟输入,当秒计数到59时输出高电平,其它时候输出低电平。
③时技术模块:
如图所示为时计数模块符号图。
输入端口clr是时计数模块的清零信号,也是整个数字中的使能信号,低电平有效;clk是秒脉冲输入端口输出端口;q0[3..0]是分计时的低位,q1[3..0]是分计时的高位。
此为24进制无进位计数器,当计数信号计到23后再检测到计数信号时会自动归零。
带清零,clk输入为分秒进位相与的结果。
q1为十位,q0为个位。
2.分频模块设计:
晶体振荡器是构成数字时钟的核心,振荡器的稳定度及频率的精度决定了数字钟计时的准确程度,它保证了时钟的走时准确及稳定。
石英晶体的选频特性非常好,只有某一频率点的信号可以通过它,其它频率段的信号均会被它所衰减,而且振荡信号的频率与振荡电路中的R、C元件的数值无关[7]。
模块图如图所示。
由四个分频器构成,输入信号in_clk为1024Hz脉冲信号。
把输入的8192Hz信号分频为四个脉冲信号,即1Hz的秒脉冲,4Hz的校时、校分脉冲,64Hz的消抖脉冲,以及512Hz和1024Hz的蜂鸣器低音输入。
3.消抖模块设计:
由于大部分按键式机械触点,在触点闭合和断开时都会产生抖动,为避免抖动引起的误动作造成系统的不稳定,就要求消除按键的抖动,确保按键每按一次只做一次响应。
在本设计初期完成后,下载程序测试时,拨动按键或者按下按键时显示出现异常,这就需要加入按键消抖模块。
模块的实现方法是先判断是否有按键按下,如有按键按下则延时一段时间,待抖动过去之后再读行线状态,如果仍有低电平行线,则确定有按键按下,然后产生一个有按键按下的信号。
该模块有一个时钟输入端口,输入时钟信号是分频出来的64Hz的时钟信号;对sa校时信号、sb校分信号、sc秒清零信号、sd闹时设置信号进行防抖动处理。
是由四个两级d触发器构成的,分别对输入的sa、sb、sc、sd信号的相邻两个上升沿进行比较以确定按键的按下,从而达到消抖的目的。
模块图如下:
4.闹钟模块设计:
模块如图所示。
一键设定闹铃时间,内部由四个d触发器构成。
当确定sd键按下时,将当前时间的小时和分的个位十位分别存入四个d触发器内,作为闹时时间。
ml_o[3..0]、mh_o[3..0]、hl_o[3..0]、hh_o[3..0]分别为闹钟时间的分低位、分高位、时低位和时高位。
5.调时模块设计:
如图所示为调时模块符号图。
本设计的调时模块类似于二选一数据选择器,输入端口alarm是调时模块的调时开关,当为高电平是输出a的数据,当为低电平时输出b的数据;a端接上一个计时模块的进位输出;b端接分频器的输出时钟脉冲;y为模块的输出,作为计时模块的输入时钟。
由此可知当alarm为低电平时可进行调时、调分。
6.整点报时和闹钟模块设计:
模块图如图所示。
在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。
当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。
闹时时间为一分钟。
7.打铃模块设计:
如表所示为学校作息时间。
学校作息时间上课下课时间共包括18个时间点,将此写入程序中,当时钟时间与这些时间相同时,输出高电平,与时钟信号相与,作为报警模块的输入。
表2-1学校作息时间
春季作息时间
上课
下课
上午
08:
00
08:
40
08:
50
09:
30
09:
40
10:
20
10:
30
11:
10
11:
10
12:
00
下午
14:
00
14:
40
14:
50
15:
30
15:
40
16:
20
16:
30
17:
10
如图所示为打铃模块设计框图。
模块包括作息选择和时间比较部分,其设计思路为:
将时钟的时高位、时低位、分高位、分低位分别于表2.1中的打铃时间数据进行比较,若相等,则Q_Y输出高电平,否则输出低电平。
7.显示模块设计:
对于本自动打铃系统的设计,必不可少的就是显示模块的设计,因为根据设计要求,时钟的计时显示、闹钟的时间设定、蜂鸣器报警时长的设定,都需要数码管来显示,实际应用的时候,用实验箱上的数码管显示是最直观的表现。
六.实验程序及仿真
1.时钟模块设计:
(1)秒计数模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitysecondIS
port(clk,clr:
instd_logic;
co:
outstd_logic;
cq0:
outstd_logic_vector(3downto0);
cq1:
outstd_logic_vector(3downto0));
ENDsecond;
ARCHITECTUREbehaveofsecondis
SIGNALd:
std_logic_vector(3downto0);
SIGNALg:
std_logic_vector(3downto0);
BEGIN
process(clk,clr,d,g)
BEGIN
if(clr='1')then
d<="0000";
g<="0000";
elsif(clk'EVENTandclk='1')then
if(d=9andg=5)then
co<='1';
else
co<='0';
endif;
if(d=9)then
d<="0000";
if(g=5)then
g<="0000";
else
g<=g+1;
endif;
else
d<=d+1;
endif;
endif;
endprocess;
cq0<=d;cq1<=g;
endbehave;
波形仿真:
(2)分计数模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityminuteIS
port(clk1,clr1:
instd_logic;
co:
outstd_logic;
cq0:
outstd_logic_vector(3downto0);
cq1:
outstd_logic_vector(3downto0));
ENDminute;
ARCHITECTUREbehaveofminuteis
SIGNALd:
std_logic_vector(3downto0);
SIGNALg:
std_logic_vector(3downto0);
BEGIN
process(clk1,clr1,d,g)
BEGIN
if(clr1='1')then
d<="0000";
g<="0000";
elsif(clk1'EVENTandclk1='1')then
if(d=9andg=5)then
co<='1';
else
co<='0';
endif;
if(d=9)then
d<="0000";
if(g=5)then
g<="0000";
else
g<=g+1;
endif;
else
d<=d+1;
endif;
endif;
endprocess;
cq0<=d;cq1<=g;
endbehave;
波形仿真和秒计时相同。
(3)时技术模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
USEIEEE.STD_LOGIC_ARITH.ALL;
entityhourIS
port(clk3,rst3,m:
instd_logic;
cq4:
outstd_logic_vector(3downto0);
cq5:
outstd_logic_vector(3downto0));
ENDhour;
ARCHITECTUREbehaveofhouris
SIGNALd:
std_logic_vector(3downto0);
SIGNALg:
std_logic_vector(3downto0);
BEGIN
process(clk3,rst3,m,d,g)
BEGIN
if(rst3='1')then
d<="0000";
g<="0000";
elsif(clk3'EVENTandclk3='1')then
if(m='0')then
if(d=9or(d=1andg=1))then
d<="0000";
if(g=1)then
g<="0000";
else
g<=g+1;
endif;
else
d<=d+1;
endif;
else
if(d=9or(d=3andg=2))then
d<="0000";
if(g=2)then
g<="0000";
else
g<=g+1;
endif;
else
d<=d+1;
endif;
endif;
endif;
endprocess;
cq4<=d;cq5<=g;
endbehave;
波形仿真如下:
2.分频模块设计:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
USEIEEE.STD_LOGIC_ARITH.ALL;
entitydivis
port(in_clk:
instd_logic;
clk_1,clk_4,clk_64,clk_512,clk_1024:
outstd_logic);
enddiv;
architectureoneofdivis
signala,b,c,d,e:
std_logic;
signalc1,c4,c64,c512,c1024:
integerrange8192downto0;
begin
process(in_clk)
begin
ifin_clk'eventandin_clk='1'then
ifc1024>=7thenc1024<=0;e<=note;elsec1024<=c1024+1;endif;
ifc512>=15thenc512<=0;d<=notd;elsec512<=c512+1;endif;
ifc64>=127thenc64<=0;c<=notc;elsec64<=c64+1;endif;
ifc4>=2047thenc4<=0;b<=notb;elsec4<=c4+1;endif;
ifc1>=8191thenc1<=0;a<=nota;elsec1<=c1+1;endif;
endif;
endprocess;
clk_1<=a;
clk_4<=b;
clk_64<=c;
clk_512<=d;
clk_1024<=e;
endone;
波形仿真如下:
3.消抖模块设计:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
USEIEEE.STD_LOGIC_ARITH.ALL;
entityxdis
port(clk_64,sa,sb,sc,m,k2:
instd_logic;
hj,mj,sclr,sdo,ml,k2j:
outstd_logic);
endxd;
architectureoneofxdis
begin
process(clk_64)
variablesa_n,sa_p,sb_n,sb_p,sc_n,sc_p,m_n,m_p,k2_p,k2_n:
std_logic;
begin
ifclk_64'eventandclk_64='1'then
sa_p:
=sa_n;sa_n:
=sa;
sb_p:
=sb_n;sb_n:
=sb;
sc_p:
=sc_n;sc_n:
=sc;
m_p:
=m_n;m_n:
=m;
k2_p:
=k2_n;k2_n:
=k2;
ifsa_p=sa_nthenhj<=sa;endif;
ifsb_p=sb_nthenmj<=sb;endif;
ifsc_p=sc_nthensclr<=sc;endif;
ifm_p=m_nthenml<=m;endif;
ifk2_p=k2_nthenk2j<=k2;endif;
endif;
endprocess;
endone;
波形仿真如下:
4.闹钟模块设计:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
USEIEEE.STD_LOGIC_ARITH.ALL;
entitynzis
port(sd:
instd_logic;
hh,hl,mh,ml:
instd_logic_vector(3downto0);
hh_o,hl_o,mh_o,ml_o:
outstd_logic_vector(3downto0));
endnz;
architectureoneofnzis
begin
process(sd,hh,hl,mh,ml)
begin
ifsd'EVENTandsd='1'then
hh_o<=hh;hl_o<=hl;mh_o<=mh;ml_o<=ml;endif;
endprocess;
endone;
波形仿真如下图:
5.调时模块设计:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
USEIEEE.STD_LOGIC_ARITH.ALL;
entityx21is
port(alarm,a,b:
instd_logic;
y:
outstd_logic);
endx21;
architectureoneofx21is
begin
process(alarm,a,b)
begin
ifalarm='0'theny<=a;elsey<=b;
endif;
endprocess;
endone;
波形仿真如下图:
6.整点报时和闹钟模块设计:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
USEIEEE.STD_LOGIC_ARITH.ALL;
entityvoiceis
port(min1,min0,sec1,sec0,hh,hl,mh,ml,hou0,hou1:
instd_logic_vector(3downto0);
in_512,in_1024:
instd_logic;
q:
outstd_logic);
endvoice;
architectureoneofvoiceis
begin
process(min1,min0,sec1,sec0)
begin
ifmin1="0101"andmin0="1001"andsec1="0101"then
ifsec0="0001"orsec0="0011"orsec0="0101"orsec0="0111"thenq<=in_512;
elsifsec1="0101"andsec0="1001"thenq<=in_1024;
elseq<='0';
endif;
elseq<='0';
endif;
ifmin1=mhandmin0=mlandhou1=hhandhou0=hlthenq<=in_1024;
endif;
endprocess;
endone;
波形仿真如下图:
7.打铃模块设计:
libraryieee;
useieee.std_logic_1164.all;
entitycomp_timeis
port(q_ha,q_ma:
instd_logic_vector(3downto0);
q_hb:
instd_logic_vector(3downto0);
q_mb:
instd_logic_vector(3downto0);
Q_Y:
outstd_logic);
endcomp_time;
architectureaofcomp_timeis
signalqtime:
std_logic_vector(15downto0);
begin
qtime<=q_hb&q_ha&q_mb&q_ma;
process(qtime)
begin
caseqtimeis:
when"00000"=>Q_Y<='1';when"00000"=>Q_Y<='1';
when"10000"=>Q_Y<='1';when"10000"=>Q_Y<='1';
when"00000"=>Q_Y<='1';when"00000"=>Q_Y<='1';
when"10000"=>Q_Y<='1';when"10000"=>Q_Y<='1';
when"00000"=>Q_Y<='1';when"00000"=>Q_Y<='1';
when"00000"=>Q_Y<='1';when"00000"=>Q_Y<='1';
when"10000"=>Q_Y<='1';when"10000"=>Q_Y<='1';
when"00000"=>Q_Y<='1';when"00000"=>Q_Y<='1';
when"10000"=>Q_Y<='1';when"10000"=>Q_Y<='1';
whenothers=>Q_Y<='0';
endcase;
endprocess;
enda;
七.引脚映射
本次设计我们采用GW48EDA实验箱,选择芯片EP1K30TC144-3,选择模式0,引脚锁定如下表所示:
Node
Pin
1
CLK
56
2
sa
30
3
sb
31
4
sc
32
5
p
33
6
m
36
7
clr
37
8
sec03
67
9
sec02
65
10
sec01
42
11
sec00
41
12
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 实验 报告 自动 打铃 系统 DOC
![提示](https://static.bdocx.com/images/bang_tan.gif)