数 字 电 子 技 术 课 程
设计报告
班级:
学号:
姓名:
指导老师:
2007 年 11 月 28 日
目录
一. 实验名称
二. 实验要求和目的
三. 实验环境
四. 功能说明
五. 设计方案
六. 设计实验图
七. 模块代码及试图
八. 局部功能解释与设计
九. 心得体会
十. .参考文献
一. 实验名称
简易数字钟.
二. 实验要求和目的
1. 要求:
(1).能惊醒正常的时,分,秒计时功能,分别由 6 个数码管显示 24h,60min,60s
(2).按下 sa 键时,计时器迅速增加,并按 24h 循环,计满 23h 后再回 00.
(3).按下 sb 键时,计时器迅速增加,并按 60min 循环,计满 59min 后再回 00,但不响”时”
进位.
(4).利用实验装置上的蜂鸣器作整点报时,当计时到达 59’50”时开始报时,在 59 分钟
的第“50”、“52”、“54”、“56”,”58”秒报时,报时频率选 500Hz;在 59 分钟的第“60”
秒,整点报时,报时频率选 1KHz。
2.目的:掌握各类计数器以及它们相连的设计方法;掌握多个数码管显示的原理与方法;
掌握 FPGA 计时的层次化设计方法;掌握使用 VHDL 语言的设计思想;对整个系统的设计有一个
了解..
三 、实验环境:
1. 软件环境:Quartus
II 4.2
2. 硬件环境:硬件平台 LP-2900,FPGA 芯片为 EPF10K10TC144-4
3. 本实验除时钟源、按键、扬声器和显示器(数码管)之外的所有数字电路功
能都是用 VHDL 语言实现的。这样设计具有体积小、设计周期短(设计过程
中即可实现时序仿真)、调试方便、故障率低、修改升级容易等特点。本设计
采用自顶向下、混合输入方式(原理图输入——顶层文件连接和 VHDL 语言输
入——各模块程序设计)实现数字钟的设计、下载和调试.
四、功能说明:
1. 完成秒/分/时的依次显示并正确计数;
2. 定时闹钟:实现整点报时,由蜂鸣器发出报时声音;
3. 设置时间:可以通过按键分别对分/时钟进行调整,通过 PS1 对秒进行清
零。
五、设计方案:
1. 数字钟顶层设计
1. 外部输入要求:输入信号有 10mHz 时钟信号, 低电平有效的秒清零信号 CLR、
高电平有效的调分信号 sa、高电平有效的调时信号 sb;
2. 外部输出要求:整点报时信号 bbb(59 分”50”,”54”,”56”,”58”秒时未 500Hz 低频声,
59 分 60 秒时为 1kHz 高频声)、时十位显示信号 t1(a,b,c,d,e,f,g)、时个位显示信号
t0(a ,b,c,d,e,f,g)、分十位显示信号 m1 及分个位 m0、秒十位 s1 及秒个位 s0;数码管
显示位选信号 SEL0/1/2 等三个信号。
设计概要图:
模块:
1. mian: 该模块为 60 进制计数器,计时输出为秒的数值.在计时
到 59 时送到进位信号 CO,因为硬件有延时,所以模块 MINA
在此模块变为 00 时加 1,符合实际.
2. MINA: 该模块为 60 进制计数器,计时输出为分的数值.在
EN 信号有效时数钟到来时,计数器加 1.在 sb 按下时,EN
信号有效,计数值快速增加,从而实现对分钟的设置.
3. HOUR: 该模块为 24 禁止计数器,计时输出小时的数值.
4. SST:此模块为整点报时提供控制信号.
5. BBB:该模块对应不同的片选信号送出不同的要显示的数
据
6. Sel:该模块提供数码管片选信
7. FEN10:这个模块时实现十分频
8. DISP:它是七段译码器.
9. CCC:输入为 10MHz 方波,输出为 500Hz 和 1KHz 的方波.
六.实验设计图:
七.模块及模块功能:
1. 模块 mian. 该模块为 60 进制计数器,计时输出为秒的数值.在计时
到 59 时送到进位信号 CO,因为硬件有延时,所以模块 MINA 在此模
块变为 00 时加 1,符合实际.
模块代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity mian is
port(clk,clr:in std_logic;
sec1,sec0:out std_logic_vector(3 downto 0);
co:out std_logic);
end mian;
architecture mian_arc of mian is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clr='1'then
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1'then
if cnt1="0101" and cnt0="1000"then
co<='1';
cnt0:="1001";
elsif cnt0<"1001"then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101"then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;
end process;
end mian_arc;