课程设计报告
学生姓名学号
班级
专业电子信息工程
题目数字时钟设计
指导教师
2011 年11 月
一、任务和设计要求
1. 熟悉集成电路的引脚安排。
2. 掌握各芯片的逻辑功能及使用方法。
3. 了解数字钟的组成及工作原理。
4. 熟悉数字钟的设计与制作。
1.设计指标
(1)时间以24 小时为一个周期;
(2)显示时、分、秒;
(3)有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;
(4)计时过程具有报时功能,当时间到达整点前 5 秒进行蜂鸣报时。
2.设计要求
(1)画出电路原理图(或仿真电路图);
(2)元器件及参数选择;
(3)电路仿真与调试
二、设计原理
设计思路
根据系统设计要求,系统设计采用自顶向下设计方法,由时钟分频部分、计时部分、按键部分调时部分和显示部分五个部分组成。这些模块都放在一个顶层文件中。
1)时钟计数:
首先下载程序进行复位清零操作,电子钟从00:00:00计时开始。sethour可以调整时钟的小时部分, setmin可以调整分钟,步进为1。
由于电子钟的最小计时单位是1s,因此提供给系统的内部的时钟频率应该大于1Hz,这里取100Hz。CLK端连接外部10Hz的时钟输入信号clk。对clk进行计数,当clk=10时,秒加1,当秒加到60时,分加1;当分加到60时,时加1;当时加到24时,全部清0,从新计时。
用6位数码管分别显示“时”、“分”、“秒”,通过OUTPUT( 6 DOWNTO 0 )上的信号来点亮指定的LED七段显示数码管。
2)时间设置:
手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:
reset为复位键,低电平时实现清零功能,高电平时正常计数。可以根据我们自己任意时间的复位。
总体结构图
三、系统设计
1)时、分、秒计时器
时计时器为一个24进制计数器,分、秒计时器均为60进制计数器。当秒计时器接受到一个秒脉冲时,秒计数器开始从1计数到60,此时秒显示器将显示00、01、02、 (59)
00;每当秒计数器数到00时,就会产生一个脉冲输出送至分计时器,此时分计数器数值在原有基础上加1,其显示器将显示00、01、02、...、59、00;每当分计数器数到00时,就会产生一个脉冲输出送至时计时器,此时时计数器数值在原有基础上加1,其显示器将显示00、01、02、...、23、00。即当数字钟运行到23点59分59秒时,当秒计时器在接受一个秒脉冲,数字钟将自动显示00点00分00秒。
2)校时电路
当开关拨至校时档时,电子钟秒计时工作,通过时、分校时开关分别对时、分进行校对,开关每按1次,与开关对应的时或分计数器加1,当调至需要的时与分时,拨动reset 开关,电子钟从设置的时间开始往后计时。
四、参考程序
Alert模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY alert IS
PORT(clk:IN STD_LOGIC;
dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
speak:OUT STD_LOGIC;
lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END alert;
ARCHITECTURE fun OF alert IS
SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
speaker:PROCESS(clk)
BEGIN
--speak<=count1(1);
IF(clk'event and clk='1')THEN
IF(dain="0000000")THEN
speak<=count1(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器ELSE
count1<=count1+1;
--speak<=count1(0);
END IF ;
END IF ;
END IF ;
END PROCESS speaker;
lamper:PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
END IF;
count<=count+1;
ELSE
count<="00";
END IF;
END IF;
END PROCESS lamper;
END fun;
Hour模块
LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY hour IS
PORT(clk,reset:IN STD_LOGIC;
daout:out STD_LOGIC_VECTOR(5 DOWNTO 0));
END ENTITY hour;
ARCHITECTURE fun OF hour IS
SIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
daout<=count;
PROCESS(clk,reset)
BEGIN
IF(reset='0')THEN count<="000000"; --若reset=0,则异步清零
ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到IF(count(3 DOWNTO 0)="1001")THEN --若个位计时恰好到"1001"即9
IF(count<16#23#)THEN --23进制
count<=count+7; --若到23D则
else
count<="000000"; --复0
END IF;
ELSIF (count<16#23#)THEN --若未到23D,则count进1
count<=count+1;
ELSE --否则清零
count<="000000";
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END PROCESS;
END fun;
Minute模块
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; --enmin_1为59分时的进位信号BEGIN --enmin_2由clk调制后的手动调时脉冲信号串daout<=count;
enhour_2<= (sethour and clk1); --sethour为手动调时控制信号,高电平有效enhour<= (enhour_1 or enhour_2);
PROCESS(clk,reset,sethour)
BEGIN
IF(reset='0') THEN --若reset为0,则异步清零
count<="0000000";
ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到
IF(count (3 DOWNTO 0) ="1001")THEN--若个位计时恰好到"1001"即9
IF(count <16#60#) THEN --又若count小于16#60#,即60
IF(count="1011001") THEN--又若已到59D
enhour_1<='1'; --则置进位为1
count<="0000000"; --count复0
ELSE
count<=count+7; --若count未到59D,则加7,即作"加6校正"
END IF; --使前面的16#60#的个位转变为8421BCD的容量
ELSE
count<="0000000";--count复0(有此句,则对无效状态电路可自启动)
END IF; --END IF(count<16#60#)
ELSIF (count <16#60#) THEN
count<=count+1; --若count<16#60#则count加1
enhour_1<='0' after 100 ns; --没有发生进位
ELSE
count<="0000000"; --否则,若count不小于16#60# count复0
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END process;
END fun;
Second模块
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 ENTITY second;
ARCHITECTURE fun OF second IS
SIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL enmin_1,enmin_2:STD_LOGIC; --enmin_1为59秒时的进位信号BEGIN --enmin_2由clk调制后的手动调分脉冲信号串daout<=count;
enmin_2<=(setmin and clk); --setmin为手动调分控制信号,高电平有效
enmin<=(enmin_1 or enmin_2); --enmin为向分进位信号
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THEN count<="0000000"; --若reset为0,则异步清零
ELSIF(clk 'event and clk='1')then --否则,若clk上升沿到
IF(count(3 downto 0)="1001")then --若个位计时恰好到"1001"即9
IF(count<16#60#)then --又若count小于16#60#,即60H
IF(count="1011001")then --又若已到59D
enmin_1<='1';count<="0000000";--则置进位为1及count复0 ELSE --未到59D
count<=count+7; --则加7,而+7=+1+6,即作"加6校正"
END IF;
ELSE --若count不小于16#60#(即count等于或大于16#60#)count<="0000000"; --count复0
END IF; --END IF(count<16#60#)
ELSIF(count<16#60#)then --若个位计数未到"1001"则转此句再判
count<=count+1; --若count<16#60#则count加1
enmin_1<='0'after 100 ns; --没有发生进位
ELSE --否则,若count不小于16#60#
count<="0000000"; --则count复0
END IF; --END IF(count(3 DOWNTO 0)="1001")END IF; --END IF(reset='0')
END PROCESS;
END fun;
五、系统调试与性能分析
时基T 产生电路
数字钟以其显示时间的直观性、走时准确性作为一种计时工具,数字钟的基本组成部分离不开计数器,在控制逻辑电路的控制下完成预定的各项功能。
由晶振产生的频率非常稳定的脉冲,经整形、稳定电路后,产生一个频率为1Hz的、非常稳定的计数时钟脉冲。
调时、调分信号的产生
由计数器的计数过程可知,正常计数时,当秒计数器(60进制)计数到59 时,再来一个脉冲,则秒计数器清零,重新开始新一轮的计数,而进位则作为分计数器的计数脉冲,使分计数器计数加1。现在我们把电路稍做变动:把秒计数器的进位脉冲和一个频率为2Hz 的脉冲信号同时接到一个2选1数据选择器的两个数据输入端,而位选信号则接一个脉冲按键开关,当按键开关不按下去时(即为0),则数据选择器将秒计数器的进位脉冲送到分计数器,此时,数字钟正常工作;当按键开关按下去时(即为1),则数据选择器将另外一个2Hz 的信号作为分计数器的计数脉冲,使其计数频率加快,当达到正确时间时,松开按键开关,从而达到调时的目的。调节小时的时间也一样的实现。
计数显示电路
由计数部分、数据选择器、译码器组成,是时钟的关键部分。
1、计数部分:由两个60进制计数器和一个24 进制计数器组成,其中60 进制计数器可用6 进制计数器和10 进制计数器构成;24 进制的小时计数同样可用6 进制计数器和10 进制计数器得到:当计数器计数到24 时,“2”和“4”同时进行清零,则可实现24 进制计数。
2、数据选择器:84 输入14 输出的多路数据选择器,因为本实验用到了8个数码管(有两个用来产生隔离符号‘—’)。
3、译码器:七段译码器。译码器必须能译出‘—’,由实验二中译码器真值表可得:字母F 的8421BCD 码为“1111”,译码后为“1000111”,现在如果只译出‘—’,即字母F 的中间一横,则译码后应为“0000001”,这样,在数码管上显示的就为‘—’。
仿真
未曾编辑的仿真波形
仿真波形
实验结果
实验箱使用模式7,键8为复位按键,键8为1时正常工作。键4设置小时,键7设置分钟。
下载成功后,按下键8,及使六个LED复位清零,显示数秒的自动计时,可以通过4键设置小时数,7键设置分钟数。当秒数满60则进一位,分钟数满60进一位,当显示为23:59:59时,秒数在加一则显示00:00:00,之后从新计时。
六、训练体会
通过这次课程设计,我进一步加深了对电子设计自动化的了解。并进一步熟练了对QuartusII软件的操作。EDA这门课程再也不像学习理论般那么空洞,有了更加贴切的了解及运用。
在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足。通过与同学探讨和请教老师,终于把问题都解决了,并加深了对数字时钟原理和设计思路的了解。
同时我也掌握了做课程设计的一般流程,为以后的电子设计这块积累了一定的经验,为以后从事相关工作一些帮助。
做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。最后参照每个模块把输入和输出引脚设定,运用我们所学的VHDL语言进行编程。总之,通过这次的设计,进一步了解了EDA 技术,收获很大,对软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的
锻炼和提高。