北邮数电实验报告钢琴游戏.docx
- 文档编号:30757462
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:33
- 大小:319.82KB
北邮数电实验报告钢琴游戏.docx
《北邮数电实验报告钢琴游戏.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告钢琴游戏.docx(33页珍藏版)》请在冰豆网上搜索。
北邮数电实验报告钢琴游戏
北京邮电大学
数字电路与逻辑设计实验报告
实验名称:
简易钢琴游戏
院系:
电子工程学院
专业:
班级:
姓名:
学号:
班内序号:
一、实验任务及要求
任务:
设计制作一个简易钢琴游戏机。
基本要求:
1、用8*8点阵进行游戏显示。
2、BTN1~BTN7七个按键模拟钢琴演奏时的“1234567”七个音符。
点阵的第一列对应音符“1”,第二列对应音符“2”,依次类推,地中高音自定。
3、光点在点阵第一行随机出现,逐点下落,下落速度为0.2秒/行。
如下图:
4、在光点下落到点阵最后一行之前的过程中,如果按下与该列点阵相应的音符键,该光点消失,蜂鸣器演奏相应的音符声音,计分器加1。
如果在光点下落到最后一行依然没有进行相应的按键操作,该光点消失,计分器不加分。
计分器由数码管显示。
5、每隔1秒在点阵的不同列的第一行出现一个光点,如下图:
6、游戏时间为30秒,数码管倒计时显示。
二、系统设计
1、设计思路:
简易钢琴游戏主要分为五个单元模块和一个连接模块:
Divf:
分频模块。
分出1hz,5hz,440hz,5Mhz等用于控制光点的下落、随机数的产生、30秒倒计时、点阵和数码管的扫描及产生其他频率的信号。
Buzz:
蜂鸣器模块。
根据声音的不同频率,细化出对应“1234567”的七种频率,并与相应的按键对应。
Display:
数码管模块。
将6段数码管分为两部分,分别控制倒计时和计分,加以扫描和控制。
LED:
点阵模块。
控制光点的出现、随机数的产生、光点的换行,加以扫描和控制。
Main:
主控制模块。
将每个主要模块之间的输入输出通过数学关系联系到一起。
比如:
复位之后点阵和数码管都要重新启动;倒计时30秒结束后点阵关闭,计分器不再计分等。
Pianogame:
用COMPONENT代码将每个模块联系起来的顶层程序。
2、系统结构框图
3、点阵模块控制框图
4、数码管模块控制框图
5、模块间信息传递关系
6、系统控制模块流程图
7、状态转移图
三、仿真波形及波形分析
1、分频模块仿真:
分析:
在源代码中,分频系数高达50~500000,无法在仿真波形中体现出来。
故将源代码中的分频系数改为10,效果图如上,证明本程序的分频模块可以使用。
(440Hz的分频系数没有改动,故无法在截图中显示)
2、数码管模块仿真
分析:
clear用于复位,clk1hz用于倒计时,clk440hz用于扫描数码管,button为按键输入,point为计数,LCD_display_out中输出的数值是在数码管不同段位上显示“0~30”数字的表示方法。
可以看出,当时钟输入并且复位后,通过计数,在数码管上可以显示出不同的数字。
四、源程序
1、Divf:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdivfIS
PORT(
clear:
INSTD_LOGIC;
clk_in:
INSTD_LOGIC;
clk_1Hz,clk_5Hz,CLK_50WHZ,clk_440Hz:
OUTSTD_LOGIC
);
ENDdivf;
ARCHITECTUREbehaveOFdivfIS
signalclk1Hz,clk5Hz,CLK50WHZ:
STD_LOGIC;
SIGNALdiv_1hz:
INTEGERRANGE0TO499999;
SIGNALdiv_5hz:
INTEGERRANGE0TO99999;
SIGNALdiv_la:
INTEGERRANGE0TO1136;
SIGNALn1:
INTEGERRANGE0TO49;
SIGNALclk440Hz:
std_logic;
BEGIN
p1:
PROCESS(clear,clk_in)---------------先将25MHZ分为50MHZ
BEGIN
IFclear='1'THEN
n1<=0;
ELSIFclk_in'EVENTANDclk_in='1'THEN
IFn1=49THEN
n1<=0;
ELSE
n1<=n1+1;
ENDIF;
ENDIF;
ENDPROCESSp1;
p2:
PROCESS(n1)
BEGIN
IFclk_in'EVENTANDclk_in='1'THEN
IFn1<25THEN
CLK50WHZ<='0';
ELSE
CLK50WHZ<='1';
ENDIF;
endif;
ENDPROCESSp2;
p3:
PROCESS(clear,CLK50WHZ)-----------------------分出1HZ
BEGIN
IFclear='1'THEN
div_1hz<=0;
ELSIFCLK50WHZ'EVENTANDCLK50WHZ='1'THEN
IFdiv_1hz=499999THEN
div_1hz<=0;
ELSE
div_1hz<=div_1hz+1;
ENDIF;
ENDIF;
ENDPROCESSp3;
p4:
PROCESS(div_1hz)
BEGIN
IFCLK50WHZ'EVENTANDCLK50WHZ='1'THEN
IFdiv_1hz<249999THEN
clk1Hz<='0';
ELSE
clk1Hz<='1';
ENDIF;
endif;
ENDPROCESSp4;
p5:
PROCESS(clear,CLK50WHZ)-------------分出5HZ
BEGIN
IFclear='1'THEN
div_5hz<=0;
ELSIFCLK50WHZ'EVENTANDCLK50WHZ='1'THEN
IFdiv_5hz=99999THEN
div_5hz<=0;
ELSE
div_5hz<=div_5hz+1;
ENDIF;
ENDIF;
ENDPROCESSp5;
p6:
PROCESS(div_5hz)
BEGIN
IFCLK50WHZ'EVENTANDCLK50WHZ='1'THEN
IFdiv_5hz<49999THEN
clk5Hz<='0';
ELSE
clk5Hz<='1';
ENDIF;
endif;
ENDPROCESSp6;
p7:
PROCESS(clear,CLK50WHZ)-----------------440HZ
BEGIN
IFclear='1'THEN
div_la<=0;
ELSIFCLK50WHZ'EVENTANDCLK50WHZ='1'THEN
IFdiv_la=1136THEN
div_la<=0;
ELSE
div_la<=div_la+1;
ENDIF;
ENDIF;
ENDPROCESSp7;
p8:
PROCESS(div_la)
BEGIN
IFCLK50WHZ'EVENTANDCLK50WHZ='1'THEN
IFdiv_la<568THEN
clk440Hz<='0';
ELSE
clk440Hz<='1';
ENDIF;
endif;
ENDPROCESSp8;
CLK_1HZ<=clk1Hz;-----------------------将中间量赋给最终值
CLK_5HZ<=clk5Hz;
CLK_50WHZ<=CLK50WHZ;
CLK_440hz<=clk440HZ;
endbehave;
2、Buzz:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbuzzIS
PORT(button:
INSTD_LOGIC_VECTOR(6DOWNTO0);
--clear:
INSTD_LOGIC;
clk_in:
INSTD_LOGIC;
BEEP:
OUTstd_logic
);
ENDbuzz;
architecturebehaveofbuzzis------------------产生“1234567”七个音符
signalload_in:
integerrange0to47777;---500hz
signalmusic_out:
integerrange0to47777;
signalclk_tmp:
std_logic;
begin
p1:
process(clk_in)----------将分频系数转为频率
begin
ifclk_in'eventandclk_in='1'then
ifload_in=music_outthen
load_in<=0;
clk_tmp<=notclk_tmp;
else
load_in<=load_in+1;
endif;
endif;
endprocessp1;
p2:
process(button)------------将七个分频系数赋给中间量
begin
casebuttonis
when"1000000"=>music_out<=45577;--95554;
when"0100000"=>music_out<=42564;--85129;
when"0010000"=>music_out<=37921;--75843;
when"0001000"=>music_out<=35793;--71586;
when"0000100"=>music_out<=31888;--63777;
when"0000010"=>music_out<=28409;--56818;
when"0000001"=>music_out<=25309;--50619;
whenothers=>music_out<=0;
endcase;
endprocessp2;
BEEP<=clk_tmp;--------输出
end;
3、Display:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdisplayIS-----------------数码管显示与控制模块
PORT(button:
INSTD_LOGIC_VECTOR(6DOWNTO0);
clear:
INSTD_LOGIC;
clk_in:
INSTD_LOGIC;
point:
INintegerrange0to30;
LCD_display_out:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
clk440Hz:
instd_logic;
cat_out:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
clk1Hz:
inSTD_LOGIC
);
ENDdisplay;
ARCHITECTUREbehaveOFdisplayIS
SIGNALtime_counting:
integerrange0to30;
signalcount_point:
integerrange0to150;
signalLCD_number:
integerrange0to3;
SIGNALcat:
STD_LOGIC_VECTOR(5DOWNTO0);
signalLCD_display:
STD_LOGIC_VECTOR(6DOWNTO0);
signalLCD_display1:
std_logic_vector(6downto0);
signalLCD_display2:
std_logic_vector(6downto0);
signalLCD_display3:
std_logic_vector(6downto0);
signalLCD_display4:
std_logic_vector(6downto0);
BEGIN
p1:
process(clk1Hz,clear)----------每秒产生倒计时数
BEGIN
ifclear='1'thentime_counting<=0;
elsif(clk1Hz'EVENTANDclk1Hz='1')THEN
iftime_counting=30thentime_counting<=30;
elsetime_counting<=time_counting+1;
endif;
ELSENULL;
endif;
endprocessp1;
p2:
process(time_counting)---倒计时从30到0的表示
begin
casetime_countingis
when30=>LCD_display3<="1111110";LCD_display4<="1111110";
when29=>LCD_display3<="1111110";LCD_display4<="0110000";
when28=>LCD_display3<="1111110";LCD_display4<="1101101";
when27=>LCD_display3<="1111110";LCD_display4<="1111001";
when26=>LCD_display3<="1111110";LCD_display4<="0110011";
when25=>LCD_display3<="1111110";LCD_display4<="1011011";
when24=>LCD_display3<="1111110";LCD_display4<="1011111";
when23=>LCD_display3<="1111110";LCD_display4<="1110000";
when22=>LCD_display3<="1111110";LCD_display4<="1111111";
when21=>LCD_display3<="1111110";LCD_display4<="1111011";
when20=>LCD_display3<="0110000";LCD_display4<="1111110";
when19=>LCD_display3<="0110000";LCD_display4<="0110000";
when18=>LCD_display3<="0110000";LCD_display4<="1101101";
when17=>LCD_display3<="0110000";LCD_display4<="1111001";
when16=>LCD_display3<="0110000";LCD_display4<="0110011";
when15=>LCD_display3<="0110000";LCD_display4<="1011011";
when14=>LCD_display3<="0110000";LCD_display4<="1011111";
when13=>LCD_display3<="0110000";LCD_display4<="1110000";
when12=>LCD_display3<="0110000";LCD_display4<="1111111";
when11=>LCD_display3<="0110000";LCD_display4<="1111011";
when10=>LCD_display3<="1101101";LCD_display4<="1111110";
when9=>LCD_display3<="1101101";LCD_display4<="0110000";
when8=>LCD_display3<="1101101";LCD_display4<="1101101";
when7=>LCD_display3<="1101101";LCD_display4<="1111001";
when6=>LCD_display3<="1101101";LCD_display4<="0110011";
when5=>LCD_display3<="1101101";LCD_display4<="1011011";
when4=>LCD_display3<="1101101";LCD_display4<="1011111";
when3=>LCD_display3<="1101101";LCD_display4<="1110000";
when2=>LCD_display3<="1101101";LCD_display4<="1111111";
when1=>LCD_display3<="1101101";LCD_display4<="1111011";
when0=>LCD_display3<="1111001";LCD_display4<="1111110";
whenothers=>LCD_display1<="1111110";LCD_display2<="1111110";
endcase;
ENDPROCESSp2;
p3:
process(point)----将30个数显示到数码管的不同段上
BEGIN
casepointis
when0=>LCD_display1<="1111110";LCD_display2<="1111110";
when1=>LCD_display1<="1111110";LCD_display2<="0110000";
when2=>LCD_display1<="1111110";LCD_display2<="1101101";
when3=>LCD_display1<="1111110";LCD_display2<="1111001";
when4=>LCD_display1<="1111110";LCD_display2<="0110011";
when5=>LCD_display1<="1111110";LCD_display2<="1011011";
when6=>LCD_display1<="1111110";LCD_display2<="1011111";
when7=>LCD_display1<="1111110";LCD_display2<="1110000";
when8=>LCD_display1<="1111110";LCD_display2<="1111111";
when9=>LCD_display1<="1111110";LCD_display2<="1111011";
when10=>LCD_display1<="0110000";LCD_display2<="1111110";
when11=>LCD_display1<="0110000";LCD_display2<="0110000";
when12=>LCD_display1<="0110000";LCD_display2<="1101101";
when13=>LCD_display1<="0110000";LCD_display2<="1111001";
when14=>LCD_display1<="0110000";LCD_display2<="0110011";
when15=>LCD_display1<="0110000";LCD_display2<="1011011";
when16=>LCD_display1<="0110000";LCD_display2<="1011111";
when17=>LCD_display1<="0110000";LCD_display2<="1110000";
when18=>LCD_display1<="0110000";LCD_display2<="1111111";
when19=>LCD_display1<="0110000";LCD_display2<="1111011";
when20=>LCD_display1<="1101101";LCD_display2<="1111110";
when21=>LCD_display1<="1101101";LCD_display2<="0110000";
when22=>LCD_display1<="1101101";LCD_display2<="1101101";
when23=>LCD_display1<="1101101";LCD_display2<="1111001";
when24=>LCD_display1<="1101101";LCD_display2<="0110011";
when25=>LCD_display1<="1101101";LCD_display2<="1011011";
when26=>LCD_display1<="1101101";LCD_display2<="1011111";
when27=>LCD_display1<="1101101";LCD_display2<="1110000";
when28=>LCD_display1<="1101101";LCD_display2<="1111111";
when29=>LCD_display1<="1101101";LCD_display2<="1111011";
when30=>LCD_display1<="1111001";LCD_display2<="1111110";
whenothers=>NULL;
endcase;
ENDPROCESSp3;
p4:
process(clk440Hz,clear)----------------------扫描数码管
BEGIN
IFclear='1'THENLCD_number<=0;
ELSIFcl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮数电 实验 报告 钢琴 游戏