




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、北京邮电大学实 验 报 告实验名称:简易钢琴游戏学 院: 信息与通信工程学院 班 级: 2011211118 姓 名: _ # 学 号: _ 2011210# 日 期: 2013.11.9 一、 实验名称:简易钢琴游戏二、 实验任务要求:基本要求:1、用 88 点阵进行游戏显示。2、BTN1BTN7 七个按键模拟钢琴演奏时的“1 2 3 4 5 6 7”七个音符。点阵的第一列对应音符“1”,第二列对应音符“2”,依此类推,低中高音自定。3、光点在点阵第一行随机出现,逐点下落,下落速度为 0.2 秒 /行,如图1 所示。4、在光点下落到点阵最后一行之前的过程中,如果按下与该列点阵相应的音符键,该
2、光点消失,蜂鸣器演奏相应的音符声音,计分器加1。如果在光点下落到最后一行依然没有进行相应的按键操作,该光点消失,计分器不加分。计分器由数码管显示。5、每隔 1 秒在点阵的不同列的第一行出现一个光点,如图2 所示。6、游戏时间为 30 秒,数码管倒计时显示。提高要求:1、光点在点阵某行随机出现,然后逐点下落。2、下落速度随机变化。3、光点按照存储的乐曲顺序和速度的出现。4、自拟其它功能。三、 系统设计:1、设计思路:分频器把50MHZ的时钟频率分别分成12MHz和1MHZ两个时钟,用于分频产生声音、以及数码管和点阵的扫描。主进程进行按键(address)的判断,分别产生相应的toneindex(
3、音调)和grade(分数)为发声和分数显示做准备,同时countdown(倒计时)每一秒进行递减。将输出的grade和countdown分别进行除10和对10取模操作,进入数码管显示模块得到分数和倒计时显示;输出的toneindex进入生成音节的分频预置数的tonetaba。Tonetaba把分频预置数的码tone输入speaker来控制12MHZ的脉冲分频,得到所需要的音符频率。音调分频模块GradeCol0col7Toneindex输入按键检测模块倒计时模块分数模块点阵赋值模块数码管cat选通显示点阵逐行扫描显示蜂鸣器Countdown2、系统模块3、分块设计:l 主模块:当reset=1
4、时,进行复位。然后检测按键是否按下,不按下则不发声不加分;若是停止按键,则是停止发声。若有按键(address),则依次从点阵的最下一行开始检测按键是否正确(检测到第六行后应同时检测当前检测行的前五行为全0,以保证点阵上同时有两点时上面的一点不会被错误的消掉),按键正确则grade(得分)加分。每隔0.2秒点阵个各行赋值依次下移一行。Countdown(倒计时)每一秒减一,同时给点阵光点出现的初始位置赋一次值。将输出的grade和countdown分别进行除10和对10取模操作,分别对应其十位和个位。l 数码管显示模块:建立0-9十个数字相应的表,使用1M的时钟对输入的分数和倒计时分别扫描显示
5、(show)。l 点阵显示模块:使用1M时钟一次扫描点阵每一行的值,然后赋给col进行显示。l 蜂鸣器模块:将传入的toneindex建表(tonetable)依次转化为相应的分频预置数,然后把12M的时钟按分频预置数进行分频,再进行二分频以使声音更清晰。四、 仿真波形及波形分析1、1M分频:图示为一个50分频器,本实验中使用的是50M的输入时钟,则可以分成一个1M的时钟,同时还分了一个12M的时钟,这里未给出。2、按键转换按键转换模块,从图中我们可以看出,根据输入的按键(address)分别转化为相应的toneindex,为后续用12M的时钟分成相应的音调做准备。比如,address=”00
6、01000”时代表的是按btn4,则转换成”100”;当无按键的时候,即address=”0000000”时,toneindex=”000”蜂鸣器不发声。3、转换成音调分频预置数将输入的toneindex转化为相应的预置分频数,我们可以看到,当toneindex为111时,对应的预置分频数为17174、按预置数分频(1717)我们可以通过这个波形图检测当分频预置数为1717时,分频比为12*(2047-1717)*2=7920,则对应的音调为12M/7920等于1975HZ。对应高音7.5、数码管显示从图中我们可以看到数字0,对应的show为”1111110”,其他的1-9的数字都是依次对应s
7、how的值。同时,通过一个1M 的时钟进行扫描,使数码管无闪烁现象。6、点阵显示从图中我们可以看到,以1M的时钟逐行扫描点阵,使点阵看起来不会闪烁。用row来控制各行的选通。比如。Row=”11111011”时,只有第三行有显示。五、源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;Entity PinaoMaster isport(clk:in std_logic;-输入50M时钟address:in std_logic_vector(6 downto 0);-按键reset:in std_
8、logic;-复位开始beep:out std_logic;-蜂鸣器cat:out std_logic_vector(5 downto 0);-数码管选通row:out std_logic_vector(7 downto 0);-行选通col:out std_logic_vector(6 downto 0);-列赋值show:out std_logic_vector(6 downto 0);-数码管显示End entity PinaoMaster;Architecture one of PinaoMaster is signal clk1:std_logic; signal clk2:std_
9、logic; signal preclk:std_logic; signal fullspks:std_logic; signal scantmp:std_logic_vector(2 downto 0); signal Lighttmp:std_logic_vector(1 downto 0); signal toneindex:std_logic_vector(2 downto 0); signal countdown:integer range 0 to 30; signal grade:integer range 0 to 99; signal G1,G0,T1,T0:integer
10、range 0 to 9; signal tone:std_logic_vector(10 downto 0); signal col0:std_logic_vector(6 downto 0); signal col1:std_logic_vector(6 downto 0); signal col2:std_logic_vector(6 downto 0); signal col3:std_logic_vector(6 downto 0); signal col4:std_logic_vector(6 downto 0); signal col5:std_logic_vector(6 do
11、wnto 0); signal col6:std_logic_vector(6 downto 0); signal col7:std_logic_vector(6 downto 0); signal time1:std_logic_vector(6 downto 0); signal time0:std_logic_vector(6 downto 0); signal grade1:std_logic_vector(6 downto 0); signal grade0:std_logic_vector(6 downto 0);beginclk12M:process(clk)-12M分频,用于音
12、调的设置variable cnt:integer range 0 to 1; variable tmp:std_logic;beginif(clkevent and clk=1)thenif(reset=1)thencnt:=0; elsif cnt=1 then cnt:=0; tmp:=not tmp; else cnt:=cnt+1; end if;end if; clk1=24 then cnt:=0; tmp:=not tmp; else cnt:=cnt+1; end if;end if; clk2=tmp;end process clk1M;main:process(clk2,r
13、eset)-主进程,对按键进行判断,并产生与分数、倒计时以及蜂鸣器相关的变化variable cnt1: integer range 0 to 199999;-20万计数器将1M时钟做成0.2s的下降时间间隔variable cnt2: integer range 0 to 5;-将0.2s变成1s首行重新赋值间隔beginif(reset=1)then-复位cnt1:=0;cnt2:=0;grade=0;-分数初始化为0countdown=30;-倒计时初始化为30col0=0000000;col1=0000000;col2=0000000;col3=0000000;col4=0000000
14、;col5=0000000;col6=0000000;col7=0000000;-点阵初始化elsif(clk2event and clk2=1)thenif(cnt1=199999)then cnt1:=0; cnt2:=cnt2+1; col0=col1; col1=col2; col2=col3; col3=col4; col4=col5; col5=col6; col6=col7; col7=0000000;-0.2s逐行下降else cnt1:=cnt1+1; if(address=0000000)then-判断没有按键则不发音或者停止按键则停止发音toneindex=000; el
15、sif(address=col0)then-从点阵的做下面一行开始判断按键是否正确col0=0000000;-若按键正确,把该行置0gradetoneindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; elsif(address=col1)thencol1=0000000;gradetoneindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; elsif(address=
16、col2)thencol2=0000000;gradetoneindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; elsif(address=col3)thencol3=0000000;-第4行和第5行光点正确加2分gradetoneindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; elsif(address=col4)thencol4=0000000;gradeto
17、neindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; elsif(address=col5 and col0=0000000)then-判断按键与第六行对应且第一行全为0 col5=0000000; gradetoneindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; elsif(address=col6 and col1=0000000)then-判断按键与第七行对
18、应且第二行全为0 col6=0000000; gradetoneindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; elsif(address=col7 and col2=0000000)then-判断按键与第八行对应且第三行全为0col7=0000000;gradetoneindextoneindextoneindextoneindextoneindextoneindextoneindextoneindex=000;end case; end if; G1=grade/10;G0
19、=grade mod 10;-grade/10给分数的十位赋值,grade对10取模给分数的个位赋值end if;if(cnt2=5)then cnt2:=0; if (countdown/=0)then-判断倒计时不为0,则countdown继续减一 countdowncol7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7col7=0000000; end case;end if;T1=countdown/1
20、0;T0time1time1time1time1time1time1time1time1time1time1time1time0time0time0time0time0time0time0time0time0time0time0grade1grade1grade1grade1grade1grade1grade1grade1grade1grade1grade1grade0grade0grade0grade0grade0grade0grade0grade0grade0grade0grade0=1111110;end case;end process ShowGrade0;NixieLight1:p
21、rocess(clk2)-模为4的计数器beginif(clk2event and clk2=1)thenif(Lighttmp=11)thenLighttmp=00;elseLighttmpcat=011111;showcat=101111;showcat=111101;showcat=111110;showcat=111111;show=0000000;end case;end process NixieLight2;-点阵显示模块LatticeShow1:process(clk2)beginif(clk2event and clk2=1)thenif(scantmp=111)thensc
22、antmp=000;elsescantmprow=11111110;colrow=11111101;colrow=11111011;colrow=11110111;colrow=11101111;colrow=11011111;colrow=10111111;colrow=01111111;colrow=11111111;coltonetonetonetonetonetonetonetone=11 then cnt:=0; tmp:=not tmp; else cnt:=cnt+1; end if;end if; preclk=tmp;end process speaker1;speaker2
23、:process(preclk,tone) -按分频预置数分频 variable count11:std_logic_vector(10 downto 0);beginif preclkevent and preclk=1 thenif count11=16#7FF# then count11:=tone; fullspks=1; else count11:=count11+1; fullspks=0; end if; end if;end process speaker2;speaker3:process(fullspks) -二分频 variable count2:std_logic;be
24、ginif fullspksevent and fullspks=1 then count2:=not count2; if count2=1 thenif(tone=00000000000)then beep=0;else beep=1;end if; else beep=0; end if; end if;end process speaker3;end one;六、 功能实现用BTN1BTN7七个按键模拟钢琴的“1 2 3 4 5 6 7”七个音符。当某个按键按下时,若按键正确,则对应光点消失,数码管显示加分,蜂鸣器发相应的音,停止按键蜂鸣器发声停止。每秒在第一行出现一个光点,可以储存一
25、首音乐,光点每0.2秒下降一行。通过按键BTN0进行复位。数码管显示30秒倒计时。七、 元器件清单及资源利用情况元器件清单:计算机,实验板EPM1270T144C5资源利用情况:点阵模块,数码管模块,按键模块,蜂鸣器模块代码使用了494个逻辑门,资源使用率为39%。八、故障及问题分析1、 点阵上光点下降时,光点形成的是一个有5个连续光点的竖直长条,而不是单一的光点,检查发现在每0.2秒下降时没有把最上面一行赋值成全0,在相应位置加上col7=”0000000”语句之后,又出现了在不同进程给col7赋值的问题,于是我把每隔一秒给col7赋初值的代码段移到主进程里,解决了多重赋值的问题,点阵显示正确。2、 当有两个光点在点阵上显示时,按后面的光点对应的键,也会误判为正确,后面的光点消失,得分加分,蜂鸣器响,这与预期设计目标不符合。经检查之后,我在第6、7、8行检测按键的时候,分别同时对当前检测行相隔5行的行进行检测,若该行同时为全0才符合条件。这样之后就避免了发生上述错误。3、 在没有进行任何按键操作的时候
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林业财务工作计划要点-财务工作计划
- 武松人物介绍
- 城市综合体停车场车位租赁及夜间停车优惠合同
- 农产品典当金融服务合同范本
- 矿产资源开发补偿贸易贷款协议
- 北京金融资产股权转让及风险管理合同
- 智能交通园区场地合作与交通管理系统合同
- 节能环保自建房设计与施工总承包合同
- 和书有关的科学课件图片
- 房地产租赁收益分配与合同管理协议
- 上海市嘉定区联考2023-2024学年五年级下学期期中数学试题(含答案)
- 2025-2030中国精细磷化工行业市场现状供需分析及投资评估规划分析研究报告
- 我命由我不由天课件-2025年高三百日励志班会课
- 分娩期焦虑的产妇的护理
- 司法雇员考试题目及答案
- 部编版四年级语文《我们家的男子汉》教学设计及反思
- “共享平台广告获利”平台广告获利共享商业计划书
- 第18课《井冈翠竹》课件-2024-2025学年统编版语文七年级下册
- 水利洞内清淤方案范本
- 升压站电气施工方案
- 2024年全国高中数学联赛(浙江预赛)试题含参考答案
评论
0/150
提交评论