北邮数字电路实验投骰子游戏.docx
《北邮数字电路实验投骰子游戏.docx》由会员分享,可在线阅读,更多相关《北邮数字电路实验投骰子游戏.docx(26页珍藏版)》请在冰豆网上搜索。
北邮数字电路实验投骰子游戏
数电综合实验报告掷骰子游戏电路的设计与实现
姓名:
xxx
班级:
xxx
学号:
xxx
目录
数电综合实验报告掷骰子游戏电路的设计与实现1
一、实验要求:
2
基本要求:
2
提高要求:
2
二、系统设计2
设计思路2
总体框图2
三、仿真波形及波形分析6
四、源程序6
五、功能说明及资源利用情况18
功能说明18
资源利用情况18
六、故障及问题分析19
七、实验结果显示20
八、总结和结论21
一、实验要求:
基本要求:
1、电路可供甲乙二人游戏,游戏者甲使用的按键是BTN0,游戏者乙使用的按键为BTN1。
2、每按一次按键,代表掷一次骰子,可随机得到1~6范围内的两个数字。
3、甲乙按键产生的随机数字分别用数码管DISP0~DISP1、DISP2~DISP3显示,并用DISP7显示比赛局数,比赛结束用8×8点阵显示获胜方,并伴有声音效果。
4、具体游戏规则如下:
(1)第一局比赛,甲乙依次各按一次按键,按键所得两数之和为7或11者胜;若无人取胜,则进行第二局比赛;
(2)第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤
(2),直到出现胜者为止。
(3)游戏局数最多进行六局。
在第六局比赛时,若重复进行步骤
(2)仍未出现胜者,以按键所得两数之和最大者为获胜方。
提高要求:
1、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。
2、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播放。
3、自拟其它功能。
二、系统设计
设计思路
在设计该游戏时,我采用了自顶向下的设计方法,首先分析了这个掷骰子游戏的基本功能就是按照上述的游戏要求设计,然后看这个系统结构该怎么分解,会产生哪些系统模型和子模块,根据上述要求最终我决定将该系统分解成以下五个模块:
随机数产生模块、按键赋值模块、数码管显示模块、状态判断模块、结果输出(点阵和蜂鸣器)模块,最后具体到各个模块该怎么实现,及代码的编写。
总体框图
具体框图见附加Visio文件
注:
框图中||表示并行程序
1、分块设计
随机数产生与按键赋值模块
状态判断模块
结果显示模块
三、仿真波形及波形分析
由上图波形可以看出程序已经实现了基本功能,但在某些部分会出现毛刺,不影响整体性能。
四、源程序
------------------------------------------------主程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityzhishaiziis
port(
----------------
CLK:
instd_logic;
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--段码
BT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);--位码
----------------
buttoin1:
instd_logic;
buttoin2:
instd_logic;
beep:
outstd_logic;
row,lie1:
outstd_logic_vector(7downto0));
endzhishaizi;
architectureabofzhishaiziis
----------------------------------------------------
typeshu_zuisarray(7downto0)ofstd_logic_vector(7downto0);
constantkaiji:
shu_zu:
=(
("00100001"),
("00100010"),
("00100100"),
("00100100"),
("11111111"),
("00100100"),
("00100100"),
("11111111")
);
constantjia:
shu_zu:
=(
("00011000"),
("00011000"),
("00011000"),
("11111111"),
("10011001"),
("11111111"),
("10011001"),
("11111111")
);
constantyi:
shu_zu:
=(
("11111110"),
("10000001"),
("00000010"),
("00000100"),
("00001000"),
("00010000"),
("00100000"),
("11111111"));
constantping:
shu_zu:
=(
("00011000"),
("00011000"),
("00011000"),
("11111111"),
("00111100"),
("01011010"),
("10011001"),
("11111111")
);
constantjieshu:
shu_zu:
=(
("00001000"),
("00000100"),
("00000010"),
("11111111"),
("00000010"),
("00000100"),
("00001000"),
("00000000")
);
--------------------------------------------------------
SIGNALclk_tmp:
STD_LOGIC;
SIGNALclk_tmpp:
STD_LOGIC;
signaltemp:
integerrange0to1999;
signaltempp:
integerrange0to1896;
signalab:
INTEGERRANGE0TO7;
SIGNALCNT6:
INTEGERRANGE0TO4;
SIGNALcn:
integerrange1to6;
SIGNALcnn:
integerrange1to6;
signala1,a2,b1,b2:
INTEGERrange1to6;
signalcount:
INTEGERrange1to6;
signala3,b3:
INTEGERrange2to12;
signalm1,m2:
INTEGERrange1to12;
signalA:
INTEGERRANGE1TO6;
signaljieguo:
INTEGERRANGE0TO4;
signaljudge:
std_logic;
signalclear:
integerrange0to1;
begin
--------------------------------------------------------------------------------------------
pp1:
process(clk)--分频器1
begin
ifclk'eventandclk='1'then
iftemp=999then
temp<=0;
elsetemp<=temp+1;
endif;
endif;
endprocesspp1;
pp2:
process(temp)
begin
iftemp=999then
clk_tmp<='1';
else
clk_tmp<='0';
endif;
endprocesspp2;
p0p1:
process(clk)--分频器2
begin
ifclk'eventandclk='1'then
iftempp=896then
tempp<=0;
elsetempp<=tempp+1;
endif;
endif;
endprocessp0p1;
p0p2:
process(tempp)
begin
iftempp=896then
clk_tmpp<='1';
else
clk_tmpp<='0';
endif;
endprocessp0p2;
p02:
process(clk_tmp)--点阵的扫描信号
begin
if(clk_tmp'eventandclk_tmp='1')then
ab<=ab+1;
if(ab=8)then
ab<=0;
endif;
endif;
endprocessp02;
p0:
process(ab)
begin
casejieguois
when0=>----------------------------------------------开机动画
caseabis
when0=>
lie1<=kaiji(ab);
row<="01111111";
when1=>
lie1<=kaiji(ab);
row<="10111111";
when2=>
lie1<=kaiji(ab);
row<="11011111";
when3=>
lie1<=kaiji(ab);
row<="11101111";
when4=>
lie1<=kaiji(ab);
row<="11110111";
when5=>
lie1<=kaiji(ab);
row<="11111011";
when6=>
lie1<=kaiji(ab);
row<="11111101";
when7=>
lie1<=kaiji(ab);
row<="11111110";
endcase;
when1=>--------------------------------------------------显示甲
caseabis
when0=>
lie1<=jia(ab);
row<="01111111";
when1=>
lie1<=jia(ab);
row<="10111111";
when2=>
lie1<=jia(ab);
row<="11011111";
when3=>
lie1<=jia(ab);
row<="11101111";
when4=>
lie1<=jia(ab);
row<="11110111";
when5=>
lie1<=jia(ab);
row<="11111011";
when6=>
lie1<=jia(ab);
row<="11111101";
when7=>
lie1<=jia(ab);
row<="11111110";
endcase;
when2=>-----------------------------------显示乙
caseabis
when0=>
lie1<=yi(ab);
row<="01111111";
when1=>
lie1<=yi(ab);
row<="10111111";
when2=>
lie1<=yi(ab);
row<="11011111";
when3=>
lie1<=yi(ab);
row<="11101111";
when4=>
lie1<=yi(ab);
row<="11110111";
when5=>
lie1<=yi(ab);
row<="11111011";
when6=>
lie1<=yi(ab);
row<="11111101";
when7=>
lie1<=yi(ab);
row<="11111110";
endcase;
when3=>-------------------------------------显示平
caseabis
when0=>
lie1<=ping(ab);
row<="01111111";
when1=>
lie1<=ping(ab);
row<="10111111";
when2=>
lie1<=ping(ab);
row<="11011111";
when3=>
lie1<=ping(ab);
row<="11101111";
when4=>
lie1<=ping(ab);
row<="11110111";
when5=>
lie1<=ping(ab);
row<="11111011";
when6=>
lie1<=ping(ab);
row<="11111101";
when7=>
lie1<=ping(ab);
row<="11111110";
endcase;
when4=>-------------------------------------显示箭头
caseabis
when0=>
lie1<=jieshu(ab);
row<="01111111";
when1=>
lie1<=jieshu(ab);
row<="10111111";
when2=>
lie1<=jieshu(ab);
row<="11011111";
when3=>
lie1<=jieshu(ab);
row<="11101111";
when4=>
lie1<=jieshu(ab);
row<="11110111";
when5=>
lie1<=jieshu(ab);
row<="11111011";
when6=>
lie1<=jieshu(ab);
row<="11111101";
when7=>
lie1<=jieshu(ab);
row<="11111110";
endcase;
endcase;
endprocessp0;
P2:
process(clk_tmp)------控制码位
BEGIN
if(clk_tmp'eventandclk_tmp='1')then
if(CNT6=4)THEN
CNT6<=0;
ELSE
CNT6<=CNT6+1;
ENDIF;
ENDIF;
ENDPROCESSP2;
P1:
process(CNT6)
BEGIN
CASECNT6IS--3线至6线译码器
WHEN0=>BT<="011111";A<=a1;
WHEN1=>BT<="101111";A<=a2;
WHEN2=>BT<="111011";A<=count;
WHEN3=>BT<="111101";A<=b1;
WHEN4=>BT<="111110";A<=b2;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP1;
P3:
process(A)
BEGIN
CASEAIS--实现数码管的显示功能
WHEN1=>SG<="0110000";
WHEN2=>SG<="1101101";
WHEN3=>SG<="1111001";
WHEN4=>SG<="0110011";
WHEN5=>SG<="1011011";
when6=>SG<="1011111";
ENDCASE;
ENDPROCESSP3;
---------------------------------------------------------两个分频器分别产生两个随机数
p4:
process(clk_tmp)
begin
if(clk_tmp'eventandclk_tmp='1')then
ifcn=6then
cn<=1;
elsecn<=cn+1;
endif;
endif;
endprocessp4;
pp4:
process(clk_tmpp)
begin
if(clk_tmpp'eventandclk_tmpp='1')then
ifcnn=6then
cnn<=1;
elsecnn<=cnn+1;
endif;
endif;
endprocesspp4;
---------------------------------------------------------------------------------------------蜂鸣器
p5:
process(clk_tmp)
begin
ifclear=1then
ifclk='1'then
beep<='1'after5ns;
else
beep<='0'after5ns;
endif;
elsenull;
endif;
endprocessp5;
-------------------------------------------------------当有按键按下时,根据按下的键取不同的值
p7p:
process(buttoin1,buttoin2)
begin
if(buttoin1='1')then
ifjudge='1'then
a1<=cn;
a2<=cnn;
judge<='0';
endif;
endif;
if(buttoin2='1')then
ifjudge='0'then
b1<=cn;
b2<=cnn;
judge<='1';
endif;
endif;
endprocessp7p;
---------------------------------------------------------
p8:
process(judge)
begin
if(judge'eventandjudge='1')then
if(count=6)then
count<=1;
elsecount<=count+1;
endif;
endif;
a3<=a1+a2;
b3<=b1+b2;
endprocessp8;
---------------------------------------------------------判断状态是第几局
p9:
process(count)
begin
if(clear=1)then------------------如果清零信号为1则先置零
m1<=1;------------------防止被上局的结果影响
m2<=1;
clear<=0;
elsenull;
endif;
casecountis
when1=>
if(a3=7ora3=11)then
if(b3=7orb3=11)then
jieguo<=3;
--点阵显示平局,重新开始
elseif(b3/=7andb3/=11)then
jieguo<=1;
clear<=1;--点阵显示甲胜,重新开始
elsenull;
endif;
endif;
elsif(b3=7orb3=11)then
jieguo<=2;
clear<=1;--点阵显示乙胜,重新开始
elsem1<=a3;
m2<=b3;
jieguo<=0;
endif;
when6=>
if(a3=m1andb3=m2)then
jieguo<=3;
--点阵显示平局,重新开始
elsif