乒乓球游戏电路设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、主要内容:
设计一个乒乓球游戏机,比赛由甲乙双方和裁判3人构成,能模拟比赛的基本过程和规则并能自动裁判和记分。
2、基本要求:
1、设计一个由甲、乙双方参赛,有裁判的3人乒乓球游戏机。
2、用8个(或更多个)LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依此从左到右,或从右到左,其移动的速度应能调节。
3、当“球”(点亮的那只LED)运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。若击中,则球向相反方向移动;若未击中,则对方得1分。一方得分时,电路自动响铃3秒,这期间发球无效,等铃声停止后方能继续比赛。
4、设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计满21分为1局。
5、甲、乙双方各设一个发光二极管,表示拥有发球权,每隔5次自动交换发球权,拥有发球权的一方发球才有效。
3、主要参考资料:
[1] 潘松著.EDA技术实用教程(第二版). 北京:科学出版社,2005.
[2] 康华光主编.电子技术基础模拟部分. 北京:高教出版社,2006.
[3] 阎石主编.数字电子技术基础. 北京:高教出版社,2003.
一、总体设计思想
1.基本原理
用8个(或更多个)LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依此从左到右,或从右到左,其移动的速度应能调节。当“球”(点亮的那只LED)运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。若击中,则球向相反方向移动;若未击中,则对方得1分。一方得分时,电路自动响铃3秒,这期间发球无效,等铃声停止后方能继续比赛。设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计满21分为1局。甲、乙双方各设一个发光二极管,表示拥有发球权,每隔5次自动交换发球权,拥有发球权的一方发球才有效。
2.设计框图
1.1设计流程图
二、设计步骤和调试过程
1、总体设计电路
用8个发光二极管代表乒乓球台,在游戏机的两侧设置两个开关,一个是发球开关,一个是击球开关,甲方按动发球开关时,靠近甲方的第一盏灯亮,然后发光二极管由甲向乙依次点亮,代表乒乓球在移动。当球过网后,乙方就可击球。若乙方提前击球或没击中球,则判乙方失分,甲方自动加分,重新发球比赛继续进行到一方记分到21分,该局结束,记分牌清零,可以开始新的一局比赛。
使用VHDL进行电路系统设计,利用PLD来实现控制器的硬件电路
1.2乒乓游戏机的电路框图
2、模块设计和相应模块程序
系统各功能模块的实现
1、模块SEL的实现
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity sel is
port(clk:in std_logic;
sell:out std_logic_vector(2 downto 0));
end sel;
architecture sel_arc of sel is
begin
process(clk)
variable tmp:std_logic_vector(2 downto 0);
begin
if(clk'event and clk='1')then
if(tmp="000")then
tmp:="001";
elsif tmp="001"then
tmp:="100";
elsif tmp="100"then
tmp:="101";
elsif tmp="101"then
tmp:="000";
end if;
end if;sell<=tmp;
end process;
end sel_arc;
2、模块CORNA的实现
LIBRARY IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity coma is
port(clr,af,aj,bf,bj,clk:in std_logic;
shift:out std_logic_vector(7 downto 0);
ah,al,bh,bl:out std_logic_vector(3 downto 0)); end coma;
architecture com_arc of coma is
signal amark,bmark:integer;
begin
process(clr,clk)
variable a,b:std_logic;
variable she:std_logic_vector(7 downto 0);
begin
if clr='0'then
a:='0';
b:='0';
she:="00000000";
amark<=0;
bmark<=0;
elsif clk'event and clk='1'then
if a='0' and b='0' and af='0'then
a:='1';
she:="10000000";
elsif a='0' and b='0' and bf='0' then
b:='1';
she:="00000001";
elsif a='1'and b='0'then
if she>8 then
if bj='0'then
amark<=amark+1;
a:='0';
b:='0';
she:="00000000";
else
she:='0'&she(7 downto 1);
end if;
elsif she=0 then
amark<=amark+1;
a:='0';
b:='0';
else
if bj='0'then
a:='0';
b:='1';
else
she:='0'&she(7 downto 1);
end if;
end if;
elsif a='0' and b='1'then
if she<16 and she/=0 then
if aj='0' then
bmark<=bmark+1;
a:='0';
b:='0';
she:="00000000";
else
she:=she(6 downto 0)&'0';
end if;
elsif she=0 then
bmark<=bmark+1;
a:='0';
b:='0';
else