乒乓球游戏电路设计
一、 乒乓球设计方案
(1)我们设计的乒乓球游戏是以一排发光二极管交替发光指示乒乓球的行进路径,其行进的速度可由输入的时钟信号控制。乒乓球比赛是甲乙双方的比赛,所以用两个按键模拟左右两个球拍;我们还要设计一个乒乓球控制模块,即当发光二极管到最后一个的瞬间,若检测到对应的表示球拍的键的信号,立即使“球”反向运行,如果此瞬间没有接到按键信号,将给出失败鸣叫,同时为对方记1分,并将记分显示出来,然后由对方重新发球以此类推;还要设计失球计数器的高低位计数模块;乒乓球行进方向控制模块,主要由发球键控制;还要有一个失球提示发生模块。
(2)要知道乒乓球的游戏规则,以多少分为一局,谁先得到一定的分数谁就赢一局,以此来判断输赢。
(3)用数码管显示双方的得分,还要设计一个十进制计数器,来显示分数。
(4)在乒乓球设计方案时还要考虑球速的问题。
二、乒乓球游戏电路的设计程序
1、
LIBRARY IEEE;--乒乓球游戏顶层文件
use ieee.std_logic_1164.all;
entity TENNIS is
port(bain,bbin,clr,clk,souclk:in std_logic;
ballout:out std_logic_vector(7 downto 0);
countah,countal,countbh,countbl:out std_logic_vector(3 downto 0);
lamp,speaker:out std_logic);
end entity TENNIS;
architecture ful of TENNIS is
component sound
port(clk,sig,en:in std_logic;
sout:out std_logic);
end component;
component ballctrl
port(clr,bain,bbin,serclka,serclkb,clk:in std_logic;
bdout,serve,serclk,ballclr,ballen:out std_logic);
end component;
component ball
port(clk,clr,way,en:in std_logic;
ballout:out std_logic_vector(7 downto 0));
end component;
component board
port(ball,net,bclk,serve:in std_logic;
couclk,serclk:out std_logic);
end component;
component cou10
port(clk,clr:in std_logic;
cout:out std_logic;
qout:out std_logic_vector(3 downto 0));
end component;
component cou4
port(clk,clr:in std_logic;
cout:out std_logic;
qout:out std_logic_vector(3 downto 0));
end component;
component mway
port(servea,serveb:in std_logic;
way:out std_logic);
end component;
signal net,couclkah,couclkal,couclkbh,couclkbl,cah,cbh:std_logic;
signal serve,serclka,serclkb,serclk,ballclr,bdout,way,ballen:std_logic;
signal bbll:std_logic_vector(7 downto 0);
begin
net<=bbll(4);ballout<=bbll;lamp<=clk;
uah:cou4 port map(couclkah,clr,cah,countah);
ual:cou10 port map(couclkal,clr,couclkah,countal);
ubh:cou4 port map(couclkbh,clr,cbh,countbh);
ubl:cou10 port map(couclkbl,clr,couclkbh,countbl);
ubda:board port map(bbll(0),net,bain,serve,couclkal,serclka);
ubdb:board port map(bbll(7),net,bbin,serve,couclkbl,serclkb);
ucpu:ballctrlport map(clr,bain,bbin,serclka,serclkb,clk,bdout,serve,serclk,
ballclr,ballen);
uway:mway port map(serclka,serclkb,way);
uball:ball port map(clk,ballclr,way,ballen,bbll);
usound:sound port map(souclk,ballen,bdout,speaker);
end ful;
2、
library ieee;
use ieee.std_logic_1164.all;
entity sound is
port(clk:in std_logic; --发声时钟
sig:in std_logic; --正确接球信号
en:in std_logic; --球拍接球脉冲
sout:out std_logic); --提示声输出,接小喇叭
end entity sound;
architecture ful of sound is
begin
sout<=clk and (not sig) and en;--球拍接球,没接到时,发提示声
end ful;
3、
library ieee; --总控制模块
use ieee.std_logic_1164.all;
entity ballctrlis
port(clr:in std_logic; --系统复位
bain:in std_logic; --左球拍
bbin:in std_logic; --右球拍
seclka:in std_logic; --左拍准确接球或发球
serclkb:in std_logic; --右拍准确接球或发球
clk:in std_logic; --乒乓球灯移动时钟
bdout:out std_logic; --球拍接球脉冲
serve:out std_logic; --发球状态信号
serclk:out std_logic; --球拍正确接球信号
ballclr:out std_logic; --乒乓球灯清零信号
ballen:out std_logic); --乒乓球灯使能
end entity ballctrl;
architecture ful of ballctrl is
signal bd:std_logic;
signal ser:std_logic;
begin
bd<=bain or bbin;
ser<=serclka or serclkb;serclk<=ser;--球拍正确接球信号
bdout<=bd; --球拍接球脉冲
process(clr,clk,bd)
begin
if(clr='1')then --系统复位
serve<='1'; --系统处在职发球状态
ballclr<='1'; --乒乓球灯清零
else
if(bd='1')then --系统正常
--球拍发球或接球时
ballclr<='1'; --乒乓球灯清零
if(ser='1')then --球拍发球或准确接球
ballen<='1'; --乒乓球灯使能允许
serve<='0'; --系统处在接球状态
else ballen<='0';
serve<='1'; --系统处在发球状态
end if;
else ballclr<='0';--没发球或接球时乒乓球灯不清零
end if;
end if;
end process;
end ful;
4、--乒乓球灯模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ball is
port(clk:in std_logic; --乒乓球灯前进时钟
clr:in std_logic; --乒乓球灯清零
way:in std_logic; --乒乓球灯前进方向
en:in std_logic; --乒乓球灯使能
ballout:out std_logic_vector(7 downto 0));--乒乓球灯
end entity ball;
architecture ful of ball is
signal lamp:std_logic_vector(9 downto 0);
begin
process(clk,clr,en)
begin
if(clr='1') then lamp<="1000000001";--清零
elsif en='0' then
elsif (clk'event and clk='1')then--使能允许,乒乓球灯前进时钟上升沿
if(way='1') then lamp(9 downto 1)<=lamp(8 downto 0);lamp(0)<='0';
--乒乓球灯右移
else lamp(8 downto 0)<=lamp(9 downto 1); lamp(9)<='0';--乒乓球灯左移
end if;
end if;
ballout<=lamp(8 downto 1);
end process;
end ful;
5、--乒乓拍模块
library ieee;
use ieee.std_logic_1164.all;
entity board is
port(ball:in std_logic; --接球点,也就是乒乓球灯的末端
net:in std_logic; --乒乓球灯的中点,乒乓球过中点时,counclk、serclk复位
bclk:in std_logic; --球拍接球信号
serve:in std_logic; --发球信号
couclk:out std_logic;
serclk:out std_logic);
end entity board;
architecture ful of board is
begin
process(bclk,net)
begin
if(net='1')then serclk<='0';couclk<='0';--乒乓球过中点时,counclk、serclk复位
elsif(bclk'event and bclk='1')then—球拍接球时
if(serve='1')then serclk<='1';--系统处于发球状态时—发球成功
else—系统处于接球状态
if(ball='1')then serclk<='1';--乒乓球刚落在接球点上,接球成功
else serclk<='0';couclk<='1';
end if;
end if;
end if;
end process;
end ful;
6、--十进制计数器用来做失球低位计数
library ieee;
use ieee.std_logic_1164.all;
entity mway is
port(servea:in std_logic;
serveb:in std_logic;
way:out std_logic);
end entity mway;
architecture ful of mway is
begin
process(servea,serveb)
begin
if(servea='1')then way<='1';
elsif(serveb='1')then way<='0';
end if;
end process;
end ful;
7、--四进制计数器用来做失球高位计数
library ieee;
use ieee.std_logic_1164.all;
entity mway is
port(servea:in std_logic;
serveb:in std_logic;
way:out std_logic);
end entity mway;
architecture ful of mway is
begin
process(servea,serveb)
begin
if(servea='1')then way<='1';
elsif(serveb='1')then way<='0';
end if;
end process;
end ful;
8、--乒乓球前进方向产生模块
library ieee;
use ieee.std_logic_1164.all;
entity mway is
port(servea:in std_logic;--左选手发球信号
serveb:in std_logic;--右选手发球信号
way:out std_logic);--乒乓球灯前进方向信号
end entity mway;
architecture ful of mway is
begin
process(servea,serveb)
begin
if(servea='1')then way<='1';--左选手发球方向向右
elsif(serveb='1')then way<='0';--右选手发球方向向左
end if;
end process;
end ful;
三、 乒乓球游戏程序的仿真波形
仿真波形图
四、硬件测试方法
然后我们就要测试硬件,下载文件。硬件测试选择电路模式3.其中bain和bbin分别为选手甲、乙球拍,选手甲的模拟球拍是键8,选手乙的模拟球拍是键1,可由任何一方先发球(按键);双方失球分数分别显示与数码管3/2和数码管7/6.控制信号可分别由键8和键1控制,clr是清0控制,可由键7输入控制信号;clk是乒乓球的进行速度时钟(即发光管的亮灯传递速度),可接clock2(选择4hz);sound失球提示发生时钟,可接clock5(选择1024HZ);ballout[7..0] 指示球路行进情况,用8个发光管担任countbh[3..0]和countbl[3..0]接数码管7和6,分别指示左边球手得分的高位和低位;countah[3..0]和countal[3..0]接数码管3和2,分别指示右边球手得分的高位和低位;lamp接数码管7的一段,指示clock2速度;speaker接蜂鸣器,失球提示指示信号。
五、课程设计心得
通过这次EDA课程设计能更加融汇了Quartus II 6.0和硬件方面的结和,以前没连结硬件时单一的仿真出现的问题在这次课设过程中发现了许多的解决方法。
本次EDA课设我选择的题目是乒乓球游戏电路设计。选好题目后开始分析、录入VHDL程序、编译、仿真、硬件下载。在编译过程中出现过很多问题,也正是这些问题让我一步步分析源程序,一点点找出问题的所在,解决问题。
正是这样一点点的找出问题解决问题才能更好的了解EDA,使用软件的时候也能更好的和硬件联系起来。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够得,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考能力。理论与实际相结合,不仅让我们学到了知识,还锻炼了我们的能力,使自己对以后的路有了更加清楚的认识。