掷骰子游戏电路的设计与实现实验报告.docx

上传人:wux****ua 文档编号:9364128 上传时间:2020-04-05 格式:DOCX 页数:33 大小:475.63KB
返回 下载 相关 举报
掷骰子游戏电路的设计与实现实验报告.docx_第1页
第1页 / 共33页
掷骰子游戏电路的设计与实现实验报告.docx_第2页
第2页 / 共33页
掷骰子游戏电路的设计与实现实验报告.docx_第3页
第3页 / 共33页
点击查看更多>>
资源描述
数字电路与逻辑设计实验题目:掷骰子游戏电路的设计与实现学号:2012210554姓名:孙进考班级:2012211119学院:信息与通信工程学院日期:2014.11.10一、 设计课题的任务要求设计并实现一个掷骰子游戏电路。基本要求:1、电路可供甲乙二人游戏,游戏者甲使用的按键为BTN0,游戏者乙使用的按键为BTN1。2、每按一次按键,代表掷一次骰子,可随机得到 16 范围内的两个数字。3、甲乙按键产生的随机数字分别用数码管DISP0-DISP1、DISP2-DISP3 显示,并用DISP7 显示比赛局数,比赛结束用88 点阵显示获胜方,并伴有声音效果。4、具体游戏规则如下:(1) 第一局比赛,甲乙依次各按一次按键,按键所得两数之和为7 或11 者胜;若无人取胜,则进行第二局比赛;(2) 第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤(2),直到出现胜者为止。(3) 游戏局数最多进行六局。在第六局比赛时,若重复进行步骤(2)仍未出现胜者,以按键所得两数之和最大者为获胜方。提高要求:1、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。2、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播放。3、自拟其它功能。二、系统设计(包括设计思路、总体框图、分块设计)1、整体设计思路将整个游戏电路分为时钟分频模块、随机数产生模块、数码管显示模块、判断控制模块、点阵显示模块等五个模块。其中,时钟分频模块用于产生适合其他模块使用的时钟频率;随机数产生模块接收来自按键的信号,产生1-6的随机数,其中按键带有防抖功能;数码管显示产生的随机数和局数;判断控制模块用于判断胜负,并控制点阵显示;点阵显示模块用于显示胜利的一方。2、系统框图时钟分频模块数码管显示模块点阵显示模块判断控制模块随机数产生模块Btn0按键防抖 Btn1按键防抖reset3、分块设计时钟分频模块采用多级分频的方法分别产生点阵扫描需要的1MHz的clk_dian频率、数码管扫描的10KHz的clk_shu频率、产生第一位随机数的2KHz的clk_x频率、产生第二位随机数的3.3kHz的clk_y频率和用于防抖的20hz的clk_dou频率。随机数产生模块随机数产生模块用于产生随机数和局数计数。reset用于使局数归零,重新开始游戏。btn0用于作为产生甲方随机数的信号,btn1用于作为产生乙方随机数的信号。clk_x和clk_y是用来产生两位随机数的时钟信号。clk_dou为防抖时钟。qout1-2是甲随机数输出信号,qout3-4是乙随机数输出信号,qout5是局数信号。数码管显示模块数码管显示模块用于显示产生的随机数和局数。clk_shu接收10KHz的时钟频率。qin1-5分别接收随机数产生模块的qout1-5信号。cat5.0和g6.0控制数码管的位选和段选信号。控制判断模块控制判断模块用于判断胜负并控制点阵显示。clk_dou为防抖时钟频率,btn1为乙方按完按键的信号,jia1-2和yi1-2为甲乙方的随机数,ju为比赛局数。V是胜负结果,用于控制点阵显示。点阵显示模块 点阵显示模块用于显示胜利的一方。clkin接1MHz的时钟频率,v是胜负结果。beep是蜂鸣器输出信号,当有一方胜利的时候就会输出高电平信号;row和col分别是点阵的行输入和列输入。三、 仿真波形及波形分析分频模块由于分频比例太高,仿真到1s需要花费大量时间,故只仿真到20ms,可观察其中的clk_x和clk_y信号。随机数模块如图所示,当btn0被按下,经过防抖测试之后,产生随机数1和4,btn1被按下,经过防抖测试之后,产生随机数3和6,reset拨上之后局数归零,重新开始(圆角方形所示)。数码管显示模块如图所示,圆圈内为位选输出信号,其中cat4数码管没有使用。方框内为段选输出信号,以输出1和5为例,显示正确,其中的毛刺可以忽略,不影响显示效果。判断控制模块如图,仅以第一局为例,设置甲方为5+2=7,乙方为1+1=2,如方框内所示;btn1下降沿触发比较,v的结果为01,即甲方获胜,如圆圈内所示,仿真结果正确。点阵显示模块如图,以显示甲为例,输入为v=01,行输出和列输出显示结果为汉字甲,蜂鸣器输出beep=1,符合预设结果。四、 源程序分频器模块fenpinqi.vhdlibrary ieee;use ieee.std_logic_1164.all;entity fenpinqi is port( clkin:in std_logic; -时钟信号输入 clk_dian,clk_shu,clk_x,clk_y,clk_dou:out std_logic); -时钟信号输出end fenpinqi;architecture a of fenpinqi is signal tmp1:integer range 0 to 24; signal tmp2:integer range 0 to 49; signal tmp3:integer range 0 to 4; signal tmp4:integer range 0 to 149; signal tmp5:integer range 0 to 499; signal clktmp1:std_logic; signal clktmp2:std_logic; signal clktmp3:std_logic; signal clktmp4:std_logic; signal clktmp5:std_logic; beginp1:process(clkin)-分频到1MHz begin if clkinevent and clkin=1 then if tmp1=24 then tmp1=0; clktmp1=not clktmp1; else tmp1=tmp1+1; end if; end if;end process p1;p2:process(clktmp1)-二级分频,分频到10kHz begin if clktmp1event and clktmp1=1 then if tmp2=49 then tmp2=0; clktmp2=not clktmp2; else tmp2=tmp2+1; end if; end if;end process p2;p3:process(clktmp2)-分频到1kHz begin if clktmp2event and clktmp2=1 then if tmp3=4 then tmp3=0; clktmp3=not clktmp3; else tmp3=tmp3+1; end if; end if;end process p3;p4:process(clktmp1)-分频到3.333kHzbegin if clktmp1event and clktmp1=1 then if tmp4=149 then tmp4=0; clktmp4=not clktmp4; else tmp4=tmp4+1; end if; end if;end process p4;p5:process(clktmp2)分频到20hzbegin if clktmp2event and clktmp2=1 then if tmp5=499 then tmp5=0; clktmp5=not clktmp5; else tmp5=tmp5+1; end if; end if;end process p5;clk_dian=clktmp1;-点阵扫描频率clk_shu=clktmp2;-数码管扫描频率clk_x=clktmp3;-产生第一位随机数频率clk_y=clktmp4;-第二伪随机数频率clk_dou=clktmp5;-防抖扫描频率end a;2、随机数模块 suijishu3.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all; entity suijishu3 isport( reset:in std_logic;-复位信号 btn0:in std_logic;-甲按键信号 btn1:in std_logic;-乙按键信号 clk_x:in std_logic;-第一位随机数频率 clk_y:in std_logic;-第二位随机数频率 clk_dou:in std_logic;-防抖频率 qout1: out std_logic_vector(3 downto 0);-甲第一位随机数输出 qout2: out std_logic_vector(3 downto 0);-甲第二位随机数输出 qout3: out std_logic_vector(3 downto 0);-乙第一位随机数输出 qout4: out std_logic_vector(3 downto 0);-乙第二位随机数输出 qout5: out std_logic_vector(3 downto 0);-局数输出end suijishu3;architecture a of suijishu3 is signal q5,q6,q7,q8:std_logic; signal q1,q2,q3,q4:std_logic; signal x:integer range 0 to 100; signal y:integer range 100 to 200; signal xx:integer range 0 to 6; signal yy:integer range 0 to 6; signal xx1:integer range 0 to 6; signal yy1:integer range 0 to 6; signal ju:integer range 0 to 6;begin p1:process(clk_x,clk_y) begin if clk_xevent and clk_x=1 then-利用clk_x从0到100计数 if x=100 then x=0; else x=x+1; end if; end if; if clk_yevent and clk_y=1 then-利用clk_x从100到200计数 if y=200 then y=100; else y=y+1; end if; end if; end process p1; p2:process(btn0,clk_dou)-btn0键防抖 begin if clk_douevent and clk_dou=1 then q3=q2; q2=q1; q1=btn0; q4=q1 and q2 and q3;-经过三个防抖信号周期(1.5ms),q4变为1,作为按键信号输出 end if;end process p2;p3:process(btn1,clk_dou)-btn1键防抖 begin if clk_douevent and clk_dou=1 then q7=q6; q6=q5; q5=btn1; q8=q5 and q6 and q7; end if;end process p3; p4:process(q4,reset) begin if reset=1 then-如果复位信号为1,局数归零 ju=0; elsif q4event and q4=1 then-q4为甲按键防抖后输出信号 xx=(x rem 6)+1;- 产生第一位随机数 yy=(y rem 6)+1;-产生第二位随机数 if ju=6 then-局数统计 ju=1; else juqout1qout1qout1qout1qout1qout1qout1qout2qout2qout2qout2qout2qout2qout2qout5qout5qout5qout5qout5qout5qout5qout5=0000; end case; end process p4; p5:process(q8)-产生乙方的随机数 begin if q8event and q8=1 then xx1=(x rem 6)+1; yy1qout3qout3qout3qout3qout3qout3qout3qout4qout4qout4qout4qout4qout4qout4=0001; end case;end process p5;end a;3、数码管模块shumaguan.vhdlibrary ieee;use ieee.std_logic_1164.all;ENTITY shumaguan IS PORT( clk_shu:in std_logic; -数码管扫描频率 qin1,qin2,qin3,qin4,qin5:IN STD_LOGIC_VECTOR(3 DOWNTO 0);-随机数输入信号 g:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);-段选输出信号 cat:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); -位选输出信号 END shumaguan; ARCHITECTURE a OF shumaguan IS SIGNAL tmpg:STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL tmpn:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL tmpc:INTEGER RANGE 0 TO 4; BEGIN p1:PROCESS(clk_shu) -0到4计数器 BEGIN if(clk_shuevent and clk_shu=1)then if tmpc = 4 then tmpc=0; else tmpc tmpn=qin1;cat tmpn=qin2;cat tmpn=qin3;cat tmpn=qin4;cat tmpn=qin5;cat tmpg tmpg tmpg tmpg tmpg tmpg tmpg tmpg=0000000; END CASE; END PROCESS p3;g=tmpg; END a;4、控制判断模块control3.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control3 is port( clk_dou:in std_logic;-防抖频率 btn1:in std_logic;-乙按键信号 jia1:in std_logic_vector(3 downto 0); jia2:in std_logic_vector(3 downto 0); yi1:in std_logic_vector(3 downto 0); yi2:in std_logic_vector(3 downto 0);-甲乙随机数 ju:in std_logic_vector(3 downto 0);-局数 v:out std_logic_vector(1 downto 0);-输出end control3;architecture a of control3 is signal q11,q12,q13,q14:std_logic; signal jia:std_logic_vector(3 downto 0); signal yi: std_logic_vector(3 downto 0); signal jia_temp:std_logic_vector(3 downto 0); signal yi_temp:std_logic_vector(3 downto 0); signal v_temp:std_logic_vector(1 downto 0);beginp1:process(clk_dou,btn1)-乙按键防抖 begin if clk_douevent and clk_dou=1 then q13=q12; q12=q11; q11=btn1; q14=q11 and q12 and q13; end if;end process p1; jia=jia1 + jia2;-甲两位随机数相加 yi= yi1+ yi2; -乙两位随机数相加process(q14,jia,yi,ju) begin if q14event and q14=0then -乙按键的下降沿触发 if ju=0001 then-判断局数 jia_temp=jia; yi_temp=yi;-如果是第一局,将甲乙结果寄存 if ( jia = 0111or jia=1011 ) and (yi/=0111 and yi/=1011)then-甲胜利 v_temp=01; elsif(jia/=0111 and jia/=1011) and (yi=0111 or yi=1011)then-乙胜利 v_temp=10; else v_tempyi)then v_temp=01; elsif(jiayi)then v_temp=10; else v_temp=11; end if; else-第二到第五局 if(jia=jia_temp)and(yi/=yi_temp)then v_temp=01; elsif(jia/=jia_temp)and(yi=yi_temp)then v_temp=10; else v_temp=11; end if; end if; end if; end process; v=v_temp;end a;5、点阵模块dianzhen.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;ENTITY dianzhen is PORT( clkin: IN STD_LOGIC;-扫描时钟 beep:out std_logic; -蜂鸣器输出 v: IN STD_LOGIC_vector(1 downto 0);-控制输入 row: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -行 col: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -列 END dianzhen; ARCHITECTURE a OF dianzhen IS signal tmp:integer range 0 to 7; SIGNAL tmp_row:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL tmp_col:STD_LOGIC_VECTOR(7 DOWNTO 0); beginp1:process(clkin)-0-7计数器 begin if clkinevent and clkin=1 then if tmp=7 then tmp=0; else tmptmp_col=01111111;tmp_rowtmp_col=10111111;tmp_rowtmp_col=11011111;tmp_rowtmp_col=11101111;tmp_rowtmp_col=11110111;tmp_rowtmp_col=11111011;tmp_rowtmp_col=11111101;tmp_rowtmp_col=11111110;tmp_rowtmp_col=01111111;tmp_rowtmp_col=10111111;tmp_rowtmp_col=11011111;tmp_rowtmp_col=11101111;tmp_rowtmp_col=11110111;tmp_rowtmp_col=11111011;tmp_rowtmp_col=11111101;tmp_rowtmp_col=11111110;tmp_row=00000110; end case; else tmp_col=11111111; -不显示 end if; end process p2; p3:process(v) begin if v=10 or v=01then beep=1;-有人获胜,输出高电平,蜂鸣器发声 else beep=0; end if; end process p3; row=tmp_col; col=tmp_row;end a;五、 功能说明及资源利用情况实际电路框图:功能说明:事先约定,甲方先按按键,乙方后按。当程序初始化之后,在clk_x时钟下,xx、xx1开始计数。在clk_y时钟下yy、yy1开始计数,如果甲按下按键btn0,在btn0的上升沿触发下,xx和yy同时对6取余之后结果加1,产生两个1-6的随机数,由于clk-x和clk-y频率不同,以及甲按键按下的时间是随机的,于是产生的两个数是随机数,显示在数码管disp0-1上,同时局数加1,显示在数码管disp5上,标志新一局开始;然后乙按下按键btn1,产生两个随机数,显示在数码管disp2-3上;同时,在乙按键btn1的下降沿触发之下,开始比较,胜负结果显示在点阵上。期间如果遇到复位信号reset,则局数归零,重新开始游戏。资源利用情况:注:工程名字为shumaguanceshi5,测试时各部分分别调试,最后选用了一个已存在工程整体调试,未改名。六、 故障及问题分析1、 产生的两个随机数是相同的。原因:计数频率相同。解决方法:clk-x改为2kHz,clk-y改为3.333kHz,x计数改为0-100,y计数改为100-200,成功解决问题。2、 产生随机数,开始时是xy分别除以7取余,产生0-6的随机数,将0调整为1,导致1的概率略大。解决方法:xy分别除以6取余,然后结果加1,这样产生1-6的概率相同,接近于纯随机数。3、 点阵显示的图形一片模糊,虽然能够看出状态间确实有切换,但分辨不出显示的图形,检查后发现是下载时点阵扫描的行和列下载反了,改正后就可显示汉字,但是显示方向略有问题,不过,能正常看出获胜一方,故没有进一步改正。4、 比较判断时总是显示上一局结果。经过老师指导,得知是时钟赋值时有时延,故比较错误。解决方法:将jia1与jia2相加和yi1与yi2相加的命令放在时钟之外,这样只要jia1-2和yi1-2有变化就会相加,不需要时钟,故不存在时延问题。七、总结和结论这次数电综合实验进行的不是很顺利,主要是上学期的基础没有打好,对知识的理解没有深入,导致了很多错误的发生,比如不能在不同时钟下对同一个信号赋值和同一个if下的判断条件必须为同一种。在这一过程中,我对vhdl语言的理解也更加的深入,解决了许多理论课上半懂不懂的问题,为今后从事相关的开发奠定了基础。同时,这次实验提高了我的逻辑思考能力,弥补了理论课学习上的不足,这也将为我学习其他课程产生帮助。
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!