数字逻辑电路课设简易数字钟设计.docx
- 文档编号:15550120
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:12
- 大小:116.25KB
数字逻辑电路课设简易数字钟设计.docx
《数字逻辑电路课设简易数字钟设计.docx》由会员分享,可在线阅读,更多相关《数字逻辑电路课设简易数字钟设计.docx(12页珍藏版)》请在冰点文库上搜索。
数字逻辑电路课设简易数字钟设计
数字逻辑电路课程设计报告
多功能数组钟设计
一、设计要求:
通过MaxplusII使用VHDL语言编写设计一款多功能数字钟,具体功能如下:
1、时钟时,分,秒分别显示且能正确计数。
2、整点报时,时钟在将要到达整点的最后十秒,给予蜂鸣提示。
3、校时,可以通过相应开关按钮对时钟的时分秒进行调整。
4、闹钟,用户可以预设闹铃时刻,当时间到达该时刻时,发出蜂鸣提示。
二、总体设计:
1、
设计框图:
2、外部输入输出要求:
外部输入要求:
输入信号有1024Hz时钟信号、低电平有效的秒清零信号CLR、低电平有效的调分信号SETmin、低电平有效的调时信号SEThour;
外部输出要求:
整点报时信号SOUND(59分51/3/5/7秒时未500Hz低频声,59分59秒时为1kHz高频声)、时十位显示信号h1(a,b,c,d,e,f,g)、时个位显示信号h0(a,b,c,d,e,f,g)、分十位显示信号m1及分个位m0、秒十位s1及秒个位s0;数码管显示位选信号SEL0/1/2等三个信号。
3、各模块功能:
1)FREQ分频模块:
整点报时用的1024Hz与512Hz的脉冲信号,这里的输入信号是1024Hz信号,所以只要一个二分频即可;时间基准采用1Hz输入信号直接提供(当然也可以分频取得,这里先用的是分频取得的信号,后考虑到精度问题而采用硬件频率信号。
2)秒计数模块SECOND:
60进制,带有进位和清零功能的,输入为1Hz脉冲和低电平有效的清零信号CLR,输出秒个位、时位及进位信号CO。
3)分计数模块MINUTE
60进制,带有进位和置数功能的,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位及进位信号CO。
4)时计数模块HOUR:
24进制,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位。
5)扫描模块SELTIME:
输入为秒(含个/十位)、分、时、扫描时钟CLK1K,输出为D和显示控制信号SEL。
6)整点报时功能模块ALERT:
输入为分/秒信号,输出为高频声控Q1K和Q500。
7)译码显示功能模块DISPLAY:
输入为D,输出为Q。
4、VHDL程序设计:
1)分频模块(使用原理图输入):
2)秒模块程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitySECONDis
port(clk,clr:
instd_logic;
sec1,sec0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endSECOND;
architectureSECofSECONDis
begin
process(clk,clr)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclr='1'then
cnt1:
="0000";
cnt0:
="0000";
elsifclk'eventandclk='1'then
ifcnt1="0101"andcnt0="1000"then
co<='1';
cnt0:
="1001";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
else
cnt0:
="0000";
ifcnt1<"0101"then
cnt1:
=cnt1+1;
else
cnt1:
="0000";
co<='0';
endif;
endif;
endif;
sec1<=cnt1;
sec0<=cnt0;
endprocess;
endSEC;
3)分模块程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityMINUTEis
port(clk,en:
instd_logic;
min1,min0:
outstd_logic_vector(3downto0);
co:
outstd_logic);
endMINUTE;
architectureMINofMINUTEis
begin
process(clk,en)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclk'eventandclk='1'then
ifen='1'then
ifcnt1="0101"andcnt0="1000"then
co<='1';
cnt0:
="1001";
elsifcnt0<"1001"then
cnt0:
=cnt0+1;
else
cnt0:
="0000";
ifcnt1<"0101"then
cnt1:
=cnt1+1;
else
cnt1:
="0000";
co<='0';
endif;
endif;
endif;
endif;
min1<=cnt1;
min0<=cnt0;
endprocess;
endMIN;
4)时模块程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityHOURis
port(clk,en:
instd_logic;
h1,h0:
outstd_logic_vector(3downto0));
endHOUR;
architecturehour_arcofHOURis
begin
process(clk)
variablecnt1,cnt0:
std_logic_vector(3downto0);
begin
ifclk'eventandclk='1'then
ifen='1'then
ifcnt1="0010"andcnt0="0011"then
cnt1:
="0000";
cnt0:
="0000";
elsifcnt0>="1001"then
cnt1:
=cnt1+1;
cnt0:
="0000";
else
cnt0:
=cnt0+1;
endif;
endif;
endif;
h1<=cnt1;
h0<=cnt0;
endprocess;
endhour_arc;
5)位选模块程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitySELTIMEis
port(
clk:
instd_logic;
sec1,sec0,min1,min0,h1,h0:
instd_logic_vector(3downto0);
daout:
outstd_logic_vector(3downto0);
sel:
outstd_logic_vector(2downto0));
endSELTIME;
architecturefunofSELTIMEis
signalcount:
std_logic_vector(2downto0);
begin
sel<=count;
process(clk)
begin
if(clk'eventandclk='1')then
if(count>="101")then
count<="000";
else
count<=count+1;
endif;
endif;
casecountis
when"000"=>daout<=sec0;
when"001"=>daout<=sec1;
when"010"=>daout<=min0;
when"011"=>daout<=min1;
when"100"=>daout<=h0;
whenothers=>daout<=h1;
endcase;
endprocess;
endfun;
6)显示模块程序:
libraryieee;
XX文库-让每个人平等地提升自我useieee.std_logic_1164.all;
entityDISPLAYis
port(d:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(6downto0));
endDISPLAY;
architecturedisp_areofDISPLAYis
begin
process(d)
begin
casedis
when"0000"=>q<="0111111";
when"0001"=>q<="0000110";
when"0010"=>q<="1011011";
when"0011"=>q<="1001111";
when"0100"=>q<="1100110";
when"0101"=>q<="1101101";
when"0110"=>q<="1111101";
when"0111"=>q<="0100111";
when"1000"=>q<="1111111";
whenothers=>q<="1101111";
endcase;
endprocess;
enddisp_are;
7)整点报时模块:
libraryieee;
useieee.std_logic_1164.all;
entityALERTis
port(m1,m0,s1,s0:
instd_logic_vector(3downto0);
clk:
instd_logic;
q500,qlk:
outstd_logic);
endALERT;
architecturesss_arcofALERTis
begin
process(clk)
begin
ifclk'eventandclk='1'then
ifm1="0101"andm0="1001"ands1="0101"then
ifs0="0001"ors0="0011"ors0="0101"ors0="0111"then
q500<='1';
else
q500<='0';
endif;
endif;
ifm1="0101"andm0="1001"ands1="0101"ands0="1001"then
qlk<='1';
else
qlk<='0';
endif;
endif;
endprocess;
endsss_arc;
8)顶层原理图:
三、课程设计心得
一周半的数字逻辑电路课程设计如期结束,经过一个多周的努力付出,我终于设计出了自己的多功能数字钟。
一个多周的经历,让我感知到了自己以前完全没有体会到的感受,认识到了自己从理论转化到实际的能力的欠缺,还有很多事情需要自己去做来完善自己。
从简单而概括的问题出发到真正的实验成功,其间我经历很多的困难。
首先考虑的是,是否应该将整个数字钟全部用VHDL语言来描述?
完全用VHDL语言来描述整个数字钟显然要有十分清晰的设计思路和熟稔的VHDL语言描述能力,对于我这样的初学者的确有很大的困难,于是我放弃了完全用描述语言来实现数字钟的方法,转而将整个数字钟划分成几个模块来实现,每个模块可以用VHDL语言来描述,也可以用绘制原理图的方法来实现,选其简单的方法来实现。
相继的,我将数字钟划分为分频模块,校时模块,时分秒计时模块,整点报时模块,位选扫描模块,显示模块和扬声器模块,并将他们用语言或者绘图的方法实现且生成器件,最后根据数字钟实现的原理连接各个器件形成顶层原理图,编译成功后下载。
其中有一个地方我印象十分深刻,就是下载到器件后我发现数码管不能正常的扫描显示,并且每一个数码都同时显示8,并且有很明显的重影,经过仔细的考察电路,我发现经过扫描模块产生的3位二进制动态显示选择信号,经过三八译码器译码后全都变为与输入信号电平相反的信号,知道问题的症结后,通过在三八译码器的输出端添加非门,再将信号的电平取反,问题得以解决。
课程设计过的很快,因为我们是真正的在动手动脑,一周的课设,让我明白了凡事都需要自己持之以恒的去实践,才能了解事物的精髓,在学习的海洋中永远是没有彼岸而言的,我们需要的也是时常强调的,就是踏实,努力的做好我们的每一件小事,只有这样我们才可以完成更困难的事情。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 逻辑电路 简易 设计