数电实验数字钟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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';

相关文档
最新文档