北邮数电实验猜拳游戏_第1页
北邮数电实验猜拳游戏_第2页
北邮数电实验猜拳游戏_第3页
北邮数电实验猜拳游戏_第4页
北邮数电实验猜拳游戏_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 17班05号侯智超数电实验设计报告数字电路与逻辑设计实验报告题目:猜拳游戏的设计与实现姓名: 学院: 专业: 通信工程 学号: 班内序号: 摘要说明:本实验在Quartus软件环境下,利用实验室集成芯片,使用VHDL语言编写程序实现一个猜拳小游戏的功能。整个系统的设计过程中,采用了up _to_ down的设计思想,完成了编码和译码输出到8X8点阵和数码管显示分数的功能,对应共有三个模块。关键词:编码译码 VHDL 模块 一 设计课题实验目的及任务要求:本电路可供甲乙二人进行猜拳游戏。通过不同的按键控制,选择多种出拳方式,显示猜 拳的结果,实现猜拳游戏,防止了作弊的可能。 基本要求: 1、甲

2、乙双方各用 44 键盘中的三个按键模拟“石头”、“剪刀”、“布”,一个按键为“确 认”。44 键盘第一行为甲,第二行为乙; 2、裁判用 44 键盘第三行的一个按键模拟“开”,一个按键为“准备”,一个按键为“复 位”; 3、裁判宣布“准备”后,甲乙双方分别选择出拳方式并确认; 4、裁判“开”以后,用点阵的左右三列同时显示甲乙双方的猜拳选择(如下图所示), 并用两个数码管显示甲乙的猜拳比分; 甲“布”,乙“剪刀” 甲“剪刀”,乙“石头” 5、猜拳游戏为五局三胜制。若甲乙双方出拳一致,则比分保持不变,双方重新出拳;6、比赛结束后,用 88 点阵显示甲乙获胜方; 7、复位后游戏重新开始。 提高要求:

3、1、 点阵显示增加游戏开机动画、结束动画; 2、 为游戏增加音效;3、 在 LCD1602 液晶屏上显示甲乙双方的猜拳比分; 4、 自拟其他功能。二 系统设计:(1)设计思路:根据实验的要求,首先控制器是键盘,构思键盘的控制方式:1、假设4X4键盘第一个到最后一个按键编号为1-16,本实验用到了1-11,共十一个按键,对这十一个按键进行键值编码:第一行1234 0001 0101 1001 1101第二行5678 1000 1001 1010 1011第三行91011 1111 0110 1100123代表甲方出“石头”“剪刀”“布”,4代表“已选好(确认)”;567代表乙方出“石头”“剪刀”

4、“布”,8代表“已选好(确认)”;9代表“准备”,10代表“开结果”,11代表“复位”注:此处复位的是按键的操作,对后面的分数不会有影响。2、键盘编好了每个键的码,进行按键操作以后,传入点阵模块点阵是8X8的,列输出用红色,列是共阳极,需要扫描显示,按照给出的图案要求,进行图案的扫描显示,比较简单,之后详见代码。3、根据赛制,五局三胜,也就是谁先达到三分谁就是赢家,故计分模块只需要分别最大分数技术为3就符合了计分目的,计分独立模块,根据按键模块输出的键值,进行译码,根据“开结果”以后之前的甲乙出拳组合得出不同分数计数,通过数码管的左侧两位显示出来,当一方达到三分后,将甲或者乙的计分3输出,输入

5、到点阵模块,此时显示一方胜利图案。至此设计思路完整清晰。(2)系统总体框图: 三 分块设计程序及仿真分析1. 按键模块由于我们的4X4按键模块的端口是:四行的每行四个键分别公用一个行输入,四列的四个键分别公用一个列输出,这就需要我们扫描按键来控制输出。四位计数对列进行扫描,每次扫描单列时,再对行进行扫描,这样就可以对使用到的所有键分别有各自的输入输出控制。具体实现如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity caiqu

6、an isport( kb_row_in:in std_logic_vector(3 downto 0); kb_col_out:out std_logic_vector(3 downto 0); showa,showb,showc,showd:out std_logic_vector(3 downto 0); clk:in std_logic ); END caiquan;architecture cai of caiquan issignal counta,countb:std_logic_vector(1 downto 0);signal col_out:std_logic_vector

7、(3 downto 0);signal a,b,c,d:std_logic_vector(3 downto 0):=0000;-* begin process(counta,clk)- begin if(clkevent and clk=1)then if(counta=11)thencounta=00;else countakb_col_out=0111;countbkb_col_out=1011;countbkb_col_out=1101;countbkb_col_out=1110;countbcase kb_row_in iswhen0111=a=0001;b=0000;c=0000;d

8、b=1000;a=0000;c=0000;dc=1111;b=0000;a=0000;da=0000;b=0000;c=0000;dcase kb_row_in iswhen0111=a=0101;b=0000;c=0000;db=1001;a=0000;c=0000;dc=0110;b=0000;a=0000;da=0000;b=0000;c=0000;dcase kb_row_in iswhen0111=a=1001;b=0000;c=0000;db=1010;a=0000;c=0000;dc=1100;b=0000;a=0000;da=0000;b=0000;c=0000;dcase k

9、b_row_in iswhen0111=d=1101;a=0000;c=0000;bd=1011;b=0000;c=0000;aa=0000;b=0000;c=0000;d=0000; end case; end case; showa=a; showb=b; showc=c; showd=d;end process;end;仿真波形如下: 说明:由仿真可以清晰地看到abcd四组键的键值输出a0001 0101 1001 d 1101b 1000 1001 1010 1011c1111 0110 11002点阵模块 点阵模块和按键模块一样需要扫描显示,由于我们的图形只涉及到中间四行和两边各三列

10、,我们的行扫描只需扫描中间四行其他四行置0可以节省引脚使用,扫描行,每行对应列的输出,频率高了人眼看到的就是静止的图形。点阵模块显示图形需要对按键模块传输过来的键码对应译码,对应不同按键情况进行不同的图形显示。此程序使用键值“与”来表达“已选好(确认)”,在“与”之前加入“准备”的限定条件,之后判断“与”的结果之前加上“开结果”的限定,就可以实现“准备”出拳“已选好(确认)”“开结果”的顺序限制,而复位只需要在每个进程刚开始时加入复位信号的初值,就可以实现复位来灭掉点阵显示。具体实现如下:library ieee;use ieee.std_logic_1164.all;use ieee.std

11、_logic_unsigned.all;use ieee.std_logic_arith.all;entity dianzhen isport(clear:in std_logic;win_a,win_b:in std_logic_vector(2 downto 0);clk:in std_logic;col_a,col_b:out std_logic_vector(3 downto 0);a,b,c,d:in std_logic_vector(3 downto 0);row:out std_logic_vector(7 downto 0);end dianzhen;architecture

12、dian of dianzhen issignal data11,data12,data13,data14,data21,data22,data23,data24:std_logic_vector(3 downto 0);signal a_data,b_data,c1_data,c2_data,c3_data,ad_data,be_data:std_logic_vector(3 downto 0):=0000;signal d_data,e_data:std_logic_vector(3 downto 0):=0000;signal cnt:STD_LOGIC_VECTOR (1 DOWNTO

13、 0);signal wina_data,winb_data:std_logic_vector(2 downto 0):=000;beginprocess(win_a)-note for winabeginif(clkevent and clk=1)thenif(clear=1)thenwina_datawina_datawina_datawina_datawina_datanull;end case;end if;end if;end process;process(win_b)-note for winbbeginif(clkevent and clk=1)thenif(clear=1)t

14、henwinb_datawinb_datawinb_datawinb_datawinb_datanull;end case;end if;end if;end process;process(a)-note for jiabeginif(clkevent and clk=1)thenif(c=1100 or clear=1)thena_dataa_dataa_dataa_datanull;end case;end if;end if;end process;process(b)-note for yibeginif(clkevent and clk=1)thenif(c=1100 or cle

15、ar=1)thenb_datab_datab_datab_datanull;end case;end if;end if;end process;process(c)-note for ready,open and resetbeginif(clkevent and clk=1)thenif(c=1100 or clear=1)thenc1_data=0000;c2_datac1_datac2_datanull;end case;end if;end if;end process;process(clk,c1_data,c2_data,c)-note for ok of jia and yib

16、eginif(clkevent and clk=1)thenif(c=1100 or clear=1)thend_data=0000;e_datad_datae_datanull;end case;end if;if(c=1100 or clear=1)thenad_data=0000;be_data=0000;-a_data=0000;b_data=0000;elsead_data=(a_data and d_data);be_datadata11=0100;data12=1110;data13=1110;data14data11=0010;data12=1100;data13=1100;d

17、ata14data11=1110;data12=1110;data13=1110;data14data11=0000;data12=0000;data13=0000;data14data21=0010;data22=0111;data23=0111;data24data21=0100;data22=0011;data23=0011;data24data21=0111;data22=0111;data23=0111;data24data21=0000;data22=0000;data23=0000;data24=0000; end case;else data11=0000;data12=000

18、0;data13=0000;data14=0000;data21=0000;data22=0000;data23=0000;data24=0000;end if;end if;end process;process(clk)beginif(clkevent and clk=1)thenif(cnt=11)thencnt=00;else cntrow=11111011;col_a=0100;col_brow=11110111;col_a=0100;col_brow=11101111;col_a=0100;col_brow=11011111;col_a=1010;col_brow=11111011

19、;col_b=0010;col_arow=11110111;col_b=0010;col_arow=11101111;col_b=0010;col_arow=11011111;col_b=0101;col_arow=11111011;col_a=data11;col_brow=11110111;col_a=data12;col_brow=11101111;col_a=data13;col_brow=11011111;col_a=data14;col_b=data24;end case;end if;end process;end;仿真波形如下:说明:如波形所示,实现了顺序限定显示点阵,最下面的

20、三个win_a,win_b,clear是对应计分模块甲乙二人计分结果的传入判断,和对分数的复位,此复位也是全局复位。3.计分模块 计分模块相对简单,也由按键键值判断来实现分数的计数,情况有九种,三种出拳的平局,甲的三种赢的情况和乙的三种赢的情况。对应赢的时候,甲乙的各自分数计数的信号加一就可以实现分数加,显示到数码管需要一个cat的互相对换,来显示两位分数分数满足三分时候分数不再增加,并且输出一个3给点阵,来显示胜利结果,并设有一个全局的复位,来实现游戏结束的复位,或者任意时刻的“重新开始玩”。具体实现如下:library ieee;use ieee.std_logic_1164.all;us

21、e ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity jifen isport(clk,clear:in std_logic;a,b,c,d:in std_logic_vector(3 downto 0);smg:out std_logic_vector(6 downto 0);cat:out std_logic_vector(7 downto 0);cnta,cntb:out std_logic_vector(2 downto 0);end jifen;architecture ji of jifen issign

22、al a_data,b_data,c1_data,c3_data,ad_data,be_data:std_logic_vector(3 downto 0):=0000;signal d_data,e_data:std_logic_vector(3 downto 0):=0000;signal cnt_a,cnt_b:STD_LOGIC_VECTOR (2 DOWNTO 0):=000;signal sig_a,sig_b,c2_data:std_logic;signal cat_t:std_logic_vector(7 downto 0):=11111101;beginprocess(a)-n

23、ote for jiabeginif(clkevent and clk=1)thenif(c=1100 or clear=1)thena_dataa_dataa_dataa_datanull;end case;end if;end if;end process;process(b)-note for yibeginif(clkevent and clk=1)thenif(c=1100 or clear=1)thenb_datab_datab_datab_datanull;end case;end if;end if;end process;process(c)-note for ready,o

24、pen and resetbeginif(clkevent and clk=1)thenif(c=1100 or clear=1)thenc1_data=0000;c2_datac1_datac2_datanull;end case;end if;end if;end process;process(c1_data,c2_data,c)-note for ok of jia and yibeginif(c2_dataevent and c2_data=1)thenif(c=1100 or clear=1)thend_data=0000;e_datad_datae_datanull;end ca

25、se;end if;end if;end process;process(clk)beginif(clear=1)thencnt_a=000;elseif(cnt_a=100)thencnt_a=000;elsif(c2_dataevent and c2_data=1)thenif(a_data=0001 and b_data=1001)thencnt_a=cnt_a+1;elsif(a_data=0101 and b_data=1010)thencnt_a=cnt_a+1;elsif(a_data=1001 and b_data=1000)thencnt_a=cnt_a+1;end if;e

26、nd if;end if;end process;process(clk)beginif(clear=1)thencnt_b=000;elseif(cnt_b=100)thencnt_b=000;elsif(c2_dataevent and c2_data=1)thenif(a_data=0001 and b_data=1010)thencnt_b=cnt_b+1;elsif(a_data=0101 and b_data=1000)thencnt_b=cnt_b+1;elsif(a_data=1001 and b_data=1001)thencnt_bcat_t=11111110;cat=ca

27、t_t;if(clear=1)thensmg=0000000;cntasmg=0000000;cntasmg=0110000;cntasmg=1101101;cntasmg=1111001;cntanull; end case; end if;when11111110=cat_t=11111101;cat=cat_t; if(clear=1)thensmg=0000000;cntbsmg=0000000;cntbsmg=0110000;cntbsmg=1101101;cntbsmg=1111001;cntbnull; end case; end if;when others=cat_t clk, kb_row_in = kb_row_in, kb_col_out = kb_col_out, showa = SYNTHESIZED_WI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论