1、具有以二十四小时制计时、显示、整点报时、时间设置和闹钟的功能。
2、设计精度要求为 1 秒。
二、设计目的
1.掌握各类计数器以及计数器的级联方式;
2.掌握数码管动态显示的原理与方法;
3.掌握用 FPGA 技术的层次化设计方法;
4.理解数字逻辑硬件和软件的设计思想;
三、设计环境:Quartus II
CPLD-5 型试验箱
四、系统功能描述
1、系统输入:系统状态及较时、定时转换的控制信号为 enset、k、set;
时钟信号 clk 采用 50MHz;校时复位信号为 reset,输入信号均由按键信号产生。
2、系统输出:LED 显示输出;蜂鸣器声音信号输出。
3、多功能数字电子钟系统功能的具体描述如下:
(一)计时:正常工作状态下,每日按 24h 计时制计时并显示,蜂鸣器无声,逢
整点报时。
(二)校时:在计时显示状态下,按下“enset”键,接着按下“k”键,进入“小
时”待校准状态,若此时按下“set”键,小时开始校准;之后按上“k”键则进
入“分”待校准状态;继续按下“k”键则进入“秒”待复零状态;再次按上“k”
键数码管显示闹钟时间,并进入闹钟“小时”待校准状态;再次按下“k”键则
进入闹钟“分”待校准状态;若再按上“k”键恢复到正常计时显示状态。若校
时过程中按下“reset”键,则系统恢复到正常计数状态。
(1)“小时”校准状态:在“小时”校准状态下,显示“小时”的数码管以 2Hz
闪烁,并以 2Hz 的频率递增计数。
(2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以 2Hz 闪烁,
并以 2Hz 的频率递增计数。
(3)“秒”校准状态:在“秒复零”状态下,显示“秒”的数码管以 2Hz 闪烁,
并以 1Hz 的频率递增计数。
(4)闹钟“小时”校准状态:在闹钟“小时”校准状态下,显示“小时”的数
码管以 2Hz 闪烁,并以 2Hz 的频率递增计数。
(5)闹钟“分”校准状态:在闹钟“分”校准状态下,显示“分”的数码管以
2Hz 闪烁,并以 2Hz 的频率递增计数。
(三)整点报时:蜂鸣器在“59”分钟的第“51”、“53”、“55”、“57”秒发频率
为 500Hz 的低音,在“59”分钟的第“59”秒发频率为 1000Hz 的高音,结束时
为整点。
(四)显示:要求采用扫描显示方式驱动 6 个 LED 数码管显示小时、分、秒。
(五)闹钟:闹钟定时时间到,蜂鸣器发出频率为 1000Hz 的高音,持续时间为
60 秒。
五、各个模块分析说明
1、分频器模块
(1)模块说明:输入一个频率为 50MHz 的 CLK,利用计数器分出
1KHz 的 q1KHz,500Hz 的 q500Hz,2Hz 的 q2Hz 和 1Hz 的 q1Hz。
(2)源程序:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY fdiv IS
PORT
(CLK: IN STD_LOGIC ;
--输入时钟信号
q1KHz: BUFFER STD_LOGIC;
q500Hz: BUFFER STD_LOGIC;
q2Hz: BUFFER STD_LOGIC;
q1Hz: OUT STD_LOGIC);
END fdiv ;
ARCHITECTURE bhv OF fdiv IS
BEGIN
P1KHZ:PROCESS(CLK)
VARIABLE cout:INTEGER:=0;
BEGIN
IF CLK'EVENT AND CLK='1' THEN
cout:=cout+1;
IF cout<=25000 THEN q1KHz<='0';
--每来个时钟上升沿时 cout 开始计数
--当 cout<=25000 时,q1KHz 输出“0”
ELSIF cout<50000 THEN q1KHz<='1'; --当 25000
ELSE cout:=0;
END IF;
END IF;
END PROCESS;
P1HZ:PROCESS(q2Hz)
VARIABLE cout:INTEGER:=0;
BEGIN
IF q2Hz'EVENT AND q2Hz='1' THEN
cout:=cout+1;
IF cout=1 THEN q1Hz<='0';
ELSIF cout=2 THEN cout:=0;q1Hz<='1';
END IF;
END IF;
END PROCESS;
END bhv;
(3)模块图:
2、控制器模块
(1)模块说明:输入端口 enset,k,set 键来控制 6 个状态,这六个状态分别是
显示计时时间状态,调计时的时、分、秒状态,调闹铃的时、分的状态,reset
键是复位键,用来回到显示计时时间的状态。
(2)源程序:
library ieee;
use ieee.std_logic_1164.all;
entity contl is
port(clk,enset,k,set,reset:in std_logic;
cth,ctm,cts,cbh,cbm,flashh,flashm,flashs,sel_show:out
std_logic);
end contl;
architecture rtl of contl is
type stats is (s0,s1,s2,s3,s4,s5);
--定义 6 个状态
signal current_state,next_state:stats:=s0;
begin
process(clk,reset)
begin
if reset='1' then
current_state<=s0;
elsif clk'event and clk='1' then
if reset='0' then
current_state<=next_state;
end if;
end if;
end process;
process(current_state,enset,k,set)
begin
case current_state is
when s0=>cth<='0';ctm<='0';cts<='0';cbh<='0';cbm<='0';
if (enset='1' and k='1')then
flashh<='0';flashm<='0';flashs<='0';sel_show<='0';
--若 enset 和 k 为“1”,
--由 s0 态转到 s1 态
next_state<=s1;
else next_state<=s0;
end if;
when s1=>ctm<='0';cts<='0';cbh<='0';cbm<='0';
flashh<='1';flashm<='0';flashs<='0';sel_show<='0';
if set='1' then cth<='1';
else cth<='0';
end if;
if (enset='1' and k='0')then
next_state<=s2;
else next_state<=s1;
end if;
--若 set 为“1”,cth 输出“1”
--进入调小时状态。
--若 enest 为“1”,k 为“0”,
--由 s1 态转到 s2 态
when s2=>cth<='0';cts<='0';cbh<='0';cbm<='0';
flashh<='0';flashm<='1';flashs<='0';sel_show<='0';
if set='1' then ctm<='1';
else ctm<='0';
end if;
if(enset='1' and k='1')then
next_state<=s3;
else next_state<=s2;
end if;
when s3=>cth<='0';ctm<='0';cbh<='0';cbm<='0';
flashh<='0';flashm<='0';flashs<='1';sel_show<='0';
if set='1' then cts<='1';
else cts<='0';
end if;
if (enset='1' and k='0')then
next_state<=s4;
else next_state<=s3;
end if;
when s4=>cth<='0';ctm<='0';cts<='0';cbm<='0';
flashh<='1';flashm<='0';flashs<='0';sel_show<='1';
if set='1' then cbh<='1';
else cbh<='0';
end if;
if(enset='1' and k='1')then
next_state<=s5;
else next_state<=s4;
end if;
when s5=>cth<='0';ctm<='0';cts<='0';cbh<='0';
flashh<='0';flashm<='1';flashs<='0';sel_show<='1';
if set='1' then cbm<='1';
else cbm<='0';
end if;
if(enset='1' and k='0')then
next_state<=s0;
else next_state<=s5;
end if;
end case;
end process;
end rtl;
(3)仿真波形图:
(4)模块图:
3、二选一模块
(1)源程序:
ENTITY mux21a IS
PORT(a,b,s:IN BIT;
y:OUT BIT);
END ENTITY mux21a;
ARCHITECTURE one OF mux21a IS
BEGIN
PROCESS(a,b,s)
BEGIN
IF s='0' THEN
y<=a;ELSE
y<=b;
END IF;
END PROCESS;
END ARCHITECTURE one;
(2)仿真波形图:
--若 s=0,y 输出 a,反之输出 b。
(3)模块图:
4、计时模块
a、秒计时
(1)源程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith;
entity cnts60 is
port(sld0:buffer std_logic_vector(3 downto 0); --小时个位
--小时十位
sld1:buffer std_logic_vector(7 downto 4);
co: out std_logic;
rest:in std_logic;
clk :in std_logic);
end cnts60;
architecture rtl of cnts60 is
begin
process(clk,rest)
begin
if rest='1' then sld1<="0000"; sld0<="0000";
elsif (clk'event and clk='1') then
if (sld1="0101"and sld0="1001")then
--当 sld1=5,sld0=9 时
sld1<="0000"; sld0<="0000";co<='1';--全清零,co 输出“1”
elsif sld0="1001" then
sld0<="0000";
sld1<=sld1+1;co<='0';
else sld0<=sld0+1;co<='0';
-- sld1 自加“1”
end if;
end if;
end process;
end rtl;
(2)仿真波形图:
(3)模块图:
b、分计时
(1)源程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith;
entity cnt60 is
port(sld0:buffer std_logic_vector(3 downto 0);
sld1:buffer std_logic_vector(7 downto 4);
co: out std_logic;
clk :in std_logic);
end cnt60;
architecture rtl of cnt60 is
begin
process(clk)
begin