聊城大学本科毕业论文(设计)
3.2设计框图
图3.1设计流程图
图3.2 乒乓球游戏机原理图
7
聊城大学本科毕业论文(设计)
4.设计步骤
4.1乒乓球游戏机实体的设计
设计该乒乓球游戏机的输入/输出端口。首先考虑输入端口,一般都应该设置一个异步置位端口reset,用于在系统不正常时回到初始状态;两个发球输入端serve1和serve2,逻辑‘1’分别表示甲方和乙方的发球;两个击球输入端hit1和hit2,逻辑‘1’分别表示甲击球和乙击球;一个开始游戏按钮startbutton,处于逻辑‘1’表示可以游戏;还得有一个时钟输入端口clk。
其次考虑输出端口,芯片应该有8个输出端口来控制8个发光二极管,输出逻辑‘1’即输出一个高电平,可以使发光二极管点亮;另外,要直观地表示双方的得分,就得用到七段译码器,每方用到2个,可以表示0~11的数字,每个七段译码器需要芯片的7个输出端口来控制,总共需要28个输出端口。实体的设计如下:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all; --引用必要的库函数和包集合 entity compete is --实体名为pingpong port(reset:in std_logic; clk_1:in std_logic; startbutton:in std_logic; --开始游戏输入端口 serve:in std_logic_vector(1 downto 0); --发球输入端口 hit1,hit2:in std_logic; --甲和乙的击球输入端口 light:out std_logic_vector(1 to 8); --控制8个发光二极管的输出端口 counta,countb:out std_logic_vector(3 downto 0)); --2个用于控制4个7段译码器的输出端口 end compete;
4.2状态机编程实现
状态机设置了7个状态,分别是等待发球状态(waitserve)、第一盏灯亮状态(light1on)、第八盏灯亮状态(light8on)、球向乙移动状态(ballmoveto2)、球向甲移动状态(ballmoveto1)、允许甲击球状态(allow1hit)和允许乙击球状态(allow2hit)。
8
聊城大学本科毕业论文(设计)
状态waitserve,light1on,ballmoveto2,allow2hit,light8on,ballmoveto1和allow1hit代表的具体数值依次是0到6.在波形模拟图中是用数值来表示状态的。
乒乓球游戏机中有两个计数器count1和count2,分别记忆甲的得分和乙的得分;一个i信号,用它的数值来控制状态机外8个发光二极管的亮和暗,比如当i=1时表示第一个发光二极管亮,用发光二级管的轮流发光表示球的移动轨迹。
输入状态机的信号有游戏开关startbutton信号,它是1位二进制信号,数值为1表示可以进入游戏;serve信号,是一个2位二进制向量,“10”表示甲发球;两个二进制信号hit1和hit2分别表示甲乙是否击球,若数值为1,表示击球,不为1表示不击球。以下是状态机进程代码。
process(clk_1) --状态机进程 --clk_1作为敏感信号触发进程 begin --进程开始 if reset='1' then --异步置位
i<=0;count1<=\elsif clk_1'event and clk_1='1' then --当处于时钟inclock上升沿时 if count1=\
i<=0;count1<=\elsif count2=\
i<=0;count1<=\elsif startbutton='0' then
i<=0;count1<=\else --以下case语句是程序中最关键的状态机部分 case state is
when waitserve => case serve is
when \
when \ when \ when \when others => i<=0; end case;
when light1on => i<=2; if hit2='1' then i<=0;
count1<=count1+1;state<=waitserve; else
state<=ballmoveto2; end if;
when light8on => i<=7;
9
聊城大学本科毕业论文(设计)
if hit1='1' then i<=0;
count2<=count2+1;state<=waitserve; else
state<=ballmoveto1; end if;
when ballmoveto1 => if hit1='1' then i<=0;
count2<=count2+1;state<=waitserve; elsif i=2 then i<=1; state<=allow1hit; else i<=i-1; end if;
when ballmoveto2 => if hit2='1' then i<=0;
count1<=count1+1;state<=waitserve; elsif i=7 then i<=8; state<=allow2hit; else i<=i+1; end if;
when allow1hit =>
if hit1='1' then i<=2;state<=ballmoveto2; else count2<=count2+1;i<=0; state<=waitserve; end if;
when allow2hit =>
if hit2='1' then i<=7;state<=ballmoveto1; else count1<=count1+1;i<=0; state<=waitserve; end if; end case; end if; end if;
end process;
4.3记分译码器的设计
七段译码器是在数字电路设计中经常用到的显示电路。所谓七段译码器,其实是由7段发光二极管组成的用于显示数字的器件。如图4.1所示。
10
聊城大学本科毕业论文(设计)
图4.1 七段译码器简易图
其中的a,b,c,d,e,f,g分别为7段发光
二极管,通过控制每个发光二极管的亮和暗,可以分别显示0~9十个数字。例如,b和c两段发光二极管亮,其他发光二极管暗,则表示数字“1”;a,b,g,e和d五段发光二极管亮,其他发光二极管暗,则表示数字“2”。七段译码器有7个输入端,分别控制a~g七段发光二极管。
记分译码器(mydecoder):由于记分需要显示出来,所以要使用七段译码器。而状态机中的记分是由4位二进制码来表示的,即count1和count2.这个记分译码器电路是针对乒乓球游戏机的特点进行的特别设计,采用的是全部列举的方法,如图4.2所示:
图4.2 七段译码器电路模块图
代码如下:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all; entity decoder is
port(binaryin:in std_logic_vector(3 downto 0); --4位二进制码的输入端口
bcdout1:out std_logic_vector(6 downto 0); --译码器高位输出端口 bcdout2:out std_logic_vector(6 downto 0) --译码器低位输出端口 );
end decoder;
11
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库乒乓电路—终稿(3)在线全文阅读。
相关推荐: