学生姓名:
实验类型:□ 验证 □ 综合 ■ 设计 □ 创新 实验日期: 2010.11.12
专业班级: 通信 083 班
实验成绩:
号:
学
实验四 数字钟设计
一、实验目的
(1)学习较复杂数字电路系统的设计;
(2)学习掌握多个数码管动态显示的原理和方法;
(3)进一步掌握用 VHDL 语言描述硬件的设计思想。
二、实验要求
(1)在实验箱上实现动态扫描数码管显示时分秒;
(2)可以预置为 12 小时计时显示和 24 小时计时显示;
(3)一个调节键,用于调节目标数位的数字。对调节的内容敏感,如调节分钟或秒时,保持
按下时自动计数,否则以脉冲计数;
(4)、一个功能键,用于切换不同状态:计时、调时、调分、调秒、调小时制式。
三、实验设备
PC 机一台 ,Quartus II 软件一套,EDA 实验箱一个
四、设计原理
由实验要求知,数字钟设计要求有时分秒计数部分,时计数又有模 12 计数和模 24 计数,故需
要一个二选一数据选择器,要在动态数码管上显示,故需要数码管扫描器,其中,又考虑到实验室
提供的最小频率是 2Hz,故也还需要一个分频器。
具体的实验代码如下:(--实验程序中分频器和数据选择器部分及计数器大部分主要由自己完成,而
计数小部分和动态扫描部分则来自网上)
1、 分频器:采用的是二分频。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fpq IS
PORT ( CLK :
IN STD_LOGIC;
CLK_OUT : OUT STD_LOGIC);
END ENTITY fpq;
ARCHITECTURE one OF fpq IS
BEGIN
PROCESS(CLK)
VARIABLE CNT : STD_LOGIC_VECTOR(0 TO 0);
BEGIN
IF CLK'EVENT AND CLK='1' THEN CNT := CNT+1;
END IF;
CLK_OUT <= CNT(0);
END PROCESS;
END ARCHITECTURE one;
在 Quartus II 软件上编译成功后封装成系统可调用文件 fpq.bdf,如图 1.a 所示。
图 1:a
b
c
ENHOUR
DAOUT_M[7..0]
MINUTE
CLK
CLKS
RESET
SETHOUR
inst2
f pq
CLK
CLK_OUT
inst
SECOND
CLK
RESET
SETMIN
inst1
ENMIN
DAOUT_S[7..0]
2、 秒计数部分:采用模 60 计数。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SECOND IS
PORT ( CLK,RESET,SETMIN :
IN STD_LOGIC;
ENMIN : OUT STD_LOGIC;
DAOUT_S : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY SECOND;
ARCHITECTURE one OF SECOND IS
SIGNAL COUNT : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL ENMIN_1,ENMIN_2 : STD_LOGIC;
BEGIN
ENMIN_2<=(SETMIN AND CLK);
ENMIN<=(ENMIN_1 OR ENMIN_2);
PROCESS(CLK,RESET,SETMIN)
BEGIN
IF RESET='1' THEN
--保证秒钟能够在模 60 时准确计数,含义是 COUNT<16 进制数 60
COUNT<="00000000"; ENMIN_1<='0';
ELSIF CLK'EVENT AND CLK='1' THEN
IF COUNT(3 DOWNTO 0)="1001" THEN
IF COUNT<16#60# THEN
IF COUNT="01011001" THEN
ENMIN_1<='1';COUNT<="00000000";
ELSE COUNT<=COUNT + 7;
END IF;
ELSE COUNT<="00000000";
END IF;
ELSIF COUNT<16#60# THEN COUNT<=COUNT + 1;ENMIN_1<='0';
ELSE COUNT<="00000000";ENMIN_1<='0';
END IF;
END IF;
DAOUT_S<=COUNT;
END PROCESS;
END one;
在 Quartus II 环境下编译成功后封装成系统可调用文件 SECOND.bdf,如图 1.b 所示。
3、 分计数部分:由于分计数器的时钟受秒计数器的输出控制,故其 CLK 有两个,其中 CLKS 是计
数器本身的时钟,受分频器的输出控制,而 CLK 则受秒计数器的输出控制,采用模 60 计数。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MINUTE IS
PORT ( CLK,CLKS,RESET,SETHOUR
:
IN STD_LOGIC;
ENHOUR : OUT STD_LOGIC;
DAOUT_M : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY MINUTE;
ARCHITECTURE one OF MINUTE IS
SIGNAL COUNT : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL ENHOUR_1,ENHOUR_2 : STD_LOGIC;
BEGIN
ENHOUR_2<=(SETHOUR AND CLKS);
ENHOUR<=(ENHOUR_1 OR ENHOUR_2);
PROCESS(CLK,RESET,SETHOUR)
BEGIN
IF RESET='1' THEN COUNT<="00000000";ENHOUR_1<='0';
ELSIF CLK'EVENT AND CLK='1' THEN
IF COUNT(3 DOWNTO 0)="1001" THEN
IF COUNT<16#60# THEN
IF COUNT="01011001" THEN ENHOUR_1<='1';COUNT<="00000000";
ELSE COUNT<=COUNT + 7;ENHOUR_1<='0';
END IF;
ELSE COUNT<="00000000";
END IF;
ELSIF COUNT<16#60# THEN COUNT<=COUNT + 1;ENHOUR_1<='0'AFTER 100 ns;
ELSE COUNT<="00000000";ENHOUR_1<='0';
END IF;
END IF;
DAOUT_M<=COUNT;
END PROCESS;
END one;
在 Quartus II 环境下编译成功后封装成系统可调用文件 MINUTE.bdf,如图 1.c 所示。
4、 时计数部分:时钟计数要求有 12 小时制和 24 小时制,故用一个模 12 计数器和模 24 计数器在
加上一个二选一数据选择器就可以搞定时计数的转换了。
模 12 计数:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY HOUR_12 IS
PORT ( CLK,RESET :
IN STD_LOGIC;
DAOUT_H12 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY HOUR_12;
ARCHITECTURE one OF HOUR_12 IS
SIGNAL COUNT : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(CLK,RESET)
BEGIN
IF RESET='1' THEN COUNT<="00000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF COUNT(3 DOWNTO 0)="1001" THEN
IF COUNT<16#11# THEN COUNT<=COUNT + 7;
ELSE COUNT<="00000000";
END IF;
ELSIF COUNT<16#12# THEN COUNT<=COUNT + 1;
ELSE COUNT<="00000000";
END IF;
END IF;
DAOUT_H12<=COUNT;
END PROCESS;
END one;
在 Quartus II 环境下编译成功后封装成系统可调用文件 HOUR_12.bdf,如图 2.a 所示。
模 24 计数:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY HOUR_24 IS
PORT ( CLK,RESET :
IN STD_LOGIC;
DAOUT_H24 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY HOUR_24;
ARCHITECTURE one OF HOUR_24 IS
SIGNAL COUNT : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(CLK,RESET)
BEGIN
IF RESET='1' THEN COUNT<="00000000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF COUNT(3 DOWNTO 0)="1001" THEN
IF COUNT<16#23# THEN COUNT<=COUNT + 7;
ELSE COUNT<="00000000";
END IF;
ELSIF COUNT<16#23# THEN COUNT<=COUNT + 1;
ELSE COUNT<="00000000";
END IF;
END IF;
DAOUT_H24<=COUNT;
END PROCESS;
END one;
在 Quartus II 环境下编译成功后封装成系统可调用文件 HOUR_24.bdf,如图 2.b 所示。
数据选择器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MUX21A IS
PORT ( ain,bin :
IN STD_LOGIC_VECTOR(7 DOWNTO 0);
IN STD_LOGIC;
set :
y
: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY MUX21A;
ARCHITECTURE one OF MUX21A IS
BEGIN
y<=ain WHEN set = '0' ELSE bin;
END ARCHITECTURE one;
在 Quartus II 环境下编译成功后封装成系统可调用文件 MUX21A.bdf,如图 2.c 所示。
图 2 :
b
a
c
DAOUT_H12[7..0]
HOUR_12
CLK
RESET
inst3
HOUR_24
CLK
RESET
inst4
DAOUT_H24[7..0]
y [7..0]
MUX21A
ain[7..0]
bin[7..0]
set
inst5
5、 动态扫描部分:将八位的输入转化为四位的输出,还有一个三位的输出,用来作为动态数码管
选择器的输入,程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY SETTIME IS
PORT ( CLK1,RESET :
IN STD_LOGIC;
IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SEC,MIN,HOUR :
DAOUT
DP
SEL
: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
: OUT STD_LOGIC;
: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END SETTIME;
ARCHITECTURE one OF SETTIME IS
SIGNAL COUNT : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
PROCESS(CLK1,RESET)
BEGIN
IF RESET='1' THEN COUNT<="000";
ELSIF CLK1'EVENT AND CLK1='1' THEN
IF COUNT>="101" THEN COUNT<="000";
ELSE COUNT<=COUNT + 1;
END IF;
END IF;
END PROCESS;
PROCESS(CLK1,RESET)
BEGIN
IF RESET='1' THEN DAOUT<="0000";DP<='0';SEL<="111";
ELSIF CLK1'EVENT AND CLK1='1' THEN
CASE COUNT IS
WHEN"000"=>DAOUT<=SEC(3 DOWNTO 0);DP<='0';SEL<="000";
WHEN"001"=>DAOUT<=SEC(7 DOWNTO 4);DP<='0';SEL<="001";
WHEN"010"=>DAOUT<=MIN(3 DOWNTO 0);DP<='1';SEL<="010";
WHEN"011"=>DAOUT<=MIN(7 DOWNTO 4);DP<='0';SEL<="011";
WHEN"100"=>DAOUT<=HOUR(3 DOWNTO 0);DP<='1';SEL<="100";
WHEN"101"=>DAOUT<=HOUR(7 DOWNTO 4);DP<='0';SEL<="101";
WHEN OTHERS=>DAOUT<="0000";DP<='0';SEL<="111";
END CASE;
END IF;
END PROCESS;
END one;
在 Quartus II 环境下编译成功后封装成系统可调用文件 SETTIME.bdf,如图 3 所示
SETTIME
CLK1
RESET
SEC[7..0]
MIN[7..0]
HOUR[7..0]
DAOUT[3..0]
DP
SEL[2..0]
五、实验步骤
图 3:
inst6
图 4:数字钟顶层文件
1:打开 Quartus II 软件建立新工程 shuzizhingsheji,并新建 VHDL File 文件 7 个,分别输入上述实验
代码并编译生成系统可调用文件;
2:根据实验要求画出数字钟的顶层文件原理图如图 4 所示,并进行编译;
3:建立仿真波形文件 shuzizhongsheji.vwf,然后进行波形仿真,得到仿真结果报告;
4: 引 脚 锁 定 : CLK-79,CLK1-80,SETMIN-60,SETHOUR-61,RESET-53,set-54,DAOUT[0]-10 ,
DAOUT[1]-9,DAOUT[2]-8,DAOUT[3]-11,SEL[0]-12,SEL[1]-13,SEL[2]-14。
5:把实验箱与 PC 机相连,把实验文件下载到实验箱中,进行硬件测试,验证仿真和测试结果。
七、测试及验证结果
下载成功后,动态数码管 1 和 2 以频率为 1Hz 开始计数,当计到 59 时,数码管 3 和 4 开始计
数,当数码管 3 和 4 计数到 59 时,数码管 5 和 6 开始计数,此时电平 2(引脚 54)是低电平的即
为模 12 计数,数码管 5 和 6 计数到 12 时下一次计数为 00,然后再继续计数到 11 时变为 00,符合
设计初衷;当电平 2 亮时即模 24 计数时,数码管第一次计数到 11 时下一次计数为 12 接着为 13 直
到 23,再变为 00,符合设计思路;当电平 1(引脚 53)亮时,数码管不计数。按下琴键 1 时,分
数码管即数码管 3 和 4 加 1,同理按下琴键 2 时,时数码管加 1。以下为仿真波形结果:
根据上述仿真结果也可以得到相应结果。
八、实验小结
本实验综合性较高,设计的时候一开始找不到头绪,不知道应该从那下手,直到与同学讨论后,
才弄清楚数字钟设计中应该包括哪些部分。在此次实验设计中,没有实现‘调分’的功能,还有就
是在实验室的时候时计数的模 12 计数时数码管第一次计数到 11 时直接就变为 00 了,也就是说没
有出现 12 这个时间,后来回到寝室经过仔细思考后,改动了模 12 计数的一个小部分,得到了上述
实验想要的结果。通过本次实验使我更进一步地熟悉了 VHDL 硬件描述语言的设计思想,也锻炼了
自己独立思考问题的能力,同时通过对程序的调试也使自己对 VHDL 语言的语法,结构和基本语句
有了更深刻的了解。