设计多功能手表.docx
《设计多功能手表.docx》由会员分享,可在线阅读,更多相关《设计多功能手表.docx(16页珍藏版)》请在冰点文库上搜索。
设计多功能手表
设计多功能手表
深圳大学实验报告
课程名称:
数字系统设计
实验项目名称:
设计一个多功能手表
学院:
信息工程学院
专业:
电子信息工程
指导教师:
徐渊
报告人:
学号:
班级:
实验时间:
2011-12-05~2012-01-01
实验报告提交时间:
教务处制
实验名称:
设计一个多功能手表
实验目的:
设计一个多功能手表,它具有计时和闹钟功能。
此手表有三个按键(B1,B2,B3),用更改模式,设定时间,设定闹钟。
按下键B1可以改变模式,按一下由时间变为闹钟,再按一下由闹钟变回时间。
实验要求:
1)时间模式操作显示时间并指出是上午还是下午(即A.M.或P.M.),时间显示格式为hh:
mm:
ss(A或P,12小时制)。
在时间模式下,按下B3可以停止闹钟;按下B2进行时间设定,再按一次,设置小时,再按一次,设置分钟,再按一次,设置秒,再按下B2则返回到时间模式。
在进行时间小时和分钟设定时,每按下一次B3可以在小时和时钟上加1。
2)闹钟模式操作显示闹钟时间并指出是上午还是下午(即A.M.或P.M.),其显示格式为hh:
mm(A或P)。
按下键B2进入闹钟设定状态,再按B2,设置小时,再按B2,设置分钟,再按B2,返回闹钟显示界面。
在进行闹钟小时和分钟设置时,每按一次就可以在小时或分钟上加1.在闹钟显示界面下,如果按下B3,则闹钟复位。
一旦闹钟设定的时间到达,则持续响铃30秒,随后闹钟自动关闭,也可以在响铃的同时按下B3停止闹钟。
3)假定系统的输入时钟为200Hz,相关B1,B2,B3信号在一个时钟周期内为1。
实验内容与步骤:
1.ASM图:
2.实验代码:
libraryIEEE;
useIEEE.std_logic_1164.ALL;
useIEEE.std_logic_unsigned.ALL;entitywatchis
port(clk,B1,B2,B3:
instd_logic;
seg7disp11,seg7disp10,seg7disp9,seg7disp8,seg7disp7,
seg7disp6,seg7disp5,seg7disp4,seg7disp3,seg7disp2,
seg7disp1,seg7disp0:
outstd_logic_vector(6downto0);
alarmtime:
outstd_logic);
endwatch;
architecturewatchofwatchis
typestate_typeis(timer,set_hour,set_min,alarm,set_ahour,set_amin);
signalstate:
state_type:
=timer;
signalhours1,hours2,ahours1,ahours2,mins1,mins2,
amins1,amins2,secs1,secs2:
std_logic_vector(3downto0):
="0000";
signalam_pm,aam_pm:
std_logic_vector(3downto0):
="1010";
signalcnt1,cnt2:
std_logic_vector(7downto0):
="00000000";
signalrst,inc1,inc2,inc3,alarm_off,set_timer,ring:
std_logic:
='0';
typesevsegarrayisarray(0to11)ofstd_logic_vector(6downto0);
constantseg7rom:
sevsegarray:
=("0111111","0000110","1011011","1001111",
"1100110","1101101","1111100","0000111","1111111","1100111","1110111","1110011");
--activehighwith"gfedcba"order
begin
process(clk,state,B1,B2,B3)
begin
if(clk'eventandclk='1')then
ifcnt1="11001000"then--计时功能
cnt1<="00000000";
inc1<='1';
else
cnt1<=cnt1+1;
endif;
if(inc1='1'andset_timer='0')then
if(secs1=9)thensecs1<="0000";
if(secs2=5)thensecs2<="0000";
elsesecs2<=secs2+1;
endif;
elsesecs1<=secs1+1;
inc1<='0';
endif;
if(secs1=9andsecs2=5)theninc2<='1';
elseinc2<='0';
endif;
endif;
if(inc2='1')then
if(mins1=9)thenmins1<="0000";
if(mins2=5)thenmins2<="0000";
elsemins2<=mins2+1;
endif;
elsemins1<=mins1+1;
endif;
if(mins1=9andmins2=5)theninc2<='1';
elseinc2<='0';
endif;
endif;
if(inc3='1')then
if(hours2=1andhours1=2)thenhours2<="0000";hours1<="0001";
else
if(hours1=9)thenhours1<="0000";hours2<="0001";
elsehours1<=hours1+1;
endif;
if(hours2=1)and(hours1=1)then
am_pm(3downto0)<=am_pm(3downto1)&(notam_pm(0));
endif;
endif;
endif;
casestateis
whentimer=>--时间模式
if(B1='1')thenstate<=alarm;
elsif(B2='1')thenstate<=set_hour;
elsif(B3='1')thenalarm_off<='1';
endif;
whenset_hour=>--时间模式设置小时
set_timer<='1';
if(B2='1')thenstate<=set_min;
elsif(B3='1')then
if(hours2=1andhours1=2)thenhours2<="0000";hours1<="0001";
else
if(hours1=9)thenhours1<="0000";hours2<="0001";
elsehours1<=hours1+1;
endif;
if(hours2=1)and(hours1=1)then
am_pm(3downto0)
<=am_pm(3downto1)&(notam_pm(0));
endif;
endif;
endif;
whenset_min=>--时间模式设置分钟
if(B2='1')thenstate<=timer;set_timer<='0';
elsif(B3='1')then
if(mins1=9)thenmins1<="0000";
if(mins2=5)thenmins2<="0000";
elsemins2<=mins2+1;
endif;
elsemins1<=mins1+1;
endif;
if(mins1=9andmins2=5)theninc2<='1';
elseinc2<='0';
endif;
endif;
whenalarm=>--闹钟模式
if(B1='1')thenstate<=timer;
elsif(B2='1')thenstate<=set_ahour;
elsif(B3='1')thenrst<='1';
ifrst='1'then
ahours1<="0000";ahours2<="0000";amins1<="0000";amins2<="0000";
alarm_off<='1';
endif;
endif;
whenset_ahour=>--闹钟模式设置小时
if(B2='1')thenstate<=set_amin;
elsif(B3='1')then
if(ahours2=1andahours1=2)then
ahours2<="0000";ahours1<="0001";
else
if(ahours1=9)thenahours1<="0000";ahours2<="0001";
elseahours1<=ahours1+1;
endif;
if(ahours2=1)and(ahours1=1)then
aam_pm(3downto0)
<=aam_pm(3downto1)&(notaam_pm(0));
endif;
endif;
endif;
whenset_amin=>--闹钟模式设置分钟
if(B2='1')thenstate<=alarm;
elsif(B3='1')then
if(amins1=9)thenamins1<="0000";
if(amins2=5)thenamins2<="0000";
elseamins2<=amins2+1;
endif;
elseamins1<=amins1+1;
endif;
endif;
endcase;
if(hours1=ahours1)and(hours2=ahours2)and(mins1=amins1)
and(mins2=amins2)and(am_pm=aam_pm)and(secs1=0)
and(secs2=0)and(alarm_off='0')then--闹钟=时间
ring<='1';
endif;
if(ring='1')then
alarmtime<='1';
cnt2<=cnt2+1;
endif;
if(cnt2=30)or(alarm_off='1')then--闹钟关闭
ring<='0';cnt2<="00000000";alarmtime<='0';
endif;
endif;
endprocess;
------------------数码管显示---------------------------------------------------seg7disp11<=seg7rom(CONV_INTEGER(hours2));
seg7disp10<=seg7rom(CONV_INTEGER(hours1));
seg7disp9<=seg7rom(CONV_INTEGER(mins2));
seg7disp8<=seg7rom(CONV_INTEGER(mins1));
seg7disp7<=seg7rom(CONV_INTEGER(secs2));
seg7disp6<=seg7rom(CONV_INTEGER(secs1));
seg7disp5<=seg7rom(CONV_INTEGER(am_pm));
seg7disp4<=seg7rom(CONV_INTEGER(ahours2));
seg7disp3<=seg7rom(CONV_INTEGER(ahours1));
seg7disp2<=seg7rom(CONV_INTEGER(amins2));
seg7disp1<=seg7rom(CONV_INTEGER(amins1));
seg7disp0<=seg7rom(CONV_INTEGER(aam_pm));
endwatch;
3.testbench代码:
LIBRARYIEEE;
USEIEEE.std_logic_1164.ALL;
ENTITYtb_watchIS
ENDtb_watch;
ARCHITECTUREbehaviorOFtb_watchIS
COMPONENTwatch
PORT(
clk:
INstd_logic;
B1:
INstd_logic;
B2:
INstd_logic;
B3:
INstd_logic;
seg7disp11:
OUTstd_logic_vector(6downto0);
seg7disp10:
OUTstd_logic_vector(6downto0);
seg7disp9:
OUTstd_logic_vector(6downto0);
seg7disp8:
OUTstd_logic_vector(6downto0);
seg7disp7:
OUTstd_logic_vector(6downto0);
seg7disp6:
OUTstd_logic_vector(6downto0);
seg7disp5:
OUTstd_logic_vector(6downto0);
seg7disp4:
OUTstd_logic_vector(6downto0);
seg7disp3:
OUTstd_logic_vector(6downto0);
seg7disp2:
OUTstd_logic_vector(6downto0);
seg7disp1:
OUTstd_logic_vector(6downto0);
seg7disp0:
OUTstd_logic_vector(6downto0);
alarmtime:
OUTstd_logic
);
ENDCOMPONENT;
--Inputs
signalclk:
std_logic:
='0';
signalB1:
std_logic:
='0';
signalB2:
std_logic:
='0';
signalB3:
std_logic:
='0';
--Outputs
signalseg7disp11:
std_logic_vector(6downto0);
signalseg7disp10:
std_logic_vector(6downto0);
signalseg7disp9:
std_logic_vector(6downto0);
signalseg7disp8:
std_logic_vector(6downto0);
signalseg7disp7:
std_logic_vector(6downto0);
signalseg7disp6:
std_logic_vector(6downto0);
signalseg7disp5:
std_logic_vector(6downto0);
signalseg7disp4:
std_logic_vector(6downto0);
signalseg7disp3:
std_logic_vector(6downto0);
signalseg7disp2:
std_logic_vector(6downto0);
signalseg7disp1:
std_logic_vector(6downto0);
signalseg7disp0:
std_logic_vector(6downto0);
signalalarmtime:
std_logic;
--Clockperioddefinitions
constantclk_period:
time:
=5ms;
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
watchPORTMAP(
clk=>clk,
B1=>B1,
B2=>B2,
B3=>B3,
seg7disp11=>seg7disp11,
seg7disp10=>seg7disp10,
seg7disp9=>seg7disp9,
seg7disp8=>seg7disp8,
seg7disp7=>seg7disp7,
seg7disp6=>seg7disp6,
seg7disp5=>seg7disp5,
seg7disp4=>seg7disp4,
seg7disp3=>seg7disp3,
seg7disp2=>seg7disp2,
seg7disp1=>seg7disp1,
seg7disp0=>seg7disp0,
alarmtime=>alarmtime
);
--Clockprocessdefinitions
clk_process:
process
begin
clk<='0';
waitforclk_period/2;
clk<='1';
waitforclk_period/2;
endprocess;
--Stimulusprocess
stim_proc:
process
begin
--holdresetstatefor100ns.
waitforclk_period;
B1<='1';--进入闹钟模式
waitforclk_period;
B1<='0';
B2<='1';--闹钟模式小时设置
waitforclk_period;
B2<='0';
foriin1to15loop--小时设置为下午3点
waitforclk_period;
B3<='1';
waitforclk_period;
B3<='0';
endloop;
waitforclk_period;
B2<='1';--闹钟模式分钟设置
waitforclk_period;
B2<='0';
foriin1to30loop--分钟设置为30分
waitforclk_period;
B3<='1';
waitforclk_period;
B3<='0';
endloop;
waitforclk_period;
B2<='1';--回到闹钟模式
waitforclk_period;
B2<='0';
waitforclk_period;
B1<='1';--进入时间模式
waitforclk_period;
B1<='0';
B2<='1';--时间模式小时设置
waitforclk_period;
B2<='0';
foriin1to15loop--小时设置为下午3点
waitforclk_period;
B3<='1';
waitforclk_period;
B3<='0';
endloop;
waitforclk_period;
B2<='1';--时间模式分钟设置
waitforclk_period;
B2<='0';
foriin1to29loop--分钟设置为29分
waitforclk_period;
B3<='1';
waitforclk_period;
B3<='0';
endloop;
waitforclk_period;
B2<='1';--回到时间模式
waitforclk_period;
B2<='0';
waitforclk_period;
B3<='1';--关闭闹钟
waitforclk_period;
B3<='0';
waitforclk_period*10;
--insertstimulushere
wait;
endprocess;
END;
数据处理分析:
1.综合电路图:
2.仿真波形图:
为了方便看代码,数码管的显示解释如下:
"0111111"----‘0’;"0000110"----‘1’;"1011011"----‘2’;"1001111"----‘3’;
"1100110"----‘4’;"1101101"----‘5’;"1111100"----‘6’;"0000111"----‘7’;"1111111"----‘8’;"1100111"----‘9’;"1110111"----‘A’;"1110011"----‘P’。
(1)闹钟模式设置小时:
B3连续加15次。
小时到10时显示由09变为10。
加到11时,aam_pm由AM变为PM。
(2)闹钟模式设置分钟:
B3连续加30次。
加到10次时显示由09变为10:
此时设置好闹钟时间为下午3:
30.
(3)时钟模式设置小时:
B3连续加15次。
小时到10时显示由09变为10。
加到11时,am_pm由AM变为PM。
且在时钟设置时,时间停止。
(4)时钟模式设置分钟:
B3连续加29次。
加到10次时显示由09变为10:
此时设置好时间为下午3:
29.
(5)回到时钟模式,秒钟随着clk发生变化。
当到59秒时,分钟加1,秒钟回到00秒。
(6)当闹钟设置时间等于时钟时间时,响铃。
但信号传递间存在延时,将近1分钟后alarmtime才由0变成1,闹钟经过150ms后自动关闭。
(7)在时钟模式下按下B3,关闭闹钟。
此时闹钟设置时间等于时钟时间时,不再响铃。
实验结果与讨论:
经过多天的酝酿和修改代码,到最后初见波形图,整个过程痛并快乐着。
特别是当代码显示没有错误且仿真结果出现波形时,还是很开心的。
也不枉花了不少的时间去折腾出这个代码。
代码中闹钟自动停止时间是150ms,而非题目要求的30秒