EDA数字时钟设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA 课程设计报告书
课题名称 数字时钟设计
姓 名 学 号 院、系、部 电气系 专 业 电子信息工程
指导教师
2013年 12 月 3 日
※※※※※※※※※ ※※ ※※ ※※ ※※
※※※※※
※※
2011级EDA
课程设计
数字时钟设计
一、设计目的
了解数字钟的工作原理。通过学习的VHDL语言结合EDA的设计知识理论联系实际,掌握所学的课程知识,学习VHDL基本单元电路的综合设计应用。通过对实用数字钟的设计,巩固和综合运用计算机原理的基本理论和方法,理论联系实际,提高设计能力,提高分析、解决计算机技术实际问题的独立工作能力。详细目的如下:
1 熟悉集成电路的引脚安排;
2 学习和掌握EDA设计电路的应用;
3 掌握各芯片的逻辑功能及使用方法;
4 了解数字钟的组成及工作原理;
5 熟悉数字钟应该具有的功能;
6 熟悉数字钟的设计与制作。
二、设计要求
多功能数字钟应该具有的功能有:首先要知道钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从0~23时。
在设计中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD码)显示个位,对于小时因为它的范围是从0~23,所以可以用一个2位的二进制码显示十位,用4位二进制码(BCD码)显示个位。
设计中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz时钟信号,但是扫描的确需要一个比较高频率的信号,因此为了得到准确的1Hz信号,必须对输入的系统时钟进行分频。
对于报警信号,由于实验箱上只有一个小的扬声器,而要使扬声器发声,必须给其一定频率的信号进行驱动,频率越高,声音越尖。另外由于人耳的听觉范围是300Hz~3.4KHz左右,所以设计时也要选择恰当的发声频率。
Clock选择10KHZ。本设计的任务就是设计一个数字钟,要求显示格式为小时-分钟-秒钟。系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10000次分频。用S1按键作为系统时钟复位,复位后全部显示00-00-00。
三、流程图设计
数字时钟设计流程图如图3-1所示:
图3-1程序流程图
四、程序设计(程序代码)
1、秒钟计数器源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY second IS
PORT( clk,reset,setmin:STD_LOGIC;
enmin:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END second;
ARCHITECTURE fun OF second IS
SIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL enmin_1,enmin_2:STD_LOGIC;
BEGIN
daout<=count;
enmin_2<=(setmin and clk);
enmin<=(enmin_1 or enmin_2);
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THEN count<="0000000";
ELSIF(clk 'event and clk='1')then
IF(count(3 downto 0)="1001")then
IF(count<16#60#)then
IF(count="1011001")then
enmin_1<='1';count<="0000000"; ELSE
count<=count+7;
END IF;
ELSE
count<="0000000";
END IF;
ELSIF(count<16#60#)then
count<=count+1;
enmin_1<='0'after 100 ns;
ELSE
count<="0000000";
END IF;
END IF;
END PROCESS;
END fun;
2、分钟计数器源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY minute IS
PORT(clk,clk1,reset,sethour:IN STD_LOGIC; enhour:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END ENTITY minute ;
ARCHITECTURE fun OF minute IS
SIGNAL count :STD_LOGIC_VECTOR (6 DOWNTO 0);
SIGNAL enhour_1, enhour_2: STD_LOGIC;
BEGIN
daout<=count;
enhour_2<= (sethour and clk1);
enhour<= (enhour_1 or enhour_2);
PROCESS(clk,reset,sethour)
BEGIN
IF(reset='0') THEN
count<="0000000";
ELSIF(clk'event and clk='1')THEN
IF(count (3 DOWNTO 0) ="1001")THEN
IF(count <16#60#) THEN
IF(count="1011001") THEN
enhour_1<='1';
count<="0000000";
ELSE
count<=count+7;
END IF;
ELSE
count<="0000000";
END IF;
ELSIF (count <16#60#) THEN
count<=count+1;
enhour_1<='0' after 100 ns;
ELSE
count<="0000000";
END IF;
END IF;
END process;
END fun;