数字逻辑课程设计报告.docx
《数字逻辑课程设计报告.docx》由会员分享,可在线阅读,更多相关《数字逻辑课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
数字逻辑课程设计报告
数字逻辑课程设计
多功能数字钟
班级:
学号:
课程设计人:
指导老师:
课题:
完成时间:
1、设计目的:
学会应用数字系统设计方法进行电路设计,熟练地运用汇编语言。
二、设计任务及要求:
1.记时、记分、记秒
2.校时、校分、秒清0
3.整点报时
4.时间正常显示
5.闹时功能
三、设计思路:
将整个闹钟分为以下几个模块,每个模块中都有详细的各部分的设计思路,源代码及仿真图像,生成的器件。
1.计时模块
计小时:
24进制计数器
计分、计秒:
60进制计数器
计时间过程:
计秒:
1HZ计数脉冲,0~59循环计数,计数至59时产生进位信号。
计分:
以秒计数器进位信号作为分计数脉冲,0~59循环计数,59时产生进位。
计时:
以分计数器进位信号作为时计数脉冲,0~23循环计数,23时清0。
二十四进制计数器代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt24is
port(clk:
instd_logic;
qh,ql:
outstd_logic_vector(3downto0));
endcnt24;
architecturebehaveofcnt24is
signalq1,q0:
std_logic_vector(3downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(q1="0010"andq0="0011")then
q1<="0000";q0<="0000";
elsif(q0="1001")then
q0<="0000";q1<=q1+'1';
else
q0<=q0+'1';
endif;
endif;
qh<=q1;
ql<=q0;
endprocess;
endbehave;
仿真结果:
图一、cnt24仿真图像
六十进制计数器代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt60is
port(clk:
instd_logic;
clr:
instd_logic;
ql,qh:
outstd_logic_vector(3downto0);
c:
outstd_logic);
endcnt60;
architecturecntofcnt60is
signalq1,q0:
std_logic_vector(3downto0);
begin
process(clk,clr)
begin
if(clr='1')then
q1<="0000";q0<="0000";c<='0';
else
if(clk'eventandclk='1')then
if(q1="0101"andq0="1001")then-----到59
q1<="0000";q0<="0000";c<='1';
elsif(q1<"0101"andq0="1001")then
q0<="0000";q1<=q1+'1';c<='0';
elsif(q0<"1001")then
q0<=q0+'1';
endif;
endif;
endif;
qh<=q1;
ql<=q0;
endprocess;
endcnt;
仿真结果:
图二、cnt60仿真图像
图三、生成的计数器符号
2.校时模块:
思路:
按下校时键,时位迅速递增,满23清0
按下校分键,分位迅速递增,满59清0
注意:
此时应屏蔽分进位。
按清0键,秒清0。
脉冲按键S1~S8、拨动开关K1~K12任选三个。
两个问题:
(1)如何实现校对时间时,计数器快速递增?
按键校对时间时,将一个频率较高的计数脉冲信号作用于计数器,屏蔽正常计时的计数脉冲信号。
(2)如何消除“抖动”?
电路抖动:
一次按键的弹跳现象,电路产生多个计数脉冲,导致一次按键,多次计数的误动作。
抖动产生的原因:
物理原因。
消除的简易方法:
D触发器,同步按键脉冲。
3.整点报时模块:
从59分50秒开始,每2秒一次低音报时;当达到整点时,进行一次高音报时。
低音:
频率可定为500HZ;高音:
频率可定为1KHZ。
报时效果:
报时脉冲接扬声器输入,引脚号:
N6。
整点报时器件代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityalert_31is
port(m1,m0,s1,s0:
instd_logic_vector(3downto0);
siga,sigb:
outstd_logic);
endalert_31;
architecturealertofalert_31is
begin
siga<='1'when(m1="0101"andm0="1001"ands1="0101"and(s0="0000"ors0="0010"ors0="0100"ors0="0110"ors0="1000"))else'0';
sigb<='1'when(m1="0000"andm0="0000"ands1="0000"ands0="0000")else'0';
endalert;
仿真结果:
图四、整点报时模块,低频率报时
图五、整点报时器件符号
4、分频模块:
设计一个进制较大的计数器,分频产生各种频率的脉冲信号。
代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfreq_divideris
port(clk:
instd_logic;
hz512,hz64,hz4,hz1:
outstd_logic);
Endfreq_divider;
architecturebehoffreq_divideris
signalcc:
std_logic_vector(9downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(cc="1111111111")then
cc<="0000000000";
else
cc<=cc+1;
endif;
endif;
endprocess;
hz512<=cc(0);
hz64<=cc(3);
hz4<=cc(7);
hz1<=cc(9);
endbeh;
仿真结果:
图六、分频器仿真及生成器件符号
5.动态扫描显示模块:
动态模式下,8个数码管连接同个七段码,需要进行分时控制的动态扫描显示。
七段译码器代码:
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";
whenothers=>null;
ENDCASE;
ENDPROCESS;
ENDbeha;
器件生成:
图七、动态扫描器件
6.闹时模块:
多路选择器源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityalarmsetis
port(sel:
instd_logic;
hclo,mclo,sclo,halr,malr,salr:
instd_logic_vector(7downto0);
h,s,m:
outstd_logic_vector(7downto0));
endalarmset;
architecturebehofalarmsetis
begin
process(sel)
begin
if(sel='0')thenh<=hclo;
m<=mclo;
s<=sclo;
elseh<=halr;
m<=malr;
s<=salr;
endif;
endprocess;
endbeh;
数值比较器代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityalarmcmpis
port(h,m,halr,malr:
instd_logic_vector(7downto0);
stop:
instd_logic;
sig:
outstd_logic);
endalarmcmp;
architecturebehofalarmcmpis
begin
process(h,m,halr,malr,stop)
begin
ifstop='1'then
sig<='0';
endif;
ifh=halrandm=malrandstop='0'then
sig<='1';
elsesig<='0';
endif;
endprocess;
endbeh;
器件生成:
图八、多路选择器和数值比较器
4、顶层图:
图九、顶层图
六、设计中遇到的问题及解决方法:
问题1、第一次下载仿真时,秒不动,按下清零键自动计时,松开又自动清零。
解决方法:
在秒的计数器清零端加一个非门,这样当一下载到实验板后,在一秒后就可以自动计时,且若要清零则按下Sc按键即可。
问题2、分始终保持00状态,秒的进位不能使它变化,校分也不起作用。
后来老师检查后才发现,这个问题产生的原因是,我的六十进制计数器是置“1”时清零,而顶层电路图上却是设计的“0”时清零,故错把清零端接至了“vcc”.
解决方法:
将分的清零端的“vcc”改为“gnd”,再次下载时,分位就可以动了。
问题3、不知道如何设置闹钟设定与正常计时状态的显示切换。
解决方法:
通过上网搜索以及询问同学,发现了再加一个开关用来控制不同模块的显示。
7、心得体会:
在此次的多功能数字钟设计过程中,让我看到理论与实践的差别和联系,理论固然重要,然而我们要在实践中发现错误,并解决错误,提高自己的动手能力和实际解决问题的能力。
同时,此次设计也锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。
虽然这只是一次简单的课程设计,但通过这次课程设计我了解了课程设计的一般步骤,和设计中应注意的问题。
设计本身并不是有很重要的意义,而是对待问题时的态度和处理事情的能力。
至于设计的成绩无须看得太过于重要,而是设计的过程,设计的思想和设计电路中的每一个环节,电路中各个部分的功能是如何实现的。
最后闹钟也没有自己做出来,仿照同学的设计才做出来,这说明自己平时的学习中还存在很多不足,以后应该更用功学习理论知识,同时加强动手能力。
总的来说,这次课程设计使我收获良多,特别是当它第一次整点报时的时候,心中愉悦无比,自己动手学到的东西是最多的。