1、北邮数字电路实验投骰子游戏数电综合实验报告掷骰子游戏电路的设计与实现姓名:xxx班级:xxx学号:xxx目录数电综合实验报告掷骰子游戏电路的设计与实现 1一、 实验要求: 2基本要求: 2提高要求: 2二、 系统设计 2设计思路 2总体框图 2三、 仿真波形及波形分析 6四、 源程序 6五、 功能说明及资源利用情况 18功能说明 18资源利用情况 18六、 故障及问题分析 19七、 实验结果显示 20八、 总结和结论 21一、 实验要求:基本要求:1、 电路可供甲乙二人游戏,游戏者甲使用的按键是BTN0,游戏者乙使用的按键为BTN1。2、 每按一次按键,代表掷一次骰子,可随机得到16范围内的两
2、个数字。3、 甲乙按键产生的随机数字分别用数码管DISP0DISP1、DISP2DISP3显示,并用DISP7显示比赛局数,比赛结束用88点阵显示获胜方,并伴有声音效果。4、 具体游戏规则如下:(1) 第一局比赛,甲乙依次各按一次按键,按键所得两数之和为7或11者胜;若无人取胜,则进行第二局比赛; (2) 第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤(2),直到出现胜者为止。 (3) 游戏局数最多进行六局。在第六局比赛时,若重复进行步骤(2)仍未出现胜者,以按键所得两数之和最大者为获胜方。 提高要求:1、 增加多人游戏的功
3、能,数码管可分时记录显示每个游戏者的骰子点数。2、 点阵显示增加游戏开机动画、结束动画,并伴有乐曲播放。3、 自拟其它功能。二、 系统设计设计思路在设计该游戏时,我采用了自顶向下的设计方法,首先分析了这个掷骰子游戏的基本功能就是按照上述的游戏要求设计,然后看这个系统结构该怎么分解,会产生哪些系统模型和子模块,根据上述要求最终我决定将该系统分解成以下五个模块:随机数产生模块、按键赋值模块、数码管显示模块、状态判断模块、结果输出(点阵和蜂鸣器)模块,最后具体到各个模块该怎么实现,及代码的编写。总体框图具体框图见附加Visio文件注:框图中|表示并行程序1、 分块设计随机数产生与按键赋值模块状态判断
4、模块结果显示模块三、 仿真波形及波形分析 由上图波形可以看出程序已经实现了基本功能,但在某些部分会出现毛刺,不影响整体性能。四、 源程序-主程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity zhishaizi is port( - CLK:in std_logic; SG: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -段码 BT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0) ; -位码 - buttoin1: in std_logic;
5、 buttoin2: in std_logic; beep:out std_logic; row,lie1: out std_logic_vector(7 downto 0); end zhishaizi;architecture ab of zhishaizi is- type shu_zu is array (7 downto 0) of std_logic_vector(7 downto 0); constant kaiji:shu_zu:= ( (00100001), (00100010), (00100100), (00100100), (11111111), (00100100),
6、 (00100100), (11111111) );constant jia:shu_zu:= ( (00011000), (00011000), (00011000), (11111111), (10011001), (11111111), (10011001), (11111111) ); constant yi:shu_zu:= ( (11111110), (10000001), (00000010), (00000100), (00001000), (00010000), (00100000), (11111111) ); constant ping:shu_zu:= ( (00011
7、000), (00011000), (00011000), (11111111), (00111100), (01011010), (10011001), (11111111) ); constant jieshu:shu_zu:= ( (00001000), (00000100), (00000010), (11111111), (00000010), (00000100), (00001000), (00000000) ); - SIGNAL clk_tmp: STD_LOGIC; SIGNAL clk_tmpp: STD_LOGIC; signal temp:integer range
8、0 to 1999; signal tempp:integer range 0 to 1896; signal ab:INTEGER RANGE 0 TO 7; SIGNAL CNT6:INTEGER RANGE 0 TO 4; SIGNAL cn:integer range 1 to 6; SIGNAL cnn:integer range 1 to 6; signal a1,a2,b1,b2: INTEGER range 1 to 6; signal count: INTEGER range 1 to 6; signal a3,b3: INTEGER range 2 to 12; signa
9、l m1,m2: INTEGER range 1 to 12; signal A:INTEGER RANGE 1 TO 6; signal jieguo:INTEGER RANGE 0 TO 4; signal judge: std_logic; signal clear:integer range 0 to 1;begin -pp1:process(clk) -分频器1begin if clkevent and clk=1 then if temp=999 then temp=0; else temp=temp+1; end if;end if;end process pp1;pp2:pro
10、cess(temp)begin if temp=999 thenclk_tmp=1;elseclk_tmp=0;end if;end process pp2;p0p1:process(clk) -分频器2begin if clkevent and clk=1 then if tempp=896 then tempp=0; else tempp=tempp+1; end if;end if;end process p0p1;p0p2:process(tempp)begin if tempp=896 thenclk_tmpp=1;elseclk_tmpp=0;end if;end process
11、p0p2;p02:process(clk_tmp) -点阵的扫描信号 begin if(clk_tmpevent and clk_tmp=1)then ab=ab+1; if(ab=8)then ab-开机动画 case ab is when 0= lie1=kaiji(ab); row lie1=kaiji(ab); row lie1=kaiji(ab); row lie1=kaiji(ab); row lie1=kaiji(ab); row lie1=kaiji(ab); row lie1=kaiji(ab); row lie1=kaiji(ab); row-显示甲 case ab is
12、when 0= lie1=jia(ab); row lie1=jia(ab); row lie1=jia(ab); row lie1=jia(ab); row lie1=jia(ab); row lie1=jia(ab); row lie1=jia(ab); row lie1=jia(ab); row-显示乙 case ab is when 0= lie1=yi(ab); row lie1=yi(ab); row lie1=yi(ab); row lie1=yi(ab); row lie1=yi(ab); row lie1=yi(ab); row lie1=yi(ab); row lie1=y
13、i(ab); row-显示平 case ab is when 0= lie1=ping(ab); row lie1=ping(ab); row lie1=ping(ab); row lie1=ping(ab); row lie1=ping(ab); row lie1=ping(ab); row lie1=ping(ab); row lie1=ping(ab); row-显示箭头 case ab is when 0= lie1=jieshu(ab); row lie1=jieshu(ab); row lie1=jieshu(ab); row lie1=jieshu(ab); row lie1=j
14、ieshu(ab); row lie1=jieshu(ab); row lie1=jieshu(ab); row lie1=jieshu(ab); row=11111110; end case; end case; end process p0;P2:process(clk_tmp) -控制码位 BEGIN if(clk_tmpevent and clk_tmp=1)then if(CNT6=4)THEN CNT6=0; ELSE CNT6 BT = 011111 ; A BT = 101111 ; A BT = 111011 ; A BT = 111101 ; A BT = 111110 ;
15、 A NULL ; END CASE ; END PROCESS P1; P3:process(A) BEGIN CASE A IS -实现数码管的显示功能 WHEN 1 = SG SG SG SG SG SG = 1011111; END CASE ; END PROCESS P3; - 两个分频器分别产生两个随机数 p4:process(clk_tmp) begin if (clk_tmpevent and clk_tmp=1) then if cn=6 then cn=1; else cn=cn+1; end if; end if; end process p4; pp4:process
16、(clk_tmpp) begin if (clk_tmppevent and clk_tmpp=1) then if cnn=6 then cnn=1; else cnn=cnn+1; end if; end if; end process pp4;- 蜂鸣器p5:process(clk_tmp) begin if clear=1 then if clk=1 then beep=1after 5ns; else beep=0 after 5ns; end if; else null; end if; end process p5;- 当有按键按下时,根据按下的键取不同的值 p7p:proces
17、s(buttoin1,buttoin2) begin if(buttoin1=1 )then if judge=1 then a1=cn; a2=cnn; judge=0; end if; end if; if(buttoin2=1 )then if judge=0 then b1=cn; b2=cnn; judge=1; end if; end if; end process p7p; - p8:process(judge) begin if(judgeevent and judge=1) then if (count=6 ) then count=1; else count=count+1
18、; end if; end if; a3=a1+a2; b3=b1+b2; end process p8; -判断状态是第几局 p9:process(count) begin if(clear=1)then -如果清零信号为1则先置零 m1=1; -防止被上局的结果影响 m2=1; clear if(a3=7 or a3=11) then if( b3=7 or b3=11 )then jieguo=3; -点阵显示平局,重新开始 else if(b3/=7 and b3/=11) then jieguo=1; clear=1; -点阵显示甲胜,重新开始 else null; end if; end if; elsif(b3=7 or b3=11) then jieguo=2; clear=1; -点阵显示乙胜,重新开始 else m1=a3; m2=b3; jieguo if (a3=m1 and b3=m2) then jieguo=3; -点阵显示平局,重新开始 elsif
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1