北邮数电实验猜拳游戏.docx
- 文档编号:27944351
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:27
- 大小:291KB
北邮数电实验猜拳游戏.docx
《北邮数电实验猜拳游戏.docx》由会员分享,可在线阅读,更多相关《北邮数电实验猜拳游戏.docx(27页珍藏版)》请在冰豆网上搜索。
北邮数电实验猜拳游戏
数字电路与逻辑设计实验报告
题目:
猜拳游戏的设计与实现
姓名:
学院:
专业:
通信工程
学号:
班内序号:
摘要说明:
本实验在QuartusⅡ软件环境下,利用实验室集成芯片,使用VHDL语言编写程序实现一个猜拳小游戏的功能。
整个系统的设计过程中,采用了up_to_down的设计思想,完成了编码和译码输出到8X8点阵和数码管显示分数的功能,对应共有三个模块。
关键词:
编码译码VHDL模块
一.设计课题实验目的及任务要求:
本电路可供甲乙二人进行猜拳游戏。
通过不同的按键控制,选择多种出拳方式,显示猜拳的结果,实现猜拳游戏,防止了作弊的可能。
基本要求:
1、甲乙双方各用4×4键盘中的三个按键模拟“石头”、“剪刀”、“布”,一个按键为“确认”。
4×4键盘第一行为甲,第二行为乙;
2、裁判用4×4键盘第三行的一个按键模拟“开”,一个按键为“准备”,一个按键为“复位”;
3、裁判宣布“准备”后,甲乙双方分别选择出拳方式并确认;4、裁判“开”以后,用点阵的左右三列同时显示甲乙双方的猜拳选择(如下图所示),并用两个数码管显示甲乙的猜拳比分;
甲“布”,乙“剪刀”甲“剪刀”,乙“石头”
5、猜拳游戏为五局三胜制。
若甲乙双方出拳一致,则比分保持不变,双方重新出拳;
6、比赛结束后,用8×8点阵显示甲乙获胜方;
7、复位后游戏重新开始。
提高要求:
1、点阵显示增加游戏开机动画、结束动画;
2、为游戏增加音效;
3、在LCD1602液晶屏上显示甲乙双方的猜拳比分;
4、自拟其他功能。
二.系统设计:
(1)设计思路:
根据实验的要求,首先控制器是键盘,构思键盘的控制方式:
1、假设4X4键盘第一个到最后一个按键编号为1-16,本实验用到了1-11,共十一个按键,对这十一个按键进行键值编码:
第一行1234
0001010110011101
第二行5678
1000100110101011
第三行91011
111101101100
123代表甲方出“石头”“剪刀”“布”,4代表“已选好(确认)”;
567代表乙方出“石头”“剪刀”“布”,8代表“已选好(确认)”;
9代表“准备”,10代表“开结果”,11代表“复位”
注:
此处复位的是按键的操作,对后面的分数不会有影响。
2、键盘编好了每个键的码,进行按键操作以后,传入点阵模块
点阵是8X8的,列输出用红色,列是共阳极,需要扫描显示,按照给出的图案要求,进行图案的扫描显示,比较简单,之后详见代码。
3、根据赛制,五局三胜,也就是谁先达到三分谁就是赢家,故计分模块只需要分别最大分数技术为3就符合了计分目的,计分独立模块,根据按键模块输出的键值,进行译码,根据“开结果”以后之前的甲乙出拳组合得出不同分数计数,通过数码管的左侧两位显示出来,当一方达到三分后,将甲或者乙的计分3输出,输入到点阵模块,此时显示一方胜利图案。
至此设计思路完整清晰。
(2)系统总体框图:
三.分块设计程序及仿真分析
1.按键模块
由于我们的4X4按键模块的端口是:
四行的每行四个键分别公用一个行输入,四列的四个键分别公用一个列输出,这就需要我们扫描按键来控制输出。
四位计数对列进行扫描,每次扫描单列时,再对行进行扫描,这样就可以对使用到的所有键分别有各自的输入输出控制。
具体实现如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitycaiquanis
port(
kb_row_in:
instd_logic_vector(3downto0);
kb_col_out:
outstd_logic_vector(3downto0);
showa,showb,showc,showd:
outstd_logic_vector(3downto0);
clk:
instd_logic
);
ENDcaiquan;
architecturecaiofcaiquanis
signalcounta,countb:
std_logic_vector(1downto0);
signalcol_out:
std_logic_vector(3downto0);
signala,b,c,d:
std_logic_vector(3downto0):
="0000";
--************************
begin
process(counta,clk)----
begin
if(clk'eventandclk='1')then
if(counta="11")then
counta<="00";
else
counta<=counta+1;
endif;
endif;
endprocess;
process(clk)
begin
casecountais
when"00"=>kb_col_out<="0111";countb<="00";
when"01"=>kb_col_out<="1011";countb<="01";
when"10"=>kb_col_out<="1101";countb<="10";
when"11"=>kb_col_out<="1110";countb<="11";
endcase;
endprocess;
process(clk)----
begin
casecountbis
when"00"=>casekb_row_inis
when"0111"=>a<="0001";b<="0000";c<="0000";d<="0000";
when"1011"=>b<="1000";a<="0000";c<="0000";d<="0000";
when"1101"=>c<="1111";b<="0000";a<="0000";d<="0000";
whenothers=>a<="0000";b<="0000";c<="0000";d<="0000";
endcase;
when"01"=>casekb_row_inis
when"0111"=>a<="0101";b<="0000";c<="0000";d<="0000";
when"1011"=>b<="1001";a<="0000";c<="0000";d<="0000";
when"1101"=>c<="0110";b<="0000";a<="0000";d<="0000";
whenothers=>a<="0000";b<="0000";c<="0000";d<="0000";
endcase;
when"10"=>casekb_row_inis
when"0111"=>a<="1001";b<="0000";c<="0000";d<="0000";
when"1011"=>b<="1010";a<="0000";c<="0000";d<="0000";
when"1101"=>c<="1100";b<="0000";a<="0000";d<="0000";
whenothers=>a<="0000";b<="0000";c<="0000";d<="0000";
endcase;
when"11"=>casekb_row_inis
when"0111"=>d<="1101";a<="0000";c<="0000";b<="0000";
when"1011"=>d<="1011";b<="0000";c<="0000";a<="0000";
whenothers=>a<="0000";b<="0000";c<="0000";d<="0000";
endcase;
endcase;
showa<=a;
showb<=b;
showc<=c;
showd<=d;
endprocess;
end;
仿真波形如下:
说明:
由仿真可以清晰地看到abcd四组键的键值输出
a000101011001d1101
b1000100110101011
c111101101100
2.点阵模块
点阵模块和按键模块一样需要扫描显示,由于我们的图形只涉及到中间四行和两边各三列,我们的行扫描只需扫描中间四行其他四行置0可以节省引脚使用,扫描行,每行对应列的输出,频率高了人眼看到的就是静止的图形。
点阵模块显示图形需要对按键模块传输过来的键码对应译码,对应不同按键情况进行不同的图形显示。
此程序使用键值“与”来表达“已选好(确认)”,在“与”之前加入“准备”的限定条件,之后判断“与”的结果之前加上“开结果”的限定,就可以实现“准备”——出拳“已选好(确认)”——“开结果”的顺序限制,而复位只需要在每个进程刚开始时加入复位信号的初值,就可以实现复位来灭掉点阵显示。
具体实现如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitydianzhenis
port(
clear:
instd_logic;
win_a,win_b:
instd_logic_vector(2downto0);
clk:
instd_logic;
col_a,col_b:
outstd_logic_vector(3downto0);
a,b,c,d:
instd_logic_vector(3downto0);
row:
outstd_logic_vector(7downto0)
);
enddianzhen;
architecturedianofdianzhenis
signaldata11,data12,data13,data14,data21,data22,data23,data24:
std_logic_vector(3downto0);
signala_data,b_data,c1_data,c2_data,c3_data,ad_data,be_data:
std_logic_vector(3downto0):
="0000";
signald_data,e_data:
std_logic_vector(3downto0):
="0000";
signalcnt:
STD_LOGIC_VECTOR(1DOWNTO0);
signalwina_data,winb_data:
std_logic_vector(2downto0):
="000";
begin
process(win_a)------noteforwina
begin
if(clk'eventandclk='1')then
if(clear='1')then
wina_data<="000";
else
casewin_ais
when"000"=>wina_data<="000";
when"001"=>wina_data<="001";
when"010"=>wina_data<="010";
when"011"=>wina_data<="011";
whenothers=>null;
endcase;
endif;
endif;
endprocess;
process(win_b)------noteforwinb
begin
if(clk'eventandclk='1')then
if(clear='1')then
winb_data<="000";
else
casewin_bis
when"000"=>winb_data<="000";
when"001"=>winb_data<="001";
when"010"=>winb_data<="010";
when"011"=>winb_data<="011";
whenothers=>null;
endcase;
endif;
endif;
endprocess;
process(a)------noteforjia
begin
if(clk'eventandclk='1')then
if(c="1100"orclear='1')then
a_data<="0000";
else
caseais
when"0001"=>a_data<="0001";
when"0101"=>a_data<="0101";
when"1001"=>a_data<="1001";
whenothers=>null;
endcase;
endif;
endif;
endprocess;
process(b)------noteforyi
begin
if(clk'eventandclk='1')then
if(c="1100"orclear='1')then
b_data<="0000";
else
casebis
when"1000"=>b_data<="1000";
when"1001"=>b_data<="1001";
when"1010"=>b_data<="1010";
whenothers=>null;
endcase;
endif;
endif;
endprocess;
process(c)------noteforready,openandreset
begin
if(clk'eventandclk='1')then
if(c="1100"orclear='1')then
c1_data<="0000";c2_data<="0000";
else
casecis
when"1111"=>c1_data<="1111";
when"0110"=>c2_data<="0110";
whenothers=>null;
endcase;
endif;
endif;
endprocess;
process(clk,c1_data,c2_data,c)------notefor"ok"ofjiaandyi
begin
if(clk'eventandclk='1')then
if(c="1100"orclear='1')then
d_data<="0000";e_data<="0000";
elsif(c1_data="1111")then
casedis
when"1101"=>d_data<="1101";
when"1011"=>e_data<="1011";
whenothers=>null;
endcase;
endif;
if(c="1100"orclear='1')then
ad_data<="0000";be_data<="0000";--a_data<="0000";b_data<="0000";
else
ad_data<=(a_dataandd_data);
be_data<=(b_dataande_data);
endif;
endif;
endprocess;
process(clk)
begin
if(clk'eventandclk='1')then
if(c2_data="0110"orc="1100"orclear='1')then
casead_datais
when"0001"=>data11<="0100";data12<="1110";data13<="1110";data14<="0100";--rock
when"0101"=>data11<="0010";data12<="1100";data13<="1100";data14<="0010";--scissors
when"1001"=>data11<="1110";data12<="1110";data13<="1110";data14<="1110";--paper
whenothers=>data11<="0000";data12<="0000";data13<="0000";data14<="0000";
endcase;
casebe_datais
when"1000"=>data21<="0010";data22<="0111";data23<="0111";data24<="0010";--rock
when"1001"=>data21<="0100";data22<="0011";data23<="0011";data24<="0100";--scissors
when"1010"=>data21<="0111";data22<="0111";data23<="0111";data24<="0111";--paper
whenothers=>data21<="0000";data22<="0000";data23<="0000";data24<="0000";
endcase;
else
data11<="0000";data12<="0000";data13<="0000";data14<="0000";
data21<="0000";data22<="0000";data23<="0000";data24<="0000";
endif;
endif;
endprocess;
process(clk)
begin
if(clk'eventandclk='1')then
if(cnt="11")then
cnt<="00";
elsecnt<=cnt+1;
endif;
endif;
if(win_a="011")then
casecntis
when"00"=>row<="11111011";col_a<="0100";col_b<="0101";
when"01"=>row<="11110111";col_a<="0100";col_b<="0010";
when"10"=>row<="11101111";col_a<="0100";col_b<="0010";
when"11"=>row<="11011111";col_a<="1010";col_b<="0101";
endcase;
elsif(win_b="011")then
casecntis
when"00"=>row<="11111011";col_b<="0010";col_a<="0101";
when"01"=>row<="11110111";col_b<="0010";col_a<="0010";
when"10"=>row<="11101111";col_b<="0010";col_a<="0010";
when"11"=>row<="11011111";col_b<="0101";col_a<="0101";
endcase;
else
casecntis
when"00"=>row<="11111011";col_a<=data11;col_b<=data21;
when"01"=>row<="11110111";col_a<=data12;col_b<=data22;
when"10"=>row<="11101111";col_a<=data13;col_b<=data23;
when"11"=>row<="11011111";col_a<=data14;col_b<=data24;
endcase;
endif;
endprocess;
end;
仿真波形如下:
说明:
如波形所示,实现了顺序限定显示点阵,最下面的三个win_a,win_b,clear是对应计分模块甲乙二人计分结果的传入判断,和对分数的复位,此复位也是全局复位。
3.计分模块
计分模块相对简单,也由按键键值判断来实现分数的计数,情况有九种,三种出拳的平局,甲的三种赢的情况和乙的三种赢的情况。
对应赢的时候,甲乙的各自分数计数的信号加一就可以实现分数加,显示到数码管需要一个cat的互相对换,来显示两位分数
分数满足三分时候分数不再增加,并且输出一个3给点阵,来显示胜利结果,并设有一个全局的复位,来实现游戏结束的复位,或者任意时刻的“重新开始玩”。
具体实现如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityjifenis
port(
clk,clear:
instd_logic;
a,b,c,d:
instd_logic_vector(3downto0);
smg:
outstd_logic_vector(6downto0);
cat:
outstd_logic_vector(7downto0);
cnta,cntb:
outstd_logic_vector(2downto0)
);
endjifen;
architecturejiofjifenis
signala_data,b_data,c1_data,c3_data,ad_data,be_data:
std_logic_vector(3downto0):
="0000";
signald_data,e_data:
std_logic_vector(3downto0):
="0000";
signalcnt_a,cnt_b:
STD_LOGIC_VECTOR(2DOWNTO0):
="000";
signalsig_a,sig_b,c2_data:
std_logic;
signalcat_t:
std_logic_vector(7downto0):
="11111101";
begin
process(a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮数电 实验 猜拳 游戏
![提示](https://static.bdocx.com/images/bang_tan.gif)