EDA多功能数字钟设计.docx
- 文档编号:9291817
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:16
- 大小:620.79KB
EDA多功能数字钟设计.docx
《EDA多功能数字钟设计.docx》由会员分享,可在线阅读,更多相关《EDA多功能数字钟设计.docx(16页珍藏版)》请在冰豆网上搜索。
EDA多功能数字钟设计
EDA实训报告
指导教师
朱小祥游家发
专业
应用电子技术
班级
应用电子1002
姓名
邹立丙
日期
2012年6月4日—7日
一、实训目的
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、S3和S4,S1、S2调节小时,每按下一次,小时增加或减少一个小时,S3、S4调整分钟,每按下一次,分钟增加或减少一分钟。
另外用按键作为系统时钟复位,复位后全部显示00-00-00。
四、实训步骤
根据实训要求分步实现数字钟的相关功能:
(1)分别给予位选信号1KHz和秒脉冲1Hz,2MHz的分频信号。
(2)利用1Hz分频信号编写出简易的时钟。
(3)在简易时钟的基础上外加BT1,BT2,BT3,BT4,和RST五个按键分别实现小时的加减,分钟的加减和复位清零功能。
(4)根据条件拓展实现实训要求所示的蜂鸣器和发光二极管的闪烁功能。
(5)在对上面的步骤进行操作时,每完成一段小程序都要通过编译仿真,通过后进行下一步,保证一次通过。
五、实训VHDL程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitycounteris
port(clk,k1,k2,k3,k4,clr:
instd_logic;
y:
outstd_logic_vector(6downto0);
q:
outstd_logic_vector(15downto0);
speak:
bufferstd_logic;
seg_sel:
bufferstd_logic_vector(2downto0));
endcounter;
architecturevhdofcounteris
signalcii,clk1s:
std_logic;
signalclk1ms,full:
std_logic;
signalsec,min:
INTEGERRANGE0TO59;
signalhour:
INTEGERRANGE0TO23;
signaldata:
STD_LOGIC_VECTOR(3DOWNTO0);
signalsl,sh,ml,mh,hl,hh:
STD_LOGIC_VECTOR(3DOWNTO0);
signalcount1:
INTEGERRANGE0TO6;
signaltone:
std_logic_vector(10downto0);
signaltone_count:
std_logic_vector(10downto0);
signaltime:
integerrange0to7;
signalclk2Mhz:
std_logic;
signaltone_index:
std_logic_vector(2downto0);
begin
p1:
process(clk)
variablecnt:
std_logic_vector(15downto0);
begin
if(clk='1'andclk'event)then
ifcnt<24999then
cnt:
=cnt+1;
else
cnt:
=(others=>'0');
endif;
endif;
ifcnt=24999then
full<='1';
elsefull<='0';
endif;
endprocess;
p2:
process(full)
variablecntl:
std_logic;
begin
iffull'eventandfull='1'then
cntl:
=notcntl;
ifcntl='1'then
clk1ms<='1';
else
clk1ms<='0';
endif;
endif;
endprocess;
p3:
process(clk)
variablecqi:
std_logic_vector(24downto0);
begin
if(clk='1'andclk'event)then
ifcqi<24999999then
cqi:
=cqi+1;
else
cqi:
=(others=>'0');
endif;
endif;
ifcqi=24999999then
cii<='1';
elsecii<='0';
endif;
endprocess;
p4:
process(cii)
variablectl:
std_logic;
begin
ifcii'eventandcii='1'then
ctl:
=notctl;
ifctl='1'then
clk1s<='1';
else
clk1s<='0';
endif;
endif;
endprocess;
p5:
process(clk1s)
begin
if(clk1s'eventandclk1s='1')then
ifclr='0'thensec<=0;min<=0;hour<=0;
elsifk1='0'then
ifhour=23then
hour<=0;
else
hour<=hour+1;
endif;
elsifk2='0'then
ifhour=0then
hour<=23;
else
hour<=hour-1;
endif;
elsifk3='0'then
ifmin=59then
min<=0;
else
min<=min+1;
endif;
elsifk4='0'then
ifmin=0then
min<=59;
else
min<=min-1;
endif;
elsifsec=59thensec<=0;
ifmin=59thenmin<=0;
ifhour=23thenhour<=0;
else
hour<=hour+1;
endif;
else
min<=min+1;
endif;
else
sec<=sec+1;
endif;
endif;
endprocess;
p6:
process(sec)
begin
casesecis
when0|10|20|30|40|50=>sl<="0000";
when1|11|21|31|41|51=>sl<="0001";
when2|12|22|32|42|52=>sl<="0010";
when3|13|23|33|43|53=>sl<="0011";
when4|14|24|34|44|54=>sl<="0100";
when5|15|25|35|45|55=>sl<="0101";
when6|16|26|36|46|56=>sl<="0110";
when7|17|27|37|47|57=>sl<="0111";
when8|18|28|38|48|58=>sl<="1000";
when9|19|29|39|49|59=>sl<="1001";
whenothers=>sl<=null;
endcase;
casesecis
when0|1|2|3|4|5|6|7|8|9=>sh<="0000";
when10|11|12|13|14|15|16|17|18|19=>sh<="0001";
when20|21|22|23|24|25|26|27|28|29=>sh<="0010";
when30|31|32|33|34|35|36|37|38|39=>sh<="0011";
when40|41|42|43|44|45|46|47|48|49=>sh<="0100";
when50|51|52|53|54|55|56|57|58|59=>sh<="0101";
whenothers=>sh<=null;
endcase;
endprocess;
p7:
process(min)
begin
caseminis
when0|10|20|30|40|50=>ml<="0000";
when1|11|21|31|41|51=>ml<="0001";
when2|12|22|32|42|52=>ml<="0010";
when3|13|23|33|43|53=>ml<="0011";
when4|14|24|34|44|54=>ml<="0100";
when5|15|25|35|45|55=>ml<="0101";
when6|16|26|36|46|56=>ml<="0110";
when7|17|27|37|47|57=>ml<="0111";
when8|18|28|38|48|58=>ml<="1000";
when9|19|29|39|49|59=>ml<="1001";
whenothers=>ml<=null;
endcase;
caseminis
when0|1|2|3|4|5|6|7|8|9=>mh<="0000";
when10|11|12|13|14|15|16|17|18|19=>mh<="0001";
when20|21|22|23|24|25|26|27|28|29=>mh<="0010";
when30|31|32|33|34|35|36|37|38|39=>mh<="0011";
when40|41|42|43|44|45|46|47|48|49=>mh<="0100";
when50|51|52|53|54|55|56|57|58|59=>mh<="0101";
whenothers=>mh<=null;
endcase;
endprocess;
p8:
process(hour)
begin
casehouris
when0|10|20=>hl<="0000";
when1|11|21=>hl<="0001";
when2|12|22=>hl<="0010";
when3|13|23=>hl<="0011";
when4|14=>hl<="0100";
when5|15=>hl<="0101";
when6|16=>hl<="0110";
when7|17=>hl<="0111";
when8|18=>hl<="1000";
when9|19=>hl<="1001";
whenothers=>hl<=null;
endcase;
casehouris
when0|1|2|3|4|5|6|7|8|9=>hh<="0000";
when10|11|12|13|14|15|16|17|18|19=>hh<="0001";
when20|21|22|23=>hh<="0010";
whenothers=>mh<=null;
endcase;
endprocess;
p9:
process(clk1ms)
begin
if(clk1ms'eventandclk1ms='1')then
ifseg_sel="111"then
seg_sel<="000";
else
seg_sel<=seg_sel+1;
endif;
endif;
endprocess;
p10:
process(seg_sel,sl,sh,ml,mh,hl,hh)
begin
caseseg_selis
when"000"=>data<=sl;
when"001"=>data<=sh;
when"010"=>data<="1111";
when"011"=>data<=ml;
when"100"=>data<=mh;
when"101"=>data<="1111";
when"110"=>data<=hl;
when"111"=>data<=hh;
whenothers=>data<="0000";
endcase;
endprocess;
p11:
process(data)
begin
casedatais
when"0000"=>y<="0111111";
when"0001"=>y<="0000110";
when"0010"=>y<="1011011";
when"0011"=>y<="1001111";
when"0100"=>y<="1100110";
when"0101"=>y<="1101101";
when"0110"=>y<="1111101";
when"0111"=>y<="0000111";
when"1000"=>y<="1111111";
when"1001"=>y<="1101111";
when"1111"=>y<="1000000";
whenothers=>y<="0000000";
endcase;
endprocess;
p12:
process(sec,min)
begin
ifclk1s'eventandclk1s='1'then
ifmin=59and(sec>53orsec=0)then
ifcount1<5thencount1<=count1+1;
elsecount1<=0;
endif;
endif;
endif;
endprocess;
p13:
process(count1)
begin
casecount1is
when0=>q<="0000000000000000";
when1=>q<="1111111111111111";
when2=>q<="0000000000000000";
when3=>q<="1111111111111111";
when4=>q<="0000000000000000";
when5=>q<="1111111111111111";
when6=>q<="0000000000000000";
whenothers=>null;
endcase;
endprocess;
p14:
process(clk)
variablecnt1:
integerrange0to49;
begin
ifclk='1'andclk'eventthen
ifcnt1=49thencnt1:
=0;
else
ifcnt1<25thenclk2Mhz<='1';
elseclk2Mhz<='0';
endif;
cnt1:
=cnt1+1;
endif;
endif;
endprocess;
p15:
process(clk1s)
begin
if(clk1s'eventandclk1s='1')then
if(time=7)then
time<=0;
else
time<=time+1;
endif;
endif;
endprocess;
p16:
process(clk1s)
begin
if(clk1s'eventandclk1s='1')then
casetimeis
when0=>tone<="11111111111";--2047
when1=>tone<="01100000101";--773
when2=>tone<="01110010000";--912
when3=>tone<="10000001100";--1036
when4=>tone<="10001011100";--1116
when5=>tone<="10010101101";--1197
when6=>tone<="10100001010";--1290
when7=>tone<="10101011100";--1372
whenothers=>tone<="11111111111";--others:
nooutput
endcase;
endif;
endprocess;
p17:
process(clk2Mhz)
begin
if(sec>49andmin=59)then
if(clk2Mhz'eventandclk2Mhz='1')then
if(tone_count=16#7ff#)then
tone_count<=tone;
if(tone<2047)then
speak<=notspeak;
endif;
else
tone_count<=tone_count+1;
endif;
endif;
else
speak<='1';
endif;
endprocess;
endvhd;
六、管脚分配
七、实训结果
将程序输入到FPGA开发板上,时、分、秒分别从“00”开始计数,当没按下按键的时候,它自然计数并且正确,当有键按下时:
S1控制时的加,S2控制时的减,S3控制分的加,S4控制分的减,再调整时,分中的任意一个时,其它的不变。
当分到达“59”并且秒到达“50”之后,整点报时开始,再此前提下秒到达“55”之后,开发板上的16个发光二极管开始闪烁,过整点后,停止闪烁和报时。
当按下清零键BT1之后八个数码管显示“00—00—00”
八、实训总结
把在实训中出现哪些问题?
如何解决?
实训体会、实训建议等等写出来,不能少于500字。
注意不要大话空话,不要相互抄袭,否则实训不予过关!
!
!
我照着以前写的计数器程序改动一点点慢慢的输入程序,先写个简易时钟,下载到开发板上,只是管脚分配出出错了一下,并没其他区问题,改下就好了,没什么大的问题;简易时钟编写好后,开始考虑加入按键,这个问题最难解决,最后通过参考资料,利用if….else语句解决了这个问题。
根据条件拓展实现实训要求所示的需要添加蜂鸣器和发光二极管的闪烁功能,利用老师提供的让蜂鸣器叫的程序,经过反复在线调试达到了这个目的,最后就只剩闪烁这一个功能了,利用以前编写的流水灯程序完成了这个功能。
在编写每一个模块时,都进行了单独的仿真编译,最后一次通过,我觉得挺欣慰。
利用这次实训让我熟练掌握了相关软件的操作,锻炼了思维能力。
希望以后能够多一些这样的动手实训。
在本次实训中让我深刻体会到一个大的项目,不能有一点差错,不然也不能实现功能,就是要认真仔细,有耐心,才能成功。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 多功能 数字 设计