数字逻辑电路课设—简易数字钟研发设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字逻辑电路课程设计报告
多功能数组钟设计
一、设计要求:
通过Maxplus II使用VHDL语言编写设计一款多功能数字钟,具体功能如下:
1、时钟时,分,秒分别显示且能正确计数。
2、整点报时,时钟在将要到达整点的最后十秒,给予蜂鸣提示。
3、校时,可以通过相应开关按钮对时钟的时分秒进行调整。
4、闹钟,用户可以预设闹铃时刻,当时间到达该时刻时,发出蜂鸣提示。
二、总体设计:
1、设计框图:
2、外部输入输出要求:
外部输入要求:输入信号有1024Hz时钟信号、低电平有效的秒清零信
号CLR、低电平有效的调分信号SETmin、低电平有效的调时信号
SEThour;
外部输出要求:整点报时信号SOUND(59分51/3/5/7秒时未500Hz
低频声,59分59秒时为1kHz高频声)、时十位显示信号h1(a,b,c,
d,e,f,g)、时个位显示信号h0(a ,b,c,d,e,f,g)、分十
位显示信号m1及分个位m0、秒十位s1及秒个位s0;数码管显示位选
信号SEL0/1/2等三个信号。
3、各模块功能:
1)FREQ分频模块:
整点报时用的1024Hz与512Hz的脉冲信号,这里的输入信号是
1024Hz信号,所以只要一个二分频即可;时间基准采用1Hz输入信
号直接提供(当然也可以分频取得,这里先用的是分频取得的信号,
后考虑到精度问题而采用硬件频率信号。
2)秒计数模块SECOND:
60进制,带有进位和清零功能的,输入为1Hz脉冲和低电平有效的
清零信号CLR,输出秒个位、时位及进位信号CO。
3)分计数模块MINUTE
60进制,带有进位和置数功能的,输入为1Hz脉冲和高电平有效的
使能信号EN,输出分个位、时位及进位信号CO。
4)时计数模块HOUR:
24进制,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个
位、时位。
5)扫描模块SELTIME:
输入为秒(含个/十位)、分、时、扫描时钟CLK1K,输出为D和
显示控制信号SEL。
6)整点报时功能模块ALERT:
输入为分/秒信号,输出为高频声控Q1K和Q500。
7)译码显示功能模块DISPLAY:
输入为D,输出为Q。
4、VHDL程序设计:
1)分频模块(使用原理图输入):
2)秒模块程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;
sec1,sec0:out std_logic_vector(3 downto 0);
co:out std_logic);
end SECOND;
architecture SEC of SECOND 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
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 SEC;
3)分模块程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;
architecture MIN of MINUTE is
begin
process(clk,en)
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
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;
end process;
end MIN;
4)时模块程序:
library ieee;