设计多功能手表.docx

上传人:b****6 文档编号:12908501 上传时间:2023-06-09 格式:DOCX 页数:16 大小:126.50KB
下载 相关 举报
设计多功能手表.docx_第1页
第1页 / 共16页
设计多功能手表.docx_第2页
第2页 / 共16页
设计多功能手表.docx_第3页
第3页 / 共16页
设计多功能手表.docx_第4页
第4页 / 共16页
设计多功能手表.docx_第5页
第5页 / 共16页
设计多功能手表.docx_第6页
第6页 / 共16页
设计多功能手表.docx_第7页
第7页 / 共16页
设计多功能手表.docx_第8页
第8页 / 共16页
设计多功能手表.docx_第9页
第9页 / 共16页
设计多功能手表.docx_第10页
第10页 / 共16页
设计多功能手表.docx_第11页
第11页 / 共16页
设计多功能手表.docx_第12页
第12页 / 共16页
设计多功能手表.docx_第13页
第13页 / 共16页
设计多功能手表.docx_第14页
第14页 / 共16页
设计多功能手表.docx_第15页
第15页 / 共16页
设计多功能手表.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

设计多功能手表.docx

《设计多功能手表.docx》由会员分享,可在线阅读,更多相关《设计多功能手表.docx(16页珍藏版)》请在冰点文库上搜索。

设计多功能手表.docx

设计多功能手表

设计多功能手表

深圳大学实验报告

课程名称:

数字系统设计

实验项目名称:

设计一个多功能手表

学院:

信息工程学院

专业:

电子信息工程

指导教师:

徐渊

报告人:

学号:

班级:

实验时间:

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秒

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2