数字逻辑电路设计课程设计数字钟.docx
- 文档编号:30527866
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:13
- 大小:80.93KB
数字逻辑电路设计课程设计数字钟.docx
《数字逻辑电路设计课程设计数字钟.docx》由会员分享,可在线阅读,更多相关《数字逻辑电路设计课程设计数字钟.docx(13页珍藏版)》请在冰豆网上搜索。
数字逻辑电路设计课程设计数字钟
JIANGSUUNIVERSITY
数字钟实验报告设计
学院名称:
专业班级:
学生姓名:
学生学号:
2012年7月9日
设计目的
1设计拥有正常的时分秒计时功能的时钟
2能利用实验班上的按键实现校时,校分及秒清零
3扬声器整点报时
4闹铃功能
5在QuartusII中采用层次化设计方法进行设计
设计方案
进行模块化,分别设计
顶层图见附页1
分为六个模块进行设计
设计过程
1首先编写出24和60进制计数器vhdl,用于时分秒的计时
2编写分频器,输入频率1khz,输出1hz,64hz,512hz
3二路选择器的编写,使其能正常进行时分的校准
4编写整点报时模块,使其在正点能进行报时
5进行bcd码转换的编写程序,使数字能在二极管上正确显示
6闹铃设置和判断的编写
7连接顶层图,使其能正常编译、
8、下载验证
总电路图
原理叙述
一计时模块
Cnt60
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;
Cnt24
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;
二校时模块
Mux2
二路选择器,进行时分的校准
libraryieee;
useieee.std_logic_1164.all;
entitymux2is
port(a,b,s:
instd_logic;
y:
outstd_logic);
endmux2;
architecturemux_2ofmux2is
begin
process(a,b,s)
begin
ifs='0'theny<=a;
elseY<=b;
endif;
endprocess;
endmux_2;
三整点报时模块
编写vhdl,在正点输出1否则0,实现整点报时
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;
四Bcd码显示模块
把输出的代码放在二极管上进行正常显示
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;
五分频器模块
进行分频使其正常输出512hz,64hz,1hz
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfreq_dividerIS
PORT(clk:
INSTD_LOGIC;
hz_1:
OUTSTD_LOGIC;
hz_4:
OUTSTD_LOGIC;
hz_64:
OUTSTD_LOGIC;
hz_512:
OUTSTD_LOGIC;
hz_2:
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;
hz_512<=count(0);
hz_64<=count(3);
hz_4<=count(7);
hz_1<=count(9);
hz_2<=count(8);
ENDrtl;
六闹钟模块
闹铃设置
编写代码使其设置时能正常显示和记录
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;
设计结论
设计数字钟可以用vhdl加原理图的方式实现,并且能进行正常功能
经验总结
1vhdl语言是一种重要而且实用的编程语言
2设计中遇到调到59分钟不进位,后来经过改正使其能正常进位。
3其中用了很长时间去研究如何设置一个好听点的音乐闹铃,最后终于成功的从一直响到间断响到现在一个比较悦耳的闹铃的设计,使我明白可以设计出自己想设计的,只要自己肯花时间肯做努力
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 逻辑电路 设计 课程设计