数电实验数字钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.16数字钟
数字钟设计是数字电路中的一个典型应用,设计方法很多,现在要介绍的是用CPLD 设计数字钟的方法。
1.设计目的
掌握各类计数器以及他们相连的设计方法;掌握多个数码管显示的原理与方法;
掌握CPLD技术的层次化设计方法;掌握使用VHDL语言的设计思想;对整个系统的设计有一个了解。
2.设计要求
(1)能进行正常的时、分、秒计时功能,分别由6个数码管显示24h、60min、60s。
(2)按下sa键时,计数器迅速递增,并按24h循环,计数23h后再回00.
(3)按下sb键时,计数器迅速递增,并按60min循环,计数满59min后再回00,但不向“时“进位。
(4)利用扬声器整点报时:到达59’50“时开始报时,在59’50”、52”、54”、56”、58”鸣叫,鸣叫声频为500Hz:到达59’60”时为最后一声整点报时,频率为1kHz。
总体框图如图9-76所示。
图9-76 总体框图
3. 模块及模块功能
模块MIAN如图9-77所示。该模块为60进制计数器,计时输出为秒的数值。在计时到59时送出进位信号CO,因为硬件有延时,所以模块MIAN在模块变为00时加1,符合实际。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity mian is
port(clk,clr:in std_logic;
sec1,sec0:out std_logic_vector(3 downto 0);
co:out std_logic);
end mian;
architecture mian_arc of mian is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clr='1' then
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101"and cnt0="1000" then 图9-77 模块MIAN
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101"then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;
end process;
end mian_arc;
模块MINA如图9-78所示。该模块为60进制计数器,计时输出为分的数值。在EN信号有效且时钟到来时,计数器加1。在sb按下时,EN信号有效,计数值以秒的速度增加,从而实现对分钟的设置。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity mina is
port(en,clk:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end mina;
architecture min_arc of mina is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1'then
if en='1'then
if cnt1="0101"and cnt0="1000"then
co<='1';
cnt0:="1001";
elsif cnt0<"1001"then 图9-78 模块MINA
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101"then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
min0<=cnt0;
end process;
end min_arc;
模块HOUR如图9-79所示。该模块为24进制计数器,计时输出为小时的数值。设置功能的原理同MINA模块。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity hour is
port(en,clk:in std_logic;
h1,h0:out std_logic_vector(3 downto 0));
end hour;
architecture hour_arc of hour is 图9-79 模块HOUR
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1'then
if en='1'then
if cnt0="0011"and cnt1="0010"then
cnt0:="0000";
cnt1:="0000";
elsif cnt0<"1001"then
cnt0:=cnt0+1;
else
cnt0:="0000";
cnt1:=cnt1+1;
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;
end process;
end hour_arc;
模块SST如图9-80所示。此模块为整点报时提供控制信号;当59min,秒为50、52、54、56、58时,Q500输出为“1”;秒为00时,Q1K输出“1”。这两个信号经过逻辑门实现报时功能。
library ieee;
use ieee.std_logic_1164.all;
entity sst is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);
clk:in std_logic;
q500,q1k:out std_logic);
end sst;
architecture sss_arc of sst is
begin 图9-80 模块SST
process(clk)
begin
if clk'event and clk='1'then
if m1="0101"and m0="1001"and s1="0101"then
if s0="0000"or s0="0010"or s0="0100"or s0="0110"or s0="1000"then
q500<='1';
else
q500<='0';
end if;
end if;
if m1="0000"and m0="0000"and s1="0000"and s0="0000"then
q1k<='1';
else
q1k<='0';