掷骰子游戏电路的设计与实现课程设计论文.docx
- 文档编号:9161566
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:45
- 大小:557.16KB
掷骰子游戏电路的设计与实现课程设计论文.docx
《掷骰子游戏电路的设计与实现课程设计论文.docx》由会员分享,可在线阅读,更多相关《掷骰子游戏电路的设计与实现课程设计论文.docx(45页珍藏版)》请在冰豆网上搜索。
掷骰子游戏电路的设计与实现课程设计论文
掷骰子游戏电路的设计与实现
数字电路与逻辑设计实验报告
学院:
电子工程学院
班级:
学号
姓名:
指导老师:
一、设计课题的任务要求
1、基本要求
1、电路可供甲乙二人游戏,游戏者甲使用的按键为BTN0,游戏者乙使用的按键为BTN1。
2、每按一次按键,代表掷一次骰子,可随机得到1~6范围内的两个数字。
3、甲乙按键产生的随机数字分别用数码管DISP0-DISP1、DISP2-DISP3显示,并用DISP7显示比赛局数,比赛结束用8×8点阵显示获胜方,并伴有声音效果。
4、具体游戏规则如下:
(1)第一局比赛,甲乙依次各按一次按键,按键所得两数之和为7或11者胜;若无人取胜,则进行第二局比赛;
(2)第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤
(2),直到出现胜者为止。
(3)在第六局比赛时,若重复进行步骤
(2)仍未出现胜者,以按键所得两数之和最大者为获胜方,若依然未分出胜负,重复比大小直到出现胜者为止。
2、提高要求
1、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。
2、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播放。
3、自拟其它功能。
二、系统设计
1、设计思路
1、开机及复位时,出现开机画面及音乐,进入待机状态;
2、设置甲方投掷按钮、乙方投掷按钮、复位按钮三个按键,玩家按相应的按钮进行投掷,数码管显示其投掷的两个随机数,并显示进行的局数;
3、若比赛进行中有玩家获胜,则点阵显示获胜玩家,同时蜂鸣器响起提示结束;
4、数码管显示中,新的一局开始时,即甲玩家投掷后,乙玩家上局的投掷结果应该消失,等待新的投掷;
5、按照骰子的结构,投掷的结果应该为1—6的随机数,应该尽可能地产生等概率的随机数,共有36种组合情况:
11
12
13
14
15
16
21
22
23
24
25
26
31
32
33
34
35
36
41
42
43
44
45
46
51
52
53
54
55
56
61
62
63
64
65
66
6、局数的显示应该在乙投掷后,甲投掷前改变;
7、按照既定的游戏规则,系统应该以局数为指标,对比赛的输赢进行评判,要充分考虑到每一种情况下的判决问题;
8、复位时,要回到起始状态,初始化信号,等待新一局游戏开始。
2、总体框图
顶层框图
对外接口框图
逻辑划分框图
状态转移图
逻辑流程图
3、分块设计
VHDL支持模块化设计,可将大规模设计项目分解成若干个小项目,还可以把已有的设计项目作为一个模块调用。
根据实验设计思路及所要完成的功能,将分为以下几个模块进行实现:
1、蜂鸣器模块
当在开机或复位状态时,蜂鸣器响开机音乐,在游戏过程中蜂鸣停止,当有玩家获胜时蜂鸣器鸣;
2、点阵显示模块
当在开机或复位状态及游戏过程中,点阵显示开机画面,当有玩家获胜时,点阵显示获胜玩家;
3、数码管显示模块
分别显示甲、乙投掷的随机数以及局数,复位时甲乙熄灭、局数归零;
4、按键防抖模块
对甲、乙按键进行防抖,用于准确判断按键的次数,得以确定局数;
5、分频模块
按照不同模块的需要进行分频;
6、局数记录与显示模块
用于对局数的记录和显示,并用于输赢判断中,按照不同的局数使用不同的判别规则;
7、随机数产生与显示模块
当玩家按按钮时产生两个随机数;
8、按规则判决模块
以局数为标准按照既定规则进行输赢判决。
三、仿真波形及波形分析
1、第1局分出胜负
分析:
如图所示,jushu为1时,甲投掷和jiasum为7,乙投掷和yisum为8,所以Jia_win为1,表示甲胜利;复位后全部归0。
分析:
如图所示为点阵显示,dianzhencom为绿色列,dianzhenred为红色列,dianzhenhang为行扫描,当甲获胜时出现如图所示图形,为“甲”,当重置时,点阵回复为开机画面“VS”。
2、第2——5局分出胜负
分析:
如图,1——3局没有分出胜负,第4局时,乙投掷出10和前一局相同,而甲投掷的4与前一局不相同,因此乙获胜,Yi_win信号为1;之后按Restart复位后,全部归0。
3、第6局之后分出胜负
分析:
如图所示,前五局没有分出胜负,第六局开始比较大小,甲投掷出6,乙投掷出10大于6,因此乙获胜,Yi_win为1;之后令Restart为1,即复位后,全部置0。
四、源程序
1、主程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityzhitouziis
port(
Restart:
instd_logic;--reset复位端
Jia:
instd_logic;--thefrist甲投掷按钮
Yi:
instd_logic;--thesecond乙投掷按钮
Clk:
instd_logic;--clock时钟端
beep:
outstd_logic;--beep蜂鸣器
tubes:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--七段数码管
cats:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);--控制端
dianzhencom:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵绿色列
dianzhenred:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵红色列
dianzhenhang:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)--点阵行扫描
);
endzhitouzi;
architectureaofzhitouziis
componentdidi
PORT(
clk1:
INstd_logic;
rst:
INstd_logic;
beep_in:
integerrange0to2;
out_bit:
OUTstd_logic);
endcomponent;
signalshumaguan:
STD_LOGIC_VECTOR(6DOWNTO0);--数码管显示信号
signalcontrol:
STD_LOGIC_VECTOR(5DOWNTO0);--数码管6位控制端
signaljia1:
std_logic_vector(6downto0);--甲投掷的第一个数显示
signaljia2:
std_logic_vector(6downto0);--甲投掷的第二个数显示
signalyi1:
std_logic_vector(6downto0);--乙投掷的第一个数显示
signalyi2:
std_logic_vector(6downto0);--乙投掷的第二个数显示
signaljianum1:
integerrange1to6;--甲投掷的第一个数字
signaljianum2:
integerrange1to6;--甲投掷的第二个数字
signaljiasum:
integerrange2to12:
=2;--甲投掷的数字之和
signaljiasum0:
integerrange2to12:
=2;--记录前一次甲投掷的数字之和
signalyinum1:
integerrange1to6;--乙投掷的第一个数字
signalyinum2:
integerrange1to6;--乙投掷的第一个数字
signalyisum:
integerrange2to12:
=2;--乙投掷的数字之和
signalyisum0:
integerrange2to12:
=2;--记录前一次乙投掷的数字之和
signaljiasum1:
integerrange2to12:
=2;--以下均为记录前一个和
signalyisum1:
integerrange2to12:
=2;
signaljiasum2:
integerrange2to12:
=2;
signalyisum2:
integerrange2to12:
=2;
signaljiasum3:
integerrange2to12:
=2;
signalyisum3:
integerrange2to12:
=2;
signaljushu:
integerrange0to9:
=0;--记录当前局数
--signaljushu2:
integerrange0to9:
=0;
signaljushushow:
std_logic_vector(6downto0):
="1111110";--当前局数显示
signaltimes:
integerrange0to5;--数码管显示调频参数
signalnum1:
integerrange0to35;--甲随机数控制变量
signalnum2:
integerrange0to35;--乙随机数控制变量
signalbeep0:
integerrange0to2:
=2;--蜂鸣器信号
typestateis(S0,S1,S2);--防抖模块状态
signalcurrent:
state;
typestate2is(Y0,Y1,Y2);
signalcurrent2:
state2;
signaljiafang:
std_logic;--甲防抖信号
signalYifang:
std_logic;--乙防抖信号
signaljiasignal:
integerrange0to1:
=0;--甲乙得分标识
signalyisignal:
integerrange0to1:
=0;
signaljiasignal1:
integerrange0to1:
=0;
signalyisignal1:
integerrange0to1:
=0;
signaljiasignal2:
integerrange0to1:
=0;
signalyisignal2:
integerrange0to1:
=0;
signaljiasignal3:
integerrange0to1:
=0;
signalyisignal3:
integerrange0to1:
=0;
signaljiasignal4:
integerrange0to1:
=0;
signalyisignal4:
integerrange0to1:
=0;
signaljiasignal5:
integerrange0to1:
=0;
signalyisignal5:
integerrange0to1:
=0;
signaljiasignal6:
integerrange0to1:
=0;
signalyisignal6:
integerrange0to1:
=0;
signaljiasignal7:
integerrange0to1:
=0;
signalyisignal7:
integerrange0to1:
=0;
signalwin:
integerrange0to2:
=0;--胜利标识
signaltemp1:
integerrange0to149999;
signalclk_out1:
std_logic;
signaltemp2:
integerrange0to129999;
signalclk_out2:
std_logic;
typematrix_typeISarray(7downto0)ofstd_logic_vector(7downto0);--定义二维数组8*8信号
signalmatrix:
matrix_type;--两个点阵显示数组
signalmatrix2:
matrix_type;
signalsaomiao:
std_logic_vector(7downto0);--点阵行扫描信号
signaldata:
std_logic_vector(7downto0);--点阵绿色列
signaldata2:
std_logic_vector(7downto0);--点阵红色列
begin
U1:
didiportmap(clk1=>clk,rst=>restart,out_bit=>beep,beep_in=>beep0);
dianzhenshow:
process(clk_out2)--点阵显示
begin
if(clk_out2='1'andclk_out2'event)then
ifsaomiao(7downto0)="00000000"orsaomiao(7downto0)="01111111"then
saomiao(7downto0)<="11111110";data<=matrix(0);data2<=matrix2(0);
elsifsaomiao(7downto0)="11111110"then
saomiao(7downto0)<="11111101";data<=matrix
(1);data2<=matrix2
(1);
elsifsaomiao(7downto0)="11111101"then
saomiao(7downto0)<="11111011";data<=matrix
(2);data2<=matrix2
(2);
elsifsaomiao(7downto0)="11111011"then
saomiao(7downto0)<="11110111";data<=matrix(3);data2<=matrix2(3);
elsifsaomiao(7downto0)="11110111"then
saomiao(7downto0)<="11101111";data<=matrix(4);data2<=matrix2(4);
elsifsaomiao(7downto0)="11101111"then
saomiao(7downto0)<="11011111";data<=matrix(5);data2<=matrix2(5);
elsifsaomiao(7downto0)="11011111"then
saomiao(7downto0)<="10111111";data<=matrix(6);data2<=matrix2(6);
elsifsaomiao(7downto0)="10111111"then
saomiao(7downto0)<="01111111";data<=matrix(7);data2<=matrix2(7);
endif;
endif;
endprocessdianzhenshow;
juzhenfuzhi:
process(clk_out2,restart,win)--给两个显示点阵赋值
begin
if(restart='1')then--复位时的显示图形
matrix(0)<="11111111";
matrix
(1)<="10001111";
matrix
(2)<="10001001";
matrix(3)<="10001111";
matrix(4)<="10000011";
matrix(5)<="10001111";
matrix(6)<="11111111";
matrix(7)<="11111111";
matrix2(0)<="11111111";
matrix2
(1)<="11010001";
matrix2
(2)<="11010001";
matrix2(3)<="11010001";
matrix2(4)<="11010001";
matrix2(5)<="10100001";
matrix2(6)<="11111111";
matrix2(7)<="11111111";
elsif(beep0=1)then
if(clk_out2='1'andclk_out2'event)then
if(win=1)then--甲胜利时的显示
matrix(0)<="01111100";
matrix
(1)<="01010100";
matrix
(2)<="01111100";
matrix(3)<="01010100";
matrix(4)<="01111100";
matrix(5)<="00010000";
matrix(6)<="00010000";
matrix(7)<="00010000";
matrix2(0)<="01111100";
matrix2
(1)<="01010100";
matrix2
(2)<="01111100";
matrix2(3)<="01010100";
matrix2(4)<="01111100";
matrix2(5)<="00010000";
matrix2(6)<="00010000";
matrix2(7)<="00010000";
elsif(win=2)then--乙胜利时的显示
matrix(0)<="01111100";
matrix
(1)<="00000100";
matrix
(2)<="00000100";
matrix(3)<="00001000";
matrix(4)<="00010000";
matrix(5)<="00100000";
matrix(6)<="01000100";
matrix(7)<="01111100";
matrix2(0)<="01111100";
matrix2
(1)<="00000100";
matrix2
(2)<="00000100";
matrix2(3)<="00001000";
matrix2(4)<="00010000";
matrix2(5)<="00100000";
matrix2(6)<="01000100";
matrix2(7)<="01111100";
elsematrix(0)<="00000000";
matrix
(1)<="00000000";
matrix
(2)<="00000000";
matrix(3)<="00000000";
matrix(4)<="00000000";
matrix(5)<="00000000";
matrix(6)<="00000000";
matrix(7)<="00000000";
matrix2(0)<="00000000";
matrix2
(1)<="00000000";
matrix2
(2)<="00000000";
matrix2(3)<="00000000";
matrix2(4)<="00000000";
matrix2(5)<="00000000";
matrix2(6)<="00000000";
matrix2(7)<="00000000";
endif;
endif;
endif;
endprocessjuzhenfuzhi;
fangdou1:
process(clk_out1,restart,Jia)--甲按钮防抖模块
begin
if(restart='1')then
current<=S0;
jiafang<='0';
elseif(clk_out1'eventandclk_out1='1')then
casecurrentis
whenS0=>
jiafang<='1';
if(Jia='0')thencurrent<=S1;
elsecurrent<=S0;
endif;
whenS1=>
jiafang<='1';
if(Jia='0')then
current<=S2;
else
current<=S0;
endif;
whenS2=>
jiafang<='0';
if(Jia='0')then
current<=S2;
else
current<=S0;jiafang<='1';
endif;
whenothers=>
jiafang<='1';
current<=S0;
endcase;
endif;
endif;
endprocessfangdou1;
--fangdou2:
process(clk,restart,Yi)--乙按钮防抖模块
--begin
--if(restart='1')then
--current2<=Y0;
--yifang<='0';
--elseif(clk'eventandclk='1')then
--casecurrent2is
--whenY0=>
--yifang<='1';
--if(Yi='0')thencurrent2<=Y1;
--elsecurrent2<=Y0;
--endif;
--whenY1=>
--yifang<='1';
--if(Yi='0')then
--current2<=Y2;
--else
--current2<=Y0;
--endif;
--whenY2=>
--yifang<='0';
--if(Yi='0')then
--current2<=Y2;
--else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 骰子 游戏 电路 设计 实现 课程设计 论文