当前位置:文档之家› EDA课程设计--乒乓球游戏机

EDA课程设计--乒乓球游戏机

EDA课程设计一乒乓球游戏机EDA技术课程设计课题:乒乓球比赛游戏机系别:电气与电子工程系专业: _______姓名: __________________________学号: __________________________指导教师: _______________________河南城班学院2012年6月日成绩评定•一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。

录一、设计目的 (2)二、设计要求 (6)三、总体设计方案要求 (4)1、设计的总体原理 (4)2、设计内容 (6)四、EDA设计与仿真 (6)1、系统程序设计 (6)2、系统程序各功能介绍 (12)3、仿真结果及数据分析 (13)五、硬件实现 (14)1、硬件实现步骤 (14)2、硬件实现结果 (66)六、设计总结 (20)七、参考文献 (21)八、设计生成的电路总图 (21)一、设计目的通过对FPGA (现场可编程门阵列)芯片的设计实践,使学生掌握一般的PLD(可编程逻辑器件)的设计过程、设计要求、设计内容、设计方法,能根据用户的要求及工艺需要进行电子芯片设计并制定有关技术文件。

培养学生综合运用已学知识解决实际工程技术问题的能力、査阅图书资料和各种工具书的能力、工程绘图能力、撰写技术报告和编制技术资料的能力,受到一次电子设计自动化方面的基本训练。

培养学生利用EDA技术知识,解决电子设计自动化中常见实际问题的能力, 使学生积累实际EDA编程。

通过本课程设计的学习,学生将复习所学的专业知识,使课堂学习的理论知识应用于实践,通过本课程设计的实践使学生具有一定的实践操作能力。

二、设计要求1、设计一个由甲、乙双方参赛,有裁判的3人乒乓球游戏机。

2、用8个(或更多个)LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依此从左到右, 或从右到左,其移动的速度应能调节。

3、当“球”(点亮的那只LED)运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。

若击中,则球向相反方向移动;若未击中,则对方得1分。

4、一方得分时,电路自动响铃3秒,这期间发球无效,等铃声停止后方能继续比赛。

5、设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计满21分为1局。

6、甲、乙双方各设一个发光二极管,表示拥有发球权,每隔5次自动交换发球权,拥有发球权的一方发球才有效。

三、总体设计方案要求1•设计的总体原理本实验主要部分设计采用状态机设计,设置了7个状态,分别是“等待发球状态”、“第一盏灯亮状态”、“第八盏灯亮状态”、“球向乙移动状态”、“球向甲移动状态”、“允许甲击球状态”,“允许乙击球状态”。

这是该程序中起决定作用的七个状态。

开始的时候处于“等待发球状态”,若甲发球则状态转移到“第一盏灯亮状态”,若乙发球则转移到“第八盏灯亮状态”,具体说明以甲球为例。

若发球后乙没有提前击球-——规定球移动到对方第一个发光二极管时允许击球,那么状态机从“第一盏灯亮状态”转移到“球向乙移动状态”;若在“球向乙移动状态”乙仍然没有提前击球,状态就转移到“允许乙击球状态”,在此状态下,如果乙击球了,那么状态就转移到“球向甲移动状态”;在“第一盏灯亮状态”,“球向乙移动状态”中,如果乙击球了,就算提前击球,这样甲得分,状态转移到“等待发球状态”等待发球,“球向甲移动状态”之后的过程和前面的过程只不过是甲乙角色的调换而已。

本设计流程图与乒乓球游戏机原理图如下:7七中七没击球图3-2乒乓球游戏机原理图2.设计内容用8个(或更多个)LED排成一条直线来模拟乒乓球的轨迹,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED 依此从左到右,或从右到左,其移动的速度应能调节。

当“球”(点亮的那只LED) 运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。

若击中,则球向相反方向移动;若未击中,则对方得1 分。

一方得分时,电路自动响铃3秒,这期间发球无效,等铃声停止后方能继续比赛。

设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计数满21分为1局。

甲、乙双方各设一个发光二极管,表示拥有发球权,每隔5 次自动交换发球权,拥有发球权的一方发球才有效。

四、EDA设计及仿真(设计程序、仿真波形图)1、系统程序设计library ieee;use ieee.std Jogic_1164.all;use ieee.stdjogic_arith.all;use ieee.stdjogic_unsigned.all;entity mydecoder isport(binaryin:in stdjogic_vector(l to 5); ・・5 位二进制码的输入端口bcdoutl:out std」ogic_vector(l to 4); ••七段译码器输出端口bcdout2:out stdjogic_vector(l to 4));end mydecoder;architecture m of mydecoder issignal tembinaryin:std_logic_vector(l to 5);beginprocess(binaryin)begintembinaryin<=binaryin;case tembinarvin is •■把0到9的5位二进制码转换成七段译码when M00000,,=>bcdoutl<=n0000,,;bcdout2<=tf0000,t;when tt0000r,=>bcdoutl<=n0000,t;bcdout2<=tt000r,;when tt00010,,=>bcdoutl<=t,0000,t;bc(loiit2<=tt0010M;when,t000ir t=>bcdoutl<=t,0000,t;bcdout2<=,,00ir,;when t,00100n=>bcdoutl<=n0000n;bc(lout2<=,t0100,t;when M0010r,=>bcdoutl<=n0000,,;bcdout2<=tf010r t;when M00110ft=>bcdoutl<=ft0000,t;bcdout2<=,l0110,f;when n00111ft=>bcdoutl<=H0000ft;bcdout2<=,,01ir f;when tt01000,t=>bcdoutl<=,t0000M;bcdout2<=t,1000,f;when M0100r t=>bcdoutl<=,,0000,t;bcdout2<=tt100r,; ••把10 到19 的5 位二进制码转换成七段译码when lt01010,t=>bcdoutl<=,t0001,t;bcdout2<=,,0000,t;when n01011M=>bcdoutl<=n0001t,;bcdout2<=H000r,;when tt01100,t=>bcdoutl<=H000r,;bcdout2<=,,0010,f;when M0110r t=>bcdoutl<=,,000r t;bcdout2<=,'00ir f;when tt01110,t=>bcdoutl<=n000r,;bcdout2<=,,0100,t;when,t011ir t=>bcdoutl<=,,000r t;bcdout2<=t,010r f;when ft10000H=>bcdoutl<=M0001M;bcdout2<=,,0110fl;when ft10001H=>bcdoutl<=tt0001M;bcdout2<==,,0111,f;when tt10010,,=>bcdoutl<=n000r t;bcdout2<=tt1000,t;when H100H H=>bcdoutl<=n000r t;bcdout2<=,t100r t; “把20 到21 的5 位二进制码转换成七段译码wheiTl(H0(r=>bcdoiiW0(H(r;bcdoiit2<=''000(r;when tt1010r,=>bcdoutl<=,,0010M;bcdout2<=tt000r,; ••如果5 位二进制码不在0到21范围内,那么两个七段译码器都显示0when others=>bcdoutl<=t,0000l,;bcdout2<=n0000n;end case;end process;end m;library ieee;use ieee.std Jo gic_1164.all;use ieee.std Jogic_arith>all;use ieee.std_logic_unsigned.all;••引用必要的库函数和包集合entity pingponggame is ••实体名为pingponggame port(reset: in stdjogic;elk: in stdjogic;clkl9clk2: in std」ogic;startbutton: in stdjogic; ••开始游戏输入端口hitl9hit2: in std」ogic; ••甲和乙的击球输入端口speaker : out stdjogic ;light: out stdjogic_vector(l t □ 8);••控制8个发光二极管的输出端口score 11 ^core 12^score21 ,score22: out std」ogic_vector(l to 4)); -4个用于控制4个7段译码器的输出端口end pingponggame;architecture game of pingponggame istypepingpongis(waitservejightlon,ballmoveto2,allow2hitjight8on,ballmovetol,allowlhit); ••设置7个状态,为枚举数据类型,记为pingpongsignal state:pingpong;signal c:std_logic;signal i:integer range 0 to 8;signal jinteger range 0 to 12;signal count: integer range 0 to 5 ;signal serve : std」ogic_vector (1 to 2 ):=H01n;signal coun11 ^count2:stdJogic_vector( 1 to 5):=H00000tf; ••内部计数器,是5位二进制变量component mydecoder isport(binanln: in std」ogic_vector(l to 5);bcdoutl: out std」ogic_vector(l to 4);bcdout2: out stdjogic_vector(l to 4));end component; •-调用记分译码器begin ••状态机进程Pl:process(dk) -elk作为敏感信号触发进程begin ••进程开始if reset=f r then i<=0;countl<=l,00000t,;count2<=,,00000t,; j<=0;"异步置位elsif clk'event and clk=T then ••当处于时钟inclock 上升沿时ifcountl=tt10110t,orcoiint2=,,10110,t theni<=0;countl<=n00000,t;count2<=,'00000tl;J<=0;elsif startbutton=t O t theni<=0;countl<=t,00000n;count2<=,t00000,t;j<=0;else ••以下case语句是程序中最关键的状态机部分case state iswhen waitserve=> case serve is “进程处于等待发球状态when ”10”=>i<=l;state<=lightlon;J<=J+l;if(J=9) thenJ<=0 ; end if;when M0r f=> i<=8;state<=llght8on;J<=j+l;when ,,H,,=> i<=0;when others=>i<=0;end case;when lightlon=> i<=2 ;•■进程处于第一盏灯亮状态if hit2=f r then i<=0; countl<=count 1+1 ;c<=* 11;state<=waitserve;else c<='0'; state<=ballmoveto2;end If;when light8on=> i<=7; •■进程处于第八盏灯亮状态Ifliit2=, 1 ,theni<=0;count2<=count2+1 ;c<=* 1'; state<=waitserve;else c<=,0,; state<=ballmoveto 1;end if;when ballmovetol=> if hitl=T then “进程处于球向乙移动状态i<=0;count2<=count2+1 ;c<=f 1' ;state<=waltserve; elsif i=2 theni<=l;c<=,0,;state<=allowlhit;else i<=i-l;end if;when ballmoveto2=> if hit2='l'then •■进程处于球向乙移动状态i<=0; countl<=countl+l;c<=,l,;state<=waitserve; elsif i=7 theni<=8;c<=,0t; state<=allow2hit;else i<=i+l;end if;when allowlhlt=> if hitl='l' then i<=2;c<=t0t;state<=ballmoveto2; ••进程处于允许甲击球状态elsecount2<=count2+1 ;i<=O;c<=' 1 * ;state<=waitserve;end if;when allow2hit=> f hlt2=f rthen i<=7;c<=t0, ;state<=ballmoveto 1; ••进程处于允许乙击球状态else coiintl<=countl+l;c<=f r;l<=0; state<=waitserve;end if;encl case;encl if;end if;encl process Pl;P2:process (J)beginif(J>=0 and J<=5 ) then serve<=,t01M ;end if;if(J>=5 and J<10 ) then serve<=n10ft ;end if;encl process P2 ;p3:process(c,clk2)variable d:integer range 0 to 4108;beginifc=,rthen d:=4108;iUc\k2=l V) thenif d<=0 then d:=0;else d:=d-l;end If;if d>0 then speaker<=clkl;end If;end If;end If;end process p3;light<= ,t10000000M when(i=l) else ••进程处I信号控制发光二极管的亮,,01000000tt when(i=2) elseH00100000M when(i=3) elseH00010000tf when(i=4) else''00001000” when(i=5) elsen00000100,f when(i=6) elseH00000010H when(i=7) elseH0000000r f when(i=8) else"00000000”;•■其他情况所有发光二极管都暗uO:my(Ieco(ler port map(count 1 ^score 11 ^core 12); ••用七段译码器显示甲的分数ill: my decoder port map(count2,score21,score22); ••用七段译码器显示乙的分数end game;2.系统程序各功能介绍2.1该乒乓球游戏机的输入与输出端口:首先考虑输入端口,一般应该设置一个异步置位端口reset,用于在系统不正常时回到初始状态;两个击球输入端hitl和hit2,逻辑分别表示甲击球和乙击球;一个开始游戏按钮startbutton,处于逻辑'1'表示可以开始游戏; 还有时钟输入端口elk、clkl> clk2o其次考虑输出端口,芯片应该有8个输出端口来控制8个发光二极管,输出逻辑'1,即输出一个高电平,可以使发光二极管点亮;蜂鸣器输出端口speaker,用时钟信号来驱动蜂鸣器发声;还要直观地表示双方的得分,就得用到4个七段显示数码管,每方用到2个,可以表示0 到21的数字,每个七段显示数码管需要芯片的4个输出端口来控制。

相关主题