北邮数字电路实验投骰子游戏.docx

上传人:b****5 文档编号:4400350 上传时间:2022-12-01 格式:DOCX 页数:26 大小:1,007.17KB
下载 相关 举报
北邮数字电路实验投骰子游戏.docx_第1页
第1页 / 共26页
北邮数字电路实验投骰子游戏.docx_第2页
第2页 / 共26页
北邮数字电路实验投骰子游戏.docx_第3页
第3页 / 共26页
北邮数字电路实验投骰子游戏.docx_第4页
第4页 / 共26页
北邮数字电路实验投骰子游戏.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

北邮数字电路实验投骰子游戏.docx

《北邮数字电路实验投骰子游戏.docx》由会员分享,可在线阅读,更多相关《北邮数字电路实验投骰子游戏.docx(26页珍藏版)》请在冰豆网上搜索。

北邮数字电路实验投骰子游戏.docx

北邮数字电路实验投骰子游戏

数电综合实验报告掷骰子游戏电路的设计与实现

 

姓名:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1