武汉纺织大学计算机科学学院
逻辑设计 课程设计报告
数字钟设计
(三人多数表决器、“101”序列检测器)
1
计算机科学学院 逻辑设计 课程设计报告
1 题目与要求
1.1 问题提出
本人设计一个数字时钟,主要用来实现 00~59 的秒、分六十进制计数器, 00~23 的小
时二十四进制计数器,整点报时,置数,清零以及数码管显示等功能。
1.2 设计原理
该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个
子模块:计时、报时(alarm1)、重置时间(s1、m1、h1、d1)。其中计时模块有4部分构
成:秒计时器(second1)、分计时器(minute1)、时计时器(hour1)和星期计时器(day1)。
秒计时器(second1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中 reset 为清0信号,当 reset 为0时,秒计时器清0;set 为置数信号,当 set 为0时,
秒计时器置数,置 s1的值。clk 为驱动秒计时器的时钟,sec 为秒计时器的输出,ensec
为秒计时器的进位信号,作为下一级的时钟输入信号。
分计时器(minute1)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中 reset 为清0信号,当 reset 为0时,分计时器清0;set 为置数信号,当 set 为0时,
分计时器置数,置 m1的值。 clkm 为驱动分计时器工作的时钟,与 ensec 相连接;min
为分计时器的输出;enmin 为分计时器的进位信号,作为下一级的时钟输入信号。
时计时器(hour1)是由一个24进制的计数器构成的,具有清0、置数和计数功能。
其中 reset 为清0信号,当 reset 为0时,时计时器清0;set 为置数信号,当 set 为0时,
时计时器置数,置 h1的值。 clkh 为驱动时计时器工作的时钟,与 enmin 相连接;hour
为时计时器的输出;enhour 为时计时器的进位信号,作为下一级的时钟输入信号。
星期计时器( day1)是由一个7进制的计数器构成的,具有清0、置数和计数功能。
其中 reset 为清0信号,当 reset 为0时,星期计时器清0;set 为置数信号,当 set 为0
时,星期计时器置数,置 d1的值。 clkd 为驱动星期计时器工作的时钟,与 enhour 相
连接;day 为星期计时器的输出。
报时模块(alarm1)的功能是当整点(将 min 作为该模块的输入信号,min=00且
sec<=1001)时,alarm 输出高电平,并且持续10秒钟。
根据电路特点,可用层次化结构化设计概念。将此项设计任务分成若干模块,每个
模块的功能原理分析如下:
秒计数器模块
分计数器模块
时间计数模块
小时计数器模块
整点报时模块
星期计数器模块
显示模块
数码管显示
- 1 -
1
计算机科学学院 逻辑设计 课程设计报告
2 设计过程
2.1 逻辑描述
1) 顶层文件
将以上四个模块连接在一起:
秒计数器模块 SECOND(60 进制),分计数器模块 MINUTE(60 进制),小时计数器模块 HOUR
(24 进制),星期计数器模块 DAY(7 进制),蜂鸣器报警器模块 Alarm。
2) 各模块之间的连线
对外的端口引脚名称:
输入:clk,set,reset,s1[7…0],m1[7…0],h1[7…0],d1[2…0]
输出:Alarm,Sec[7…0],min[7…0],hour[7…0],day[2…0]
具体的连接见以上连接示意图。
- 2 -
2
计算机科学学院 逻辑设计 课程设计报告
1) SECOND 源程序
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity second1 is
Port(clk,set,reset:in std_logic;
S1:in std_logic_vector(7 downto 0);
Sec:buffer std_logic_vector(7 downto 0);
Ensec:out std_logic);
End;
Architecture a of second1 is
Begin
Process(clk,reset,set,s1)
Begin
If reset='0' then sec<="00000000";
Elsif set='0' then sec<=s1;
Elsif clk'event and clk='1' then
if sec="01011001" then sec<="00000000";ensec<='1';
elsif sec="00001001" then sec<=sec+7;ensec<='0';
elsif sec="00011001" then sec<=sec+7;ensec<='0';
elsif sec="00101001" then sec<=sec+7;ensec<='0';
elsif sec="00111001" then sec<=sec+7;ensec<='0';
elsif sec="01001001" then sec<=sec+7;ensec<='0';
else sec<=sec+1;ensec<='0';
end if;
end if;
End process;
2) MINUTE 源程序
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity minute1 is
Port(clkm,set,reset:in std_logic;
m1:in std_logic_vector(7 downto 0);
min:buffer std_logic_vector(7 downto 0);
Enmin:out std_logic);
- 3 -
3
计算机科学学院 逻辑设计 课程设计报告
End;
Architecture a of minute1 is
Begin
Process(clkm,reset,set,m1)
Begin
If reset='0' then min<="00000000";
Elsif set='0' then min<=m1;
Elsif clkm'event and clkm='1' then
if min="01011001" then min<="00000000";enmin<='1';
elsif min="00001001" then min<=min+7;enmin<='0';
elsif min="00011001" then min<=min+7;enmin<='0';
elsif min="00101001" then min<=min+7;enmin<='0';
elsif min="00111001" then min<=min+7;enmin<='0';
elsif min="01001001" then min<=min+7;enmin<='0';
else min<=min+1;enmin<='0';
end if;
end if;
End process;
End;
3) HOUR 源程序
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity hour1 is
Port(clkh,set,reset:in std_logic;
h1:in std_logic_vector(7 downto 0);
hour:buffer std_logic_vector(7 downto 0);
Enhour:out std_logic);
End;
Architecture a of hour1 is
Begin
Process(clkh,reset,set,h1)
Begin
If reset='0' then hour<="00000000";
Elsif set='0' then hour<=h1;
Elsif clkh'event and clkh='1' then
if hour="00100011" then hour<="00000000";enhour<='1';
elsif hour="00001001" then hour<=hour+7;enhour<='0';
elsif hour="00011001" then hour<=hour+7;enhour<='0';
- 4 -
4
计算机科学学院 逻辑设计 课程设计报告
else hour<=hour+1;enhour<='0';
end if;
end if;
End process;
End;
4) DAY 源程序
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity day1 is
Port(clkd,set,reset:in std_logic;
d1:in std_logic_vector(2 downto 0);
day:buffer std_logic_vector(2 downto 0));
end day1;
Architecture a of day1 is
Begin
Process(clkd,reset,set,d1)
Begin
If reset='0' then day<="000";
Elsif set='0' then day<=d1;
Elsif clkd'event and clkd='1' then
If day=6 then day<="000";
Else day<=day+1;
End if;
End if;
End process;
End a;
5)ALARM 源程序
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity alarm1 is
Port(reset:in std_logic;
Min:in std_logic_vector(7 downto 0);
sec:in std_logic_vector(7 downto 0);
Alarm:out std_logic);
End;
Architecture a of alarm1 is
- 5 -
5
计算机科学学院 逻辑设计 课程设计报告
signal aaa:std_logic_vector(7 downto 0);
Begin
aaa<="00001010";
Alarm<='1' when (min="00000000" and sec<=aaa)and reset='1' else
'0';
end;
2.2 编译(Compilation)
选用的芯片为:ACEX1K 系列 EP1K30TC144-3
引脚分配如图:
编译中遇到的主要问题
由于对 Quartus Ⅱ的开发环境以及软件的使用不是很熟练,以及对 EDA 电路原理及实
现机制不了解,以至于在下载及分配引脚,实现逻辑功能实现时有些不知所措。
编译结果
编译结果与预期结果相符合。
2.3 逻辑功能仿真(Simulation)
1)整机电路仿真图:
2)报时结果:
图中 clk 为内部时钟,报时时间为 10 秒。
- 6 -
6
计算机科学学院 逻辑设计 课程设计报告
3)时间设置:
图中 CLK 为内部时钟 1HZ。当遇到上升沿的时候 Sec 加 1,当 Sec 加到 59 时从 00 开始循环,
同时在 min 上产生一个进位。
2.4 下载(Programming)
设备:PC 机、DICE-EH2000 EDA 实验开发系统
由上调试过程可知,该数字钟实现了计时、重置时间、整点报时三大功能。
在给数字钟重置时间后,数字钟便开始从所置的时间计时,到达59秒时,秒计时器回到
0秒,并且给分钟加1;当到达59分时,分计时器回到0分钟,并且给小时加1;当到达23
小时时,时计时器回到0小时,并且给星期加1;当到达星期六时,星期计时器又回到0。
当到达59分,分计时器回到0时,报时装置输出高电平,并且持续10秒钟。
不足的是时间的设定太过麻烦输入太多,想用两个输入来替代最终没有成功,由于
时间的原因没有解决,相信以后有时间一定可以解决。
2.5 验证
经过重重实验与验证,实验结果与预期是一致的。
3 设计总结
通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。在编
写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,
总是有错误的存在,但是在老师的指导下,在对程序进行修改后,以及正确选择硬件模
块后,就对其进行了硬件测试,并且最后硬件测试结果与期望得到了功能要求一致。
总的来说,这次设计的数字钟还是比较成功的。从这次实验中我学到了很多东西,
不仅对 EDA 实验有所了解,而且还把实验和理论结合起来实用,对 EDA 有了较深入的
了解。不仅学到了不少知识,而且锻炼了自己的实际动手的能力和思考的能力。使自己
对以后的学习道路有了个更加清楚的认识!
4 结束语
在实验设计中,由于知识的缺乏,使得我们遇到不少困难,但在我们曾老师和一个
大三学长的帮助下,我们终于如期完成了任务,在这诚心的感谢曾老师,还有给予我们
- 7 -
7