数字逻辑课程设计篮球计时器.docx
数字逻辑课程设计 篮球计时器计算机与信息学院 数字逻辑 课程设计报告 专 业 班 级 学生姓名及学号 课程教学班号 任 课 教 师 实验指导教师 实验地点 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) 暂停,清零以及半场继续计时控制开关能够分别停止计时器的计数功能,使得计时器全部清零重置半场状态变量,和使得计数器清零并且改变半场状态变量 实现篮球计时器的功能。 五、实验代码: 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 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时,维持原半场状态 minl="0000"and sech="0000" and 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; end if; else secl:=secl+1; end if; end if; end IF; secondl<=secl; secondh<=sech; minutel<=minl; minuteh<=minh; state<=sta; bell<=ebell; end PROCESS; end behave; 六、实验结果: 本实验有三个开关,分别为pause,set,clear. 当pause=1,set=1,clear=1时计时器开始正常计时. 当pause=0,set=1,clear=1时计时器会停止计时. 当pause=1,set=1,clear=1时计时器会继续计时. 当pause=1,set=1,clear=0时计时器会清零并重新计时. 当计时器已经到达半场,响铃并停止计时后pause=1,set=0,clear=0时此时计时器会清零,重新计时,半场状态会变为2,代表下半场. 当计时器到达全场结束时pause=1,set=1,clear=0时此时计时器会清零,重新计时,半场状态会变为1. 七、心得体会: 在最开始写程序的时候,会遇到在代码里出现某些值应该出现在敏感列表里,但是却没有放,这就导致了编译时常报错的情况. 当你把程序里的格式没有错误时,却发现下载到器件里后, 在分钟那块计时时计数却没有按照正常的情况显示,这样就重新看下代码.发现是自己在逻辑上出现了错误,分钟计时时,应该首先判断分钟的个位计时,是否到达了9,没有到达9,就加一,如果到达了9,那么就使分钟的十位加一,并且分钟个位变0. 开始在程序里无法使得当计数达到20分钟00秒时停下来.只能继续计时,后来开始在判断是否是上升沿的那个判断语句中加上了一个是否分钟的十位是否为”0010”的判断,当前计时如果达到了20分钟的话,那么分钟的十位必然为”0010”,那么就不在执行下面的计时语句,就使得在20分钟00秒的时侯停下来了. 在做分频电路的过程中发现有时候出现所分的频率不均匀,有时候时间间隔为1秒,有时候间隔小于1秒,经过查找错误发现所选择地频率是个未知的可以调节的频率,但是调节的有点不太稳定,后来换了个稳定的100MHz的频率,在程序中加了一个分频点路,当计数达到50000时,就对信号取反,这样使得产生的信号时为1Hz,这样完成了分频的要求. 这次试验中感觉锻炼自己最大的就是发现了错误,自己去寻找错误,去修正错误,只有在自己无法解决的情况下才去找老师,这样在听了老师的讲解后会有一种豁然开朗的感觉,这样感觉到才是真正的利用,并且理解到了上课学的知识.这次课程设计感觉时机很合适,刚好能消化自己原来学的知识