VHDL数字钟设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VHDL数字钟设计报告
一. 数字钟总体设计方案:
1.1设计目的
①正确显示时、分、秒;
②可手动校时,能分别进行时、分的校正;
③整点报时功能;
1.2设计思路
数字钟的设计模块包括:分频器、去抖动电路、校时电路、“时、分、秒”计数器、校时闪烁电路、
整点报时和译码显示电路。
每一个功能模块作为一个实体单独进行设计,最后再用VHDL的例化语句将各个模块进行整合,生成
顶层实体top。
该数字钟可以实现3个功能:计时功能、设置时间功能和报时功能。
二.数字钟模块细节
2.1 分频器(fenpin)
本系统共需3种频率时钟信号(1024Hz、512Hz、1Hz)。为减少输入引脚,本系统采用分频模块,只需由外部提供1024Hz基准时钟信号,其余三种频率时钟信号由分频模块得到。
分频原理:为以1024Hz基准时钟经1024分频得到512Hz,1Hz频率时钟信号。
分频器管脚
代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity fenpin is
port(clk1024:in std_logic;
clk1,clk512:out std_logic
);
end fenpin ;
architecture cml of fenpin is
begin
process (clk1024)
variable count1: integer range 0 to 512; variable q1: std_logic;
begin
if clk1024' event and clk1024='1' then if count1=512 then
q1:=not q1;
count1:=0;
else
count1:=count1+1;
end if;
end if;
clk1<=q1;
end process;
process(clk1024)
variable count512: integer range 0 to 1; variable q512: std_logic;
begin
if clk1024' event and clk1024='1' then
if count512=1 then
q512:=not q512;
count512:=0;
else
count512:=count512+1;
end if;
end if;
clk512<=q512;
end process;
end cml;
2.2 校时电路(jiaoshi)
本模块要实现的功能是:正常计时、校时、校分在每个状态下都会产生不同控制信号实现相应的功能。
校时管脚图
代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jiaoshi is
port(rst,rvs,select_rvs,mtime,mclkin,hclkin:in std_logic;
hclkout,mclkout:out std_logic
);
end jiaoshi;
architecture cml of jiaoshi is
signal h_m:std_logic;
begin
p1:process(rst,rvs,hclkin,mclkin,h_m,mtime)
begin
if rst='0' then
null;
elsif rvs='1' then
hclkout<=hclkin;
mclkout<=mCLKin;
elsif h_m='0' then
hclkout<=hclkin;
mclkout<=mtime;
else
hclkout<=mtime;mclkout<=mclkin;
end if;
end process;
p2:process(select_rvs)
begin
if select_rvs'event and select_rvs='1' then
h_m<=not h_m;
end if;
end process ;
end cml;
管脚图
仿真图
2.3 时计数器(hour)分计数器(mine)秒计数器(second)
时计数器管脚图
时代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity hour is
port(rst,hclk:in std_logic;
hour0,hour1:buffer std_logic_vector(3 downto 0 )
);
end hour;
architecture cml of hour is
begin
process(rst,hclk,hour0,hour1)
begin
if rst='0' then
hour0<="0000";
hour1<="0000";
elsif hclk'event and hclk='1' then
if hour0="0011" and hour1="0010" then
hour0<="0000";
hour1<="0000";
elsif hour0="1001" then
hour0<="0000";
hour1<=hour1+1;
else
hour0<=hour0+1;
end if;
end if;
end process ;