首页 北邮数电掷骰子实验报告

北邮数电掷骰子实验报告

举报
开通vip

北邮数电掷骰子实验报告数字电路与逻辑设计实验 题目:掷骰子游戏电路的设计与实现 学号:2012210554 姓名:孙进考 班级:2012211119 学院:信息与通信工程学院 日期:2014.11.10 一、 设计课题的任务要求 设计并实现一个掷骰子游戏电路。 基本要求: 1、电路可供甲乙二人游戏,游戏者甲使用的按键为BTN0,游戏者乙使用的按键为BTN1。 2、每按一次按键,代表掷一次骰子,可随机得到 1~6 范围内的两个数字。 3、甲乙按键产生的随机数字分别用数码管DISP0-DISP1、DISP2-DISP3 显示,并用DIS...

北邮数电掷骰子实验报告
数字电路与逻辑设计实验 题目:掷骰子游戏电路的设计与实现 学号:2012210554 姓名:孙进考 班级:2012211119 学院:信息与通信 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 学院 日期:2014.11.10 一、 设计课题的任务要求 设计并实现一个掷骰子游戏电路。 基本要求: 1、电路可供甲乙二人游戏,游戏者甲使用的按键为BTN0,游戏者乙使用的按键为BTN1。 2、每按一次按键,代 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 掷一次骰子,可随机得到 1~6 范围内的两个数字。 3、甲乙按键产生的随机数字分别用数码管DISP0-DISP1、DISP2-DISP3 显示,并用DISP7 显示比赛局数,比赛结束用8×8 点阵显示获胜方,并伴有声音效果。 4、具体游戏规则如下: (1) 第一局比赛,甲乙依次各按一次按键,按键所得两数之和为7 或11 者胜;若无人取胜,则进行第二局比赛; (2) 第二局比赛,甲乙每人各按一次按键,按键所得二数之和与第一局比赛相同者获胜,若无人获胜,则进行第三局比赛,重复进行步骤(2),直到出现胜者为止。 (3) 游戏局数最多进行六局。在第六局比赛时,若重复进行步骤(2)仍未出现胜者,以按键所得两数之和最大者为获胜方。 提高要求: 1、增加多人游戏的功能,数码管可分时记录显示每个游戏者的骰子点数。 2、点阵显示增加游戏开机动画、结束动画,并伴有乐曲播放。 3、自拟其它功能。 二、系统设计(包括设计思路、总体框图、分块设计) 1、整体设计思路 将整个游戏电路分为时钟分频模块、随机数产生模块、数码管显示模块、判断控制模块、点阵显示模块等五个模块。其中,时钟分频模块用于产生适合其他模块使用的时钟频率;随机数产生模块接收来自按键的信号,产生1-6的随机数,其中按键带有防抖功能;数码管显示产生的随机数和局数;判断控制模块用于判断胜负,并控制点阵显示;点阵显示模块用于显示胜利的一方。 2、系统框图 点阵显示模块 判断控制模块 随机数产生模块 3、分块设计 时钟分频模块 采用多级分频的方法分别产生点阵扫描需要的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信号。cat[5..0]和g[6..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.vhd library 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; begin p1:process(clkin)---分频到1MHz begin if clkin'event 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 clktmp1'event 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 clktmp2'event 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.333kHz begin if clktmp1'event 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)—分频到20hz begin if clktmp2'event 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.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity suijishu3 is port( 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_x'event 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_y'event 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_dou'event 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_dou'event 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 q4'event and q4='1' then--q4为甲按键防抖后输出信号 xx<=(x rem 6)+1;-- 产生第一位随机数 yy<=(y rem 6)+1;--产生第二位随机数 if ju=6 then--局数统计 ju<=1; else ju<=ju+1; end if;          end if; case xx is when 6 =>qout1<="0110";--译码输出 when 5 =>qout1<="0101"; when 4 =>qout1<="0100"; when 3 =>qout1<="0011"; when 2 =>qout1<="0010"; when 1 =>qout1<="0001"; when others=>qout1<="0001"; end case; case yy is when 6 =>qout2<="0110"; when 5 =>qout2<="0101"; when 4 =>qout2<="0100"; when 3 =>qout2<="0011"; when 2 =>qout2<="0010"; when 1 =>qout2<="0001"; when others=>qout2<="0001"; end case; case ju is when 6 =>qout5<="0110"; when 5 =>qout5<="0101"; when 4 =>qout5<="0100"; when 3 =>qout5<="0011"; when 2 =>qout5<="0010"; when 1 =>qout5<="0001"; when 0 =>qout5<="0000"; when others=>qout5<="0000"; end case; end process p4; p5:process(q8)--产生乙方的随机数 begin if q8'event and q8='1' then xx1<=(x rem 6)+1;        yy1<=(y rem 6)+1; end if; case xx1 is when 6 =>qout3<="0110"; when 5 =>qout3<="0101"; when 4 =>qout3<="0100"; when 3 =>qout3<="0011"; when 2 =>qout3<="0010"; when 1 =>qout3<="0001"; when others=>qout3<="0001"; end case; case yy1 is when 6 =>qout4<="0110"; when 5 =>qout4<="0101"; when 4 =>qout4<="0100"; when 3 =>qout4<="0011"; when 2 =>qout4<="0010"; when 1 =>qout4<="0001"; when others=>qout4<="0001"; end case; end process p5; end a; 3、数码管模块shumaguan.vhd library 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_shu'event and clk_shu='1')then  if tmpc = 4 then  tmpc<=0;  else      tmpc<=tmpc+1;  END IF;  END IF;  END PROCESS p1;      p2:PROCESS(tmpc)                --数码管选通轮流显示  BEGIN        case tmpc is    WHEN 0 => tmpn<=qin1;cat<="111110";                  WHEN 1 => tmpn<=qin2;cat<="111101";  WHEN 2 => tmpn<=qin3;cat<="111011"; 
本文档为【北邮数电掷骰子实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_633423
暂无简介~
格式:doc
大小:89KB
软件:Word
页数:23
分类:企业经营
上传时间:2019-05-14
浏览量:47