篮球比赛电子记分牌设计.docx
《篮球比赛电子记分牌设计.docx》由会员分享,可在线阅读,更多相关《篮球比赛电子记分牌设计.docx(21页珍藏版)》请在冰豆网上搜索。
篮球比赛电子记分牌设计
课题名称
篮球比赛电子记分牌设计
设计内容及要求
设计一个篮球比赛记分牌,使用4位数码管显示倒计时的分钟、秒钟值;2位数码管显示A方得分;2位数码管显示B方得分;使用LED灯作为上、下半场的标志;单次加分值包括1分、2分和3分。
系统提供50MHZ频率的时钟源。
完成该系统的硬件和软件的设计,并制作出实物装置,调试好后并能实际运用(指导教师提供制作所需的器件),最后就课程设计本身提交一篇课程设计说明书。
设计工作量
1、VHDL语言程序设计;
2、波形仿真;
3、在实验装置上进行硬件测试,并进行演示;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、硬件测试、调试过程,参考文献、设计总结等。
进度安排
起止日期(或时间量)
设计内容(或预期目标)
备注
第1天
课题介绍,答疑,收集材料
第2天
设计方案论证
第3天
进一步讨论方案,对设计方案进行必要的修正,方案确定后开始进行VHDL语言程序设计
第4天
设计VHDL语言程序
第5天
在实验装置上进行硬件测试,编写设计说明书
编写设计说明书
教研室
意见
年月日
系(部)主管领导意见
年月日
目录
一、概述-5-
1、EDA的介绍-5-
2、篮球比赛电子记分牌的介绍-5-
二、设计目的-6-
三、设计内容及要求-6-
四、设计思路-6-
五、单元模块设计-7-
1、分频模块-7-
2、计时模块-8-
3、计分模块-9-
4、显示模块-10-
5、消抖模块-12-
六、仿真结果及分析-16-
1、引脚分配图-16-
2、设计仿真图-17-
3、硬件测试-17-
4、仿真结果分析-17-
七、设计总结与心得-18-
八、参考文献-18-
一、概述
1、EDA的介绍
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
2、篮球比赛电子记分牌的介绍
体育比赛计时计分系统是对体育比赛过程中所产生的时间、比分等数据进行快速采集记录,加工处理,传递数据的信息系统。
根据不同运动项目的不同比赛规则要求,体育比赛的计时计分系统包括测量类、评分类、命中类、制胜类得分类等多种类型。
篮球比赛是根据参赛队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统是一个负责篮球比赛的数据采集和分配的专用系统,它负责对比赛结果、成绩信息的采集处理、传输分配。
篮球比赛的计时计分系统由计时器、计分器等多种电子设备组成,由于比赛的不可重复性,决定了篮球计时计分系统是一个实时性很强、可靠性要求极高的电子服务系统,所以计时计分设备是篮球比赛中不可缺少的电子设备,计时计分系统设计是否合理,关系到比赛系统运行的稳定和可靠,并直接影响到比赛的顺利进行。
同时,根据目前高水平篮球比赛要求,完善的篮球比赛计时计分系统设备应能够与现场成绩处理、现场大屏幕、电视转播车等多种设备相联,以便实现高比赛现场感、表演娱乐观众等功能目标。
随着比赛规则的进一步完善,相应的计时计分系统也必须随之改进。
二、设计目的
(1)熟悉FPGA开发的环境和FPGA的结构,了解FPGA开发的流程,熟悉VHDL语言设计电路的方法。
(2)能更熟练的使用VHDL设计FPGA。
(3)提高动手能力与实践能力,将软硬件结合起来。
三、设计内容及要求
设计一个篮球比赛记分牌,使用4位数码管显示倒计时的分钟、秒钟值;2位数码管显示A方得分;2位数码管显示B方得分;使用LED灯作为上、下半场的标志;单次加分值包括1分、2分和3分。
系统提供50MHZ频率的时钟源。
完成该系统的硬件和软件的设计,并制作出实物装置,调试好后并能实际运用(指导教师提供制作所需的器件),最后就课程设计本身提交一篇课程设计说明书。
四、设计思路
此次设计是采用QUARTUSII软件,以VHDL为主要编程语言来设计在篮球比赛时所用到的计时系统,记分系统。
篮球比赛计时记分系统程序多而且复杂,所以用图形设计方法来设计。
先把每一模块的程序写好,然后生成图形文件,最后新建一个顶层图形文件,把各模块联结起来。
包括的模块有分频模块、计时模块、记分模块、脉冲产生模块、滤波模块、选择模块、声光显示模块,显示模块及消抖模块等。
设计框图如下:
计时模块
计分模块
.
分频模块
消抖模块
模式控制模块(脉冲产生、滤波、选择、显示)
五、单元模块设计
1、分频模块
分频模块功能是将50MHz晶振电路高频率时钟信号变成需要的低频率时钟信号。
分频模块代码如下:
BEGIN
PROCESS(CLK)--1hz
VARIABLENUM:
INTEGERRANGE100000000DOWNTO0;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFNUM<25000000THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
CLK1<=NOTCLK1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)--100HZ
VARIABLENUM:
INTEGERRANGE100000000DOWNTO0;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFNUM<50000THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
CLK2<=NOTCLK2;
ENDIF;
ENDIF;
ENDPROCESS;
2、计时模块
12进制减法计数器
这个计数器用来表示每一节比赛的分钟位,它的时钟脉冲应由前一个60进制计数器的CO提供。
具备复位功能。
可以将12进制改为任意进制的减法计数器。
当计数结束后,计数器不再计数。
当CO有效时进行减法计数,当计数器减到0之,SO输出一个高电平。
EN等于1时计数器复位,当C05等于1时实现比赛加时操作。
60进制减法计数器
这个计数器用来表示每一节比赛的秒钟位。
要求在完成12个60进制的计数后,计数器不再计数。
具备清零、暂停以及复位的功能。
当CLK有效时进行减法计数,CLR等于1时整个计数器清零,EN等于1时计数器复位,PAUSE等于1时计数器暂停计数,。
当计数器减到0之,CO输出一个高电平。
计时模块代码如下:
PROCESS(CLK1)--SHIJIAN
BEGIN
IFCLK1'EVENTANDCLK1='1'THEN
MIAO2<=MIAO2-'1';
IFMIAO2="1111"THEN
MIAO2<="1001";
MIAO1<=MIAO1-'1';
IFMIAO1="1111"THEN
MIAO1<="1001";
FEN2<=FEN2-'1';
IFFEN2="1111"THEN
FEN2<="1001";
FEN1<=FEN1-'1';
IFFEN1="1111"THEN
FEN1<="1001";
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
3、计分模块
计分模块的基本功能:
用2位数码管显示A方得分;2位数码管显示B方得分;使用LED灯作为上、下半场的标志;单次加分值分别为1分、2分和3分,用拨码开关和按键共同实现加分功能,其中,当拨码开关为00时,按下按键加1分;当拨码开关为01时,按下按键加2分;当拨码开关为10时,按下按键加3分。
计分模块代码如下:
PROCESS(KOUT1_1,KEY1)
BEGIN
IFKOUT1_1'EVENTANDKOUT1_1='1'THEN
CASEKEY1IS
WHEN"00"=>COUNT1_1<=COUNT1_1+'1';--+1FEN
IFCOUNT1_1="1001"THEN
COUNT1_2<=COUNT1_2+'1';
COUNT1_1<=COUNT1_1-"1010";
IFCOUNT1_2="1001"THEN
COUNT1_2<="0000";
ENDIF;
ENDIF;
WHEN"01"=>COUNT1_1<=COUNT1_1+"0010";--+2FEN
IFCOUNT1_1(3)='1'THEN
IFCOUNT1_1(0)='1'ORCOUNT1_1
(1)='1'ORCOUNT1_1
(2)='1'THEN
COUNT1_2<=COUNT1_2+'1';
COUNT1_1<=COUNT1_1-"1010";
IFCOUNT1_2="1001"THEN
COUNT1_2<="0000";
ENDIF;
ENDIF;
ENDIF;
WHEN"10"=>COUNT1_1<=COUNT1_1+"0011";--+3FEN
IFCOUNT1_1(3)='1'THEN
IFCOUNT1_1(0)='1'ORCOUNT1_1
(1)='1'ORCOUNT1_1
(2)='1'THEN
COUNT1_2<=COUNT1_2+'1';
COUNT1_1<=COUNT1_1-"1010";
IFCOUNT1_2="1001"THEN
COUNT1_2<="0000";
ENDIF;
ENDIF;
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
PROCESS(KOUT1_2,KEY2)
BEGIN
IFKOUT1_2'EVENTANDKOUT1_2='1'THEN
CASEKEY2IS
WHEN"00"=>COUNT2_1<=COUNT2_1+'1';--+1FEN
IFCOUNT2_1="1001"THEN
COUNT2_2<=COUNT2_2+'1';
COUNT2_1<=COUNT2_1-"1010";
IFCOUNT2_2="1001"THEN
COUNT2_2<="0000";
ENDIF;
ENDIF;
WHEN"01"=>COUNT2_1<=COUNT2_1+"0010";--+2FEN
IFCOUNT2_1(3)='1'THEN
IFCOUNT2_1(0)='1'ORCOUNT2_1
(1)='1'ORCOUNT2_1
(2)='1'THEN
COUNT2_2<=COUNT2_2+'1';
COUNT2_1<=COUNT2_1-"1010";
IFCOUNT2_2="1001"THEN
COUNT2_2<="0000";
ENDIF;
ENDIF;
ENDIF;
WHEN"10"=>COUNT2_1<=COUNT2_1+"0011";--+3FEN
IFCOUNT2_1(3)='1'THEN
IFCOUNT2_1(0)='1'ORCOUNT2_1
(1)='1'ORCOUNT2_1
(2)='1'THEN
COUNT2_2<=COUNT2_2+'1';
COUNT2_1<=COUNT2_1-"1010";
IFCOUNT2_2="1001"THEN
COUNT2_2<="0000";
ENDIF;
ENDIF;
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;}
4、显示模块
译码显示模块将上一个模块输出四个一位数译码成相对应的七位数码管段码,完成倒计时的译码和显示。
由于试验箱采用动态显示,所以需要将BCD码转换成段码和位码。
D0到D7分别表示8个LED管。
显示模块代码如下:
BEGIN
IFCLK2'EVENTANDCLK2='1'THEN
WEI_SEL<=WEI_SEL+'1';
ENDIF;
ENDPROCESS;
PROCESS(WEI_SEL)--weixuan
BEGIN
CASEWEI_SELIS
WHEN"000"=>WEI<="00000001";
DISP<=MIAO2;
WHEN"001"=>WEI<="00000010";
DISP<=MIAO1;
WHEN"010"=>WEI<="00000100";
DISP<=FEN2;
WHEN"011"=>WEI<="00001000";
DISP<=FEN1;
WHEN"100"=>WEI<="00010000";
DISP<=COUNT1_1;
WHEN"101"=>WEI<="00100000";
DISP<=COUNT1_2;
WHEN"110"=>WEI<="01000000";
DISP<=COUNT2_1;
WHEN"111"=>WEI<="10000000";
DISP<=COUNT2_2;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(DISP)
BEGIN
CASEDISPIS
WHEN"0000"=>LED7S<="1000000";--0
WHEN"0001"=>LED7S<="1111001";--1
WHEN"0010"=>LED7S<="0100100";--2
WHEN"0011"=>LED7S<="0110000";--3
WHEN"0100"=>LED7S<="0011001";--4
WHEN"0101"=>LED7S<="0010010";--5
WHEN"0110"=>LED7S<="0000010";--6
WHEN"0111"=>LED7S<="1111000";--7
WHEN"1000"=>LED7S<="0000000";--8
WHEN"1001"=>LED7S<="0010000";--9
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
5、消抖模块
消抖模块的原理就是把一个按键周期内所输入的所有有效信号,包括那些毛刺,处理成一个脉冲输入。
能达到这点,就可以实现消抖功能了。
这个设计中存在很多的毛刺,会影响设计的效果及结果,所以需要采用几个消抖的模块来使设计更加的准确。
其中,该设计中主要是对按键的消抖。
消抖模块代码如下:
PROCESS(BUTTON1_1,CLK)--BUTTON1_1XIAODOU
VARIABLENUM:
INTEGERRANGE0TO1000000;
VARIABLENUM2:
INTEGERRANGE0TO1000000;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFBUTTON1_1='1'THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
ENDIF;
IFBUTTON1_1='0'THEN
NUM2:
=NUM2+1;
ELSE
NUM2:
=0;
ENDIF;
IFNUM>50000THEN
KOUT1_1<='1';
ELSIFNUM2>50000THEN
KOUT1_1<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(BUTTON1_2,CLK)--BUTTON1_2XIAODOU
VARIABLENUM:
INTEGERRANGE0TO1000000;
VARIABLENUM2:
INTEGERRANGE0TO1000000;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFBUTTON1_2='1'THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
ENDIF;
IFBUTTON1_2='0'THEN
NUM2:
=NUM2+1;
ELSE
NUM2:
=0;
ENDIF;
IFNUM>50000THEN
KOUT1_2<='1';
ELSIFNUM2>50000THEN
KOUT1_2<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(BUTTON1_3,CLK)--BUTTON1_3XIAODOU
VARIABLENUM:
INTEGERRANGE0TO100;
VARIABLENUM2:
INTEGERRANGE0TO100;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFBUTTON1_3='1'THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
ENDIF;
IFBUTTON1_3='0'THEN
NUM2:
=NUM2+1;
ELSE
NUM2:
=0;
ENDIF;
IFNUM>50THEN
KOUT1_3<='1';
ELSIFNUM2>50THEN
KOUT1_3<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(BUTTON2_1,CLK)--BUTTON2_1XIAODOU
VARIABLENUM:
INTEGERRANGE0TO10000000;
VARIABLENUM2:
INTEGERRANGE0TO1000000;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFBUTTON2_1='1'THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
ENDIF;
IFBUTTON2_1='0'THEN
NUM2:
=NUM2+1;
ELSE
NUM2:
=0;
ENDIF;
IFNUM>50000THEN
KOUT2_1<='1';
ELSIFNUM2>50000THEN
KOUT2_1<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(BUTTON2_2,CLK)--BUTTON2_2XIAODOU
VARIABLENUM:
INTEGERRANGE100TO0;
VARIABLENUM2:
INTEGERRANGE100TO0;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFBUTTON2_2='1'THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
ENDIF;
IFBUTTON2_1='0'THEN
NUM2:
=NUM2+1;
ELSE
NUM2:
=0;
ENDIF;
IFNUM>50THEN
KOUT2_2<='1';
ELSIFNUM2>50THEN
KOUT2_2<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(BUTTON2_3,CLK)--BUTTON2_3XIAODOU
VARIABLENUM:
INTEGERRANGE100TO0;
VARIABLENUM2:
INTEGERRANGE100TO0;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFBUTTON2_3='1'THEN
NUM:
=NUM+1;
ELSE
NUM:
=0;
ENDIF;
IFBUTTON2_3='0'THEN
NUM2:
=NUM2+1;
ELSE
NUM2:
=0;
ENDIF;
IFNUM>50THEN
KOUT2_3<