EDA数字钟设计实训报告.docx
《EDA数字钟设计实训报告.docx》由会员分享,可在线阅读,更多相关《EDA数字钟设计实训报告.docx(12页珍藏版)》请在冰豆网上搜索。
EDA数字钟设计实训报告
EDA实训报告
指导教师
朱小祥田欢
专业
电子信息工程技术
班级
电信1004班
姓名
张子维
日期
2012年5月21日—25日
一、实训目的
1、了解数字钟的工作原理。
2、进一步熟悉用VHDL语言编写驱动七段码管显示的代码。
3、掌握VHDL编写中的一些小技巧。
二、实训原理
多功能数字钟应该具有的功能有:
显示时-分-秒、整点报时、小时和分钟可调等基本功能。
首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从0~23时。
在实训中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从0~23,所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。
实训中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描确需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。
对于整点报时功能,用户可以根据系统的硬件结构和自身的具体要求来设计。
本实训设计的是当进行整点的倒计时5秒时,让LED来闪烁进行整点报时的提示。
三、实训内容
本实验的任务就是设计一个多功能数字钟,要求显示格式为小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在整点前5秒LED开始闪烁,过整点后,停止闪烁。
调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。
四、实训步骤
①认真听取老师介绍开发板硬件结构,仔细阅读EDA实训指导书,了解数字钟设计程序的大致过程。
②根据之前写过的“精确24秒倒计时”程序,将其中的各个模块程序进行修改。
③修改分频模块,将50MHZ分频为1HZ,即周期为1s。
④修改显示模块,使秒钟和分钟从00至59循环显示,秒钟每次从59跳到00,则分钟增加一分钟,使时钟从00至23循环显示,分钟每次从59跳到00,则时钟增加一小时,
⑤在结构体处添加信号声明,使时钟、分钟和秒钟之间的“——”显示出来,即00-00-00。
⑥添加按键模块,使S1,S2,分别控制时钟的加减,使S3,S4分别控制分钟的加减。
⑦添加整点报时程序,当秒钟显示到50时,蜂鸣器开始发声,直至秒钟显示为00时停止。
⑧完成整个程序后,设置引脚和端口,使其一一对应,然后编译仿真,硬件测试。
五、实训VHDL程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityshixunis
port
(clk:
instd_logic;
s1,s2,s3,s4:
instd_logic;
display:
outstd_logic_vector(7downto0);
seg_sel:
outstd_logic_vector(7downto0);
bell:
bufferstd_logic
);
end;
architecturertlofshixunis
signalsegbit:
std_logic_vector(7downto0);
signaldisP_decode:
std_logic_vector(7downto0);
signalsec1,sec10,disp_temp:
integerrange0to10;
signalg1,g2:
integerrange10to10;
signalmin1,min10:
integerrange0to9;
signalhour1,hour10:
integerrange0to9;
signalclk1hz:
std_logic;
signalcnt:
std_logic_vector(19downto0);
signaltone:
std_logic_vector(10downto0);
signaltone_count:
std_logic_vector(10downto0);
signaltone_index:
std_logic_vector(2downto0);
signaltime:
integerrange0to7;
signalclk2Mhz:
std_logic;
begin
display<=disP_decode;
seg_sel<=segbit;
process(clk)
variablecnt1:
integerrange0to49999999;
begin
ifclk'eventandclk='1'then
ifcnt1=49999999thencnt1:
=0;
else
ifcnt1<24999999then
clk1hz<='1';
elseclk1hz<='0';
endif;
cnt1:
=cnt1+1;
endif;
endif;
endprocess;
process(clk1hz)
begin
if(clk1hz'eventandclk1hz='1')then
if(sec1=9andsec10=5andmin1=9andmin10=5andhour1=3andhour10=2)then
sec1<=0;sec10<=0;min1<=0;min10<=0;hour1<=0;hour10<=0;
elsifs1='0'then
hour1<=hour1+1;
if(hour1=9)then
hour1<=0;
hour10<=hour10+1;
else
if(hour10=2andhour1=3)then
hour1<=0;hour10<=0;
endif;
endif;
elsifs2='0'then
hour1<=hour1-1;
if(hour10=0andhour1=0)then
hour1<=3;hour10<=2;
else
if(hour1=0)then
hour1<=9;
hour10<=hour10-1;
endif;
endif;
elsifs3='0'then
min1<=min1+1;
if(min1=9)then
min1<=0;
min10<=min10+1;
if(min10=5)then
min10<=0;
endif;
endif;
elsifs4='0'then
min1<=min1-1;
if(min1=0)then
min1<=9;
min10<=min10-1;
if(min10=0)then
min10<=5;
endif;
endif;
else
if(sec1=9)then
sec1<=0;
if(sec10=5)then
sec10<=0;
if(min1=9)then
min1<=0;
if(min10=5)then
min10<=0;
if(hour1=9)then
hour1<=0;
hour10<=hour10+1;
else
hour1<=hour1+1;
endif;
else
min10<=min10+1;
endif;
else
min1<=min1+1;
endif;
else
sec10<=sec10+1;
endif;
else
sec1<=sec1+1;
endif;
endif;
endif;
endprocess;
process(cnt(15downto13))
begin
ifclk='1'andclk'eventthen
cnt<=cnt+1;
casecnt(15downto13)is
when"000"=>segbit<="11111110";
when"001"=>segbit<="11111101";
when"010"=>segbit<="11111011";
when"011"=>segbit<="11110111";
when"100"=>segbit<="11101111";
when"101"=>segbit<="11011111";
when"110"=>segbit<="10111111";
when"111"=>segbit<="01111111";
whenothers=>null;
endcase;
endif;
endprocess;
process(segbit)
begin
casesegbitis
when"11111110"=>disp_temp<=sec1;
when"11111101"=>disp_temp<=sec10;
when"11111011"=>disp_temp<=g1;
when"11110111"=>disp_temp<=min1;
when"11101111"=>disp_temp<=min10;
when"11011111"=>disp_temp<=g2;
when"10111111"=>disp_temp<=hour1;
when"01111111"=>disp_temp<=hour10;
whenothers=>null;
endcase;
endprocess;
process(disp_temp)
begin
casedisp_tempis
when0=>disp_decode<="11000000";
when1=>disp_decode<="11111001";
when2=>disp_decode<="10100100";
when3=>disp_decode<="10110000";
when4=>disp_decode<="10011001";
when5=>disp_decode<="10010010";
when6=>disp_decode<="10000010";
when7=>disp_decode<="11111000";
when8=>disp_decode<="10000000";
when9=>disp_decode<="10010000";
when10=>disp_decode<="10111111";
whenothers=>disp_decode<="11111111";
en