计算机与信息学院
《数字逻辑》
课程设计报告
专 业 班 级
学 生 姓 名 及 学 号
课 程 教 学 班 号
任 课 教 师
实 验 指 导 教 师
实 验 地 点
20
~20 学年第
学期
课程设计题目:篮球比赛计时器
设计要求:设计篮球比赛计时器使其具有下述功能:
(1)篮球比赛上下半场各 20 分钟,要求能随时暂停,启动后继续计时,
一场比赛结束后应可清零重新开始比赛。
(2)计时器由分、秒计数器完成,秒计数器为模 60,分计数器应能计
至 40 分钟。
(3)“分”、“秒”显示用 LED 数码管,应配用相应译码器。
(4)人工拨动开关来控制计时器的启动/暂停。
(5)半场、全场到自动会有相应的提示
一、 设计目的∶
1,掌握组合逻辑电路、时序逻辑电路及数字逻辑电路系统的设计、
安装、测试方法;
2,进一步巩固所学的理论知识,提高运用所学知识分析和解决实
际问题的能力;
3,初步掌握使用EDA(电子设计自动化)工具设计数字逻辑电路的
方法,包括设计输入、编译、软件仿真、下载和硬件仿真等全过程;
二、 设计原理∶
篮球计时器的基本结构是由一个 60 进制计数器和一个二十进制计
数器构成,分别对秒,分进行计数,秒计数器计数达到 59 秒时,在这
时会产生一个高电平的进位信号,并且秒计数器清零,这个进位信
号会使分钟计时器开始工作进行计时,此进位信号为高电平有效,
平时当秒计数器没有达到 59 时,会让此信号为低电平,就使分计时
器不工作,而当分计时器到达 20,秒计时器到达 00 时,当时间计数
到 20 分 00 秒时,此时会产生一个高电平信号,使得电箱上的喇叭一
直响,此时计时器也停止计数,相当于篮球比赛中的半场或者全场
时间到时的提示.如果此时是半场到了的话,请按下开关 K3,这个
开关 K3 会使得计数重新清零,并且提示半场状态的变量会变成 2,
此时开始进入下半场,并且一个 LED 数码管会显示数字 2,代表此时
已经是下半场了,如果是上半场的话,这个数码管会显示为 1,接下
来就是下半场的计时,如果你想在某个时刻停止计时的话那么就可
以按下开关 K2,这个 K2 能使得该计数器不再工作,只有你重新把开
关 K2 打到高电平时,此计数器才会重新工作,当这个计数器到达下
半场的 20 分钟 00 秒时,同样会停止计时,并且一直响喇叭,此时相
当于提示你全场比赛结束,如果你还想重新清零计时的话,那么只
有按下 clear 开关重新清零计时.
由于计数器的计数时钟 CLK 为 1Hz 的标准信号,那么我们只有对电
路箱上的 100MHz 进行分频,通过计数,当计数达到 50000 时候,信号
取反,通过这样的方式可以把 100MHz 的信号分成 1Hz.
此实验用到了 5 个 LED 数码管,两个用来显示秒的状态,两个用来显
示分的状态,最后一个用来显示半场的状态(1 代表上半场,2 代表
下半场),有三个开关,一个用来在全场结束后或者比赛中清零重新
计时,一个用来暂停或继续计时,最后一个用来在上半场结束后进
行下半场的继续计时.
三、所需器件与设备:
1、TDS 系列数字电路实验系统
2、ISP 系统可编程器件以及《数字逻辑》课程实验所用部分中、
小规模集成电路等
3、PC 计算机
4、ISP1032E 可编程逻辑器件以及数据选择器、触发器、移位寄存
器、计数器及基本门电路等
5、在 Windows 平台上运行的 ispLEVER 编程软件
四、实现涉及的几个重要模块如下:
(1)分频器将高速的外部时钟频率分频成每秒钟一次的时钟频率,
以便进行时钟计数,通过利用计数的原理,当计数达到49999的时候
对信号取反,以达到分频的效果.
(2) 计数器实际上是一个异步复位的累加器,通常情况下进行时钟
累加计数,首先对秒进行计数,当到达59时,产生进位信号并且秒表
归零,这时候才对分钟进行计数,如果分钟没到20,那么正常计数,
到达了20,那么就响铃,停止计数。
(3)显示器根据需要显示当前时间以及此时所处在的半场状态,若
处于上半场,那么其中半场状态数码管显示为1,如果处于下半场,
数码管显示为2
(4) 暂停,清零以及半场继续计时控制开关能够分别停止计时器的
计数功能,使得计时器全部清零重置半场状态变量,和使得计数器
清零并且改变半场状态变量
(5)实现篮球计时器的功能。
五、实验代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity basketball is
PORT(pause,set:IN std_logic;------控制计数暂停的开关
clear:IN std_logic;--------控制清零的开关
clk:IN std_logic;---------时钟信号
bell:OUT std_logic;---------响铃输出信号
secondl:OUT std_logic_vector(3 downto 0);--------显示秒表
的个位
secondh:OUT std_logic_vector(3 downto 0);--------显示秒表
的十位
minutel:OUT std_logic_vector(3 downto 0);--------显示分钟
的个位
minuteh:OUT std_logic_vector(3 downto 0);--------显示分钟
的十位
state:OUT std_logic_vector(3 downto 0));---------显示半场
处的状态
end basketball;
-------------------------------------------------分频电路
architecture behave of basketball is
SIGNAL clk1:std_logic;
begin
PROCESS(clk)
VARIABLE cnt:integer range 0 to 49999;
begin
候,信号取反
IF(clk'EVENT AND clk = '1') THEN
if(cnt=49999) THEN-----当计数达到 50000 的时
cnt:=0;
clk1<=not clk1;
else
cnt:=cnt+1;
end if;
end IF;--------相当于把 100MHz 的信号分成 1Hz 的
信号
END PROCESS;
-------------------------开始计时的进程
PROCESS(clk1)
VARIABLE secl,sech,minl,minh,sta:std_logic_vector(3 downto
0);
VARIABLE en,ebell:std_logic;
begin
if(minh="0010"and
minl="0000"and
sech="0000"
and
secl="0000")
THEN----------------------当计时达到 20 分钟 00 秒时发出响
铃,状态变为 2
ebell:='1';
sta:="0010";
else
ebell:='0';
end if;
IF(clear='0') THEN----------清零开关低电平有效
secl:="0000";
sech:="0000";
minl:="0000";
minh:="0000";
if(set='0')THEN -----------控制半场后继续计时开关
sta:=sta; ----------当开关为 0 时,维持原半场状态
else --------------当开关为 1 时,状态变为 1
sta:="0001";
end if;
ELSIF(clk1='1'AND clk1'EVENT AND minh/="0010"AND sta='0')
THEN
---------处于上升沿,不响铃并且分钟十位不为 2 时,可以计时
if(pause='1')THEN------------en 为秒表进位信号
en:=sech(2) and sech(0) and secl(3)and secl(0) and pause;
if(en='1') then
if(minl="1001") then----------对分钟个位计时
minl:="0000";
minh:=minh+1;------------分钟十位计时
else
minl:=minl+1;
end if;
end if;
if(secl="1001") then ---------秒表个位计时
secl:="0000";
if(sech="0101") then--------秒表十位计时
sech:="0000";
else
sech:=sech+1;