VHDL_电子时钟的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告书
实验项目名称:数字电子钟的设计
实验项目性质:普通试验
所属课程名称:VHDL程序设计
实验计划学时:4学时
一、实验目的
掌握VHDL程序设计方法
二、实验内容和要求
能够实现小时(24进制)、分钟和秒钟(60进制)的计数功能
具有复位功能
功能扩展:具有复位、整点报时提示、定时闹钟等功能
在软件工具平台上,进行VHDL语言的各模块编程输入、编译实现和仿真验证。
三、实验主要仪器设备和材料
计算机
四、实验方法、步骤及结果测试
1、设计思路:
根据实验要求,将设计分为3个主要部分,时钟功能模块、整点报时模块和闹钟功能模块在时钟模块中,包括复位和预置数,分为时、分和秒三个进程,其主要思路如下:
秒钟的模块:设计一个60进制的计数器,以clk为其时钟信号,每60个clk后产生一个进位信号AOUT给分钟模块,作为分钟进程的响应信号。
分钟的模块:同理于秒钟的模块,设计一个60进制的计数器,以AOUT为其时钟信号,每60个AOUT后产生一个进位信号BOUT给小时模块,作为小时模块进程的响应信号。小时的模块:为24进制计数器,在分的进位信号BOUT的激发下计数,从0到23的时候产生一个信号COUT,全部清0,重新开始计时。
闹钟模块:同INPUT作为闹钟的设定,当时钟信号等于INPUT设定的时候,N为高电平,即是闹钟信号。
整点报时模块:用两个信号M,F,当M,F同时为0的时候,Z产生高电平,即是当做报时信号。
在时钟模块中,如有复位信号,则各小模块在复位信号的激励下进行各位置零;
共有5个进程。
2.程序代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY lyk IS
PORT(CLK,RST,EN,SET:IN STD_LOGIC;
INPUT:IN STD_LOGIC_VECTOR(10 DOWNTO 0);
HA,HB:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
HC:OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
Z,N:OUT STD_LOGIC
);
SIGNAL AOUT,BOUT,COUT :STD_LOGIC;
END ENTITY lyk;
ARCHITECTURE CLOCK OF lyk IS
SIGNAL M,F:STD_LOGIC_VECTOR(5 DOWNTO 0);
SIGNAL S:STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
PROCESS(CLK,RST,EN) ---------秒钟进程
V ARIABLE GOD:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
IF RST='1'
THEN GOD:=(OTHERS =>'0');
ELSIF CLK'EVENT AND CLK='0'
THEN IF EN='1'
THEN IF GOD<59
THEN GOD:=GOD+1;
ELSE GOD:=(OTHERS =>'0');
END IF;
END IF;
END IF;
IF GOD=59
THEN AOUT <='1';
ELSE AOUT <='0';
END IF;
HA<=GOD;
M<=GOD;
END PROCESS;
PROCESS(AOUT,RST,EN) -----------------分钟进程
V ARIABLE DOG:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
IF RST='1'
THEN DOG:=(OTHERS =>'0');
ELSIF AOUT'EVENT AND AOUT='0'
THEN IF EN='1'
THEN IF DOG<59
THEN DOG:=DOG+1;
ELSE DOG:=(OTHERS =>'0');
END IF;
END IF;
END IF;
IF DOG=59
THEN BOUT <='1';
ELSE BOUT <='0';
END IF;
HB<=DOG;
F<=DOG;
END PROCESS;
PROCESS(BOUT,RST,EN) ------------小时进程
V ARIABLE OGD:STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
IF RST='1'
THEN OGD:=(OTHERS =>'0');
ELSIF BOUT'EVENT AND BOUT='0'
THEN IF EN='1'
THEN IF OGD<23
THEN OGD:=OGD+1;
ELSE OGD:=(OTHERS =>'0');
END IF;
END IF;
END IF;
IF OGD=23
THEN COUT <='1';
ELSE COUT <='0';
END IF;
HC<=OGD;
S<=OGD;
END PROCESS;
PROCESS(F,S,SET,INPUT) -------------闹钟进程
BEGIN
IF SET='1' AND (S&F=INPUT)
THEN N<='1';
ELSE N<='0';
END IF;
END PROCESS;
PROCESS(M,F) -------整点报时进程