数字逻辑电路课程设计实验报告.docx
- 文档编号:14756010
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:17
- 大小:90.94KB
数字逻辑电路课程设计实验报告.docx
《数字逻辑电路课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《数字逻辑电路课程设计实验报告.docx(17页珍藏版)》请在冰点文库上搜索。
数字逻辑电路课程设计实验报告
数字逻辑电路课程设计
---------多功能数字时钟
班级:
姓名:
学号:
指导老师:
时间:
1.设计目的
掌握使用VHDL语言的设计思想;对整个系统的设计有一个了解
掌握各类计数器以及它们相连的设计方法;
掌握MAX+plus技术的层次化设计方法;
掌握多个数码管显示的原理与方法;
2.设计任务及要求
(1)拥有正常的时,分,秒计时功能。
(2)能利用实验板上的按键实现校时,校分及秒清零功能。
(3)能利用实验板上的扬声器做整点报时。
(4)闹钟功能。
(5)在MAXPLUSⅡ中采用层次化设计方法进行设计。
(6)完成全部电路设计后在实验板上下载,验证设计课题的正确性。
3.原理叙述
数字钟电路主要由译码显示器、校准电路、报时电路、时计数、分计数、秒计数器,振荡电路和单次脉冲产生电路组成。
其中电路系统由秒信号发生器、“时”、“分”、“秒”计数器、译码器及显示器、校准电路、整点报时电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个时脉冲信号,该信号将被送到时计数器。
时计数器采用24进制计时器,可实现对一天24小时的计时。
译码显示电路将“时”、“分”、“秒”计数器的输出状态通过显示驱动电路,七段显示译码器译码,在经过六位LED七段显示器显示出来。
整点报时电路时根据计时系统的输出状态产生一个脉冲信号,然后去触发一音频发生器实现低、高音报时。
校准电路时用来对“时”、“分”、“秒”显示数字进行校对调整的。
如图1所示多功能数字钟的组成框图。
4.设计方案
根据总体设计框图,可以将整个系统分为六个模块来实现,分别是计时模块,校时模块,整点报时模块,分频模块,动态显示模块及闹钟模块。
(1)计时模块
该模块的设计相对简单,使用一个二十四进制和两个六十进制计数器级联,构成数字钟的基本框架。
二十四进制计数器用于计时,六十进制计数器用于计分和计秒。
只要给秒计数器一个1Hz的时钟脉冲,则可以进行正常计时。
分计数器以秒计数器的进位作为计数脉冲,小时计数器以分计数器的进位作为计数脉冲。
24进制程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt24is
port(clk:
instd_logic;
ql,qh:
outstd_logic_vector(3downto0);
tc:
outstd_logic);
endcnt24;
architectureoneofcnt24is
begin
process(clk)
variableqli,qhi:
std_logic_vector(3downto0);
begin
ifclk'eventandclk='1'then
qli:
=qli+1;
tc<='0';
ifqli="1010"then
qhi:
=qhi+1;
qli:
="0000";
endif;
if(qhi="0010")and(qli="0100")then
tc<='1';
qhi:
="0000";
qli:
="0000";
endif;
endif;
ql<=qli;
qh<=qhi;
endprocess;
endone;
模块图如下:
60进制程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt60is
port(clk,clr:
instd_logic;
ql,qh:
outstd_logic_vector(3downto0);
tc:
outstd_logic);
endcnt60;
architectureoneofcnt60is
begin
process(clk,clr)
variableqli,qhi:
std_logic_vector(3downto0);
begin
ifclr='1'then
ifclk'eventandclk='1'then
qli:
=qli+1;
ifqli="1010"andqhi<"0101"then
qhi:
=qhi+1;
qli:
="0000";
tc<='0';
endif;
if(qhi="0101")and(qli="1010")then
tc<='1';
qhi:
="0000";
qli:
="0000";
endif;
endif;
else
qhi:
="0000";
qli:
="0000";
tc<='0';
endif;
ql<=qli;
qh<=qhi;
endprocess;
endone;
模块图如下:
(2)校时模块
校时模块设计要求实现时校时,校分以及秒清零的功能
①按下校时键,小时计数器迅速递增以调至所需要的小时位。
②按下校分键,分计数器迅速递增以调至所需要的分位。
③按下清零键,将秒计数器清零。
可以选择实验板上的3个脉冲按键进行锁定。
对于此模块的设计,有三个需要注意的问题:
①在校分时,分计数器的技数不应对小时位产生影响,因而需要屏蔽此时分计数器的进位信号以防止小时计数器计数。
②按键“抖动”的消除。
所谓“抖动”是指一次按键式的弹跳现象,通常实验班中按键所用的开关为机械弹性开关,由于机械触点的弹性作用,按键开关在闭合时并不能马上接通,而断开时也不能马上断开,是的闭合及断开的瞬间伴随一系列的电压抖动,从而导致本来一次按键,希望计数一次,结果因为抖动计数多次,且次数随机,这样严重影响了时间的校对。
消除抖动较为简单的方法利用触发器,比如可以使用D触发器进行消抖。
原因在于,D触发器边沿触发,则在除去时钟边沿到来前一瞬间之外的绝大部分时间都不接受输入,自然消除了抖动。
计时采用1Hz的脉冲驱动计数器计数,而校对时间时应选用相对高频率的信号驱动计数器以达到快速校对时间的目的。
显然,这两种计数脉冲之间需要进行相应的选择切换。
于是将计时和校时模块合起来的电路实现示意图如下图所示。
两种脉冲信号用两路选择器进行选择,选择条件为是否按键。
按键输出经过了消抖处理。
二路选择器程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitymux2is
port(A,B:
instd_logic;
S:
instd_logic;
Y:
outstd_logic
);
endmux2;
architecturetwoofmux2is
begin
process(A,B,S)
begin
ifS='0'thenY<=A;
elseY<=B;
endif;
endprocess;
endtwo;
模块图如下:
(3)整点报时模块
该模块功能要求是:
计时到59分50秒时,每两秒一次低音报时,整点时进行高音报时,可以将报时信号接到实验版上的扬声器输出。
而以不同频率的脉冲信号区分低音和高音报时。
比如可用500Hz信号进行低音报时信号,1kHz信号作为高音报时信号。
进行报时的条件是计数器计数至所要求的时间点,因而需要实现一个比较模块,将分计数器和秒计数器的输出连至比较模块输入端完成比较过程。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityzdbsis
port(mh,ml,sh,sl:
instd_logic_vector(3downto0);
sig500,sig1k:
outstd_logic
);
endzdbs;
architecturebehaviorofzdbsis
begin
sig500<='1'whenmh="0101"andml="1001"andsh="0101"and(sl="0010"orsl="0100"orsl="0110"orsl="1000")
else'0';
sig1k<='1'whenmh="0000"andml="0000"andsh="0000"andsl="0000"
else'0';
endbehavior;
模块图如下:
(4)分频模块
在本系统中需要用到多种不同频率的脉冲信号,上至高音报时信号,下至1Hz的计时脉冲。
所有这些脉冲信号均可以通过一个基准频率分频器生成。
基准频率分频器就是一个进制很大的计数器,利用计数器的分频功能,从不同的输出位得到所需要的脉冲信号。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfreq_dividerIS
PORT(clk:
INSTD_LOGIC;
hz1:
OUTSTD_LOGIC;
hz4:
OUTSTD_LOGIC;
hz64:
OUTSTD_LOGIC;
hz512:
OUTSTD_LOGIC);
ENDfreq_divider;
ARCHITECTURErtlOFfreq_dividerIS
SIGNALcount:
STD_LOGIC_VECTOR(9DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN
IF(count="1111111111")THEN
Count<=(OTHERS=>'0');
ELSE
Count<=count+1;
ENDIF;
ENDIF;
ENDPROCESS;
hz512<=count(0);
hz64<=count(3);
hz4<=count(7);
hz1<=count(9);
ENDrtl;
模块图如下:
(5)动态显示模块
时间的显示需要用到6个数码管,如果实验板上可用的静态显示数码管有6个或以上则很容易实现显示,只需要将小时高位到秒低位共6组输出按顺序锁定到6个数码管上即可。
单如果资源不足,则无法完整显示6位时间。
在这种情况下,需要采用动态扫描的方式显示时间显示。
在动态方式下,所有的数码管对应同一组七段码,每一个数码管由一个选择短控制点亮或熄灭,如果全部点亮,则都显示相同的数字。
若要实现6位不同时间的显示,则需要利用人的视觉缺陷。
具体来讲,可以在6个不同的时间段分别将每组时间经过七段译码后输出到6个数码管,当某一组时间的七段码到达时,只点亮对应位置上的数码管,显示相应的数字;下一个循环将相邻一组时间的七段码送至数码管,同样只点亮相应位置的数码管,6次一个循环,形成一个扫描序列。
只要扫描频率超过人眼的视觉暂留频率(24Hz),就可以达到点亮单个数码管,却能享有6个同时显示的视觉效果,人眼辨别不出差别,而且扫描频率越高,显示越稳定。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdtsmis
port(
clk:
instd_logic;
h:
instd_logic_vector(7downto0);
m:
instd_logic_vector(7downto0);
s:
instd_logic_vector(7downto0);
seg7out:
outstd_logic_vector(6downto0);
sel:
bufferstd_logic_vector(2downto0)
);
ENDdtsm;
ARCHITECTUREbehaofdtsmis
signalkey:
std_logic_vector(3downto0);
BEGIN
PROCESS(clk)
variabledount:
std_logic_vector(2downto0):
="000";
BEGIN
IF(rising_edge(clk))then
IFdount="101"then
dount:
="000";
ELSE
dount:
=dount+1;
ENDIF;
ENDIF;
sel<=dount;
endprocess;
PROCESS(sel)
BEGIN
CASEselIS
when"000"=>key<=h(7downto4);
when"001"=>key<=h(3downto0);
when"010"=>key<=m(7downto4);
when"011"=>key<=m(3downto0);
when"100"=>key<=s(7downto4);
when"101"=>key<=s(3downto0);
whenothers=>null;
ENDCASE;
ENDPROCESS;
PROCESS(key)
BEGIN
casekeyis
when"0000"=>seg7out<="0111111";
when"0001"=>seg7out<="0000110";
when"0010"=>seg7out<="1011011";
when"0011"=>seg7out<="1001111";
when"0100"=>seg7out<="1100110";
when"0101"=>seg7out<="1101101";
when"0110"=>seg7out<="1111101";
when"0111"=>seg7out<="0000111";
when"1000"=>seg7out<="1111111";
when"1001"=>seg7out<="1101111";
when"1010"=>seg7out<="1110111";
when"1011"=>seg7out<="1111100";
when"1100"=>seg7out<="0111001";
when"1101"=>seg7out<="1011110";
when"1110"=>seg7out<="1111001";
when"1111"=>seg7out<="1110001";
whenothers=>null;
ENDCASE;
ENDPROCESS;
ENDbeha;
模块图如下:
(6)闹钟模块
闹钟模块要求数字钟计时到所设定的任意时间时均能驱动扬声器报时。
该模块的设计应考虑到以下几个问题。
设定的闹钟的时间应使用新的计数器进行存储,与正常的计时互不干扰。
与正常计时状态的显示切换。
可以设定一个按键,拥有选择是将计时时间还是将闹钟时间状态送动态显示模块。
应实现一个比较模块,当计时到与闹钟时间相等时,则驱动扬声器鸣叫。
闹钟响声应限定在一定时间之内,比如一分钟,且在这段时间内应随时可以通过按键取消闹时状态(扬声器停止鸣叫)。
将上述6个功能模块分别加以实现,再连接成为顶层原理图,编译后锁定管脚下载验证结果的正确性。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityalarm1is
port(clr,hclk,mclk,mode,stop:
instd_logic;
hclo,mclo,sclo:
instd_logic_vector(7downto0);
h,m,s:
outstd_logic_vector(7downto0);
sig:
outstd_logic);
endalarm1;
architecturebehofalarm1is
signalhalr,malr,salr:
std_logic_vector(7downto0);
signaltc,sclk:
std_logic;
COMPONENTcnt60
PORT(clk:
instd_logic;
clr:
instd_logic;
ql:
bufferstd_logic_vector(3downto0);
qh:
bufferstd_logic_vector(3downto0);
tc:
outstd_logic);
ENDCOMPONENT;
componentcnt24
port(clk:
instd_logic;
ql:
bufferstd_logic_vector(3downto0);
qh:
bufferstd_logic_vector(3downto0);
tc:
outstd_logic);
endcomponent;
begin
hours:
cnt24portmap(clk=>hclk,ql=>halr(3downto0),qh=>halr(7downto4),tc=>tc);
minutes:
cnt60portmap(clk=>mclk,clr=>clr,ql=>malr(3downto0),qh=>malr(7downto4),tc=>tc);
seconds:
cnt60portmap(clk=>sclk,clr=>clr,ql=>salr(3downto0),qh=>salr(7downto4),tc=>tc);
process(mode)--modeconvert
begin
if(mode='0')thenh<=hclo;
m<=mclo;
s<=sclo;
elseh<=halr;
m<=malr;
s<=salr;
endif;
endprocess;
process(hclo,mclo,halr,malr,stop)
begin
ifstop='1'thensig<='0';
elseifhclo=halrandmclo=malrthen
sig<='1';
elsesig<='0';
endif;
endif;
endprocess;
endbeh;
模块图如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 逻辑电路 课程设计 实验 报告