SOPC乐曲演奏大作业.docx
《SOPC乐曲演奏大作业.docx》由会员分享,可在线阅读,更多相关《SOPC乐曲演奏大作业.docx(42页珍藏版)》请在冰豆网上搜索。
![SOPC乐曲演奏大作业.docx](https://file1.bdocx.com/fileroot1/2023-1/27/1dc61915-8812-40f8-ac67-735638ba8268/1dc61915-8812-40f8-ac67-735638ba82681.gif)
SOPC乐曲演奏大作业
综合实验基于NiosII的乐曲演奏设计
单位:
班级:
组员:
指导老师:
首都师范大学
2012年5月
一.设计概述3
二.设计要求3
三.设计方案(总体设计原理、软件设计、硬件设计)3
3.1总体设计原理3
3.2软件设计流程图4
3.3硬件设计8
四.实验环境9
五.软件实验步骤9
六.头文件11
6.1music.h11
6.2LCD.h19
七.实验结果及分析23
八.总结及遇到问题24
九.思考题:
24
一.设计概述
本设计基于SOPCbuilder和NiosII8.0的乐曲演奏,使用蜂鸣器进行播放歌曲,本设计编写多首歌曲可以循环播放,并在液晶屏上显示歌曲名称和切换名称。
实验前准备:
1、该实验需要使用七个模块组中的第七个功能单元,所以三个拨码开关处于“处于“110”时,即MODEL_SEL2和MODEL_SEL3拨下处于“OFF”状态,MODEL_SEL1拨下处于“ON”时,选择该模块。
2、拨码开关MODEL_SEL5-8全置于“ON”状态,即MODEL_SEL5-8拨下处于“ON”状态时通过USBBLASTER接口下载。
当全部拨下处于“OFF”时可使用开发平台上LAB_JTAG_PS_AS接口下载或者核心开发板上JTAG接口下载。
这里用户可根据自己所用的下载线来选择适当的下载方式和相应的MODEL_SEL5-8的状态。
二.设计要求
通过使用PWM对交流蜂鸣器进行控制,实现多首乐曲(6首)的播放。
实现如下功能:
1.歌曲播放
2.暂停功能
3.多首歌曲的切换(6首)
其他扩展要求:
在液晶屏上显示歌曲的名称,以及上下切换字符(before,after)
三.设计方案(总体设计原理、软件设计、硬件设计)
3.1总体设计原理
实验箱的蜂鸣器是交流蜂鸣器,在BZSP输入一定频率的脉冲时,蜂鸣器蜂鸣,改变输入频率可以改变蜂鸣器的响声。
因此可以利用一个PWM来控制BZSP,通过改变PWM的频率来得到不同的声响,以此来播放音乐。
PWM设计说明
PWM输出一个占空比可调的方波。
当一个周期11个时钟,高电平输出7个时钟时的PWM输出波形如下图所示。
图1PWM输出波形图
表一内部寄存器:
寄存器名
地址偏移量
访问属性
描述
clock_divide
00
读/写
用来设定PWM输出周期的时钟数
duty_cycle
01
读/写
用来设定一个周期内PWM输出低电平的时钟个数
enable
10
读/写
使能和关闭PWM输出,为1时使能PWM输出
保留
11
-
3.2软件设计流程图
图2程序流程框图
首先,判断暂停键是否按下,如果没有,则播放歌曲,如果按下来了暂停键,就执行暂停功能。
暂停后判断播放键有没有按下,如果按下了播放键,则在断点的地方接着播放歌曲,
如果没有,则一直暂停到播放按键按下。
主程序代码:
6首歌曲播放,暂停,及切换上一首、切换下一首同时显示歌名和play、stop、next、before:
上下首歌切换:
图3程序
3.3硬件设计
图4硬件图
四.实验环境
硬件:
PC机
GX-SOC/SOPC-DEV-LABPLATFORM创新开发实验平台
GX-SOPC-EP2C35-M672核心板
软件:
QuartusII8.0
NiosII8.0
五.软件实验步骤
1、.把altera_avalon_pwm(IP核)拷贝到自己的工程文件夹目录下,
2.在主菜单打开Tools->SOPCBuiler
图5生成PWM核
3.重新命名为bzsp,点击鼠标右键,进行自动分配Addressess和IRQ,点击Generate
图5对PWM核重命名
4.生成成功以后回到QuartusII界面软件中必须替换更新:
在.bdf鼠标右键单击空白处,单击UpdateSymbolorBlock…,即可。
5.在NIOSIIIDE软件环境中点击New->NiosIIC/C++Application,建立一个工程
6.在SOPCBuilderSystemPTFFile选择NIOS2.ptf,C/C++的应用工程名Name重命名,点击Next
7.选中Createanewsystemlibrarynamed,点击Finish.
8.建立music.h文件和LCD.h头文件
9.编译工程
10.build成功后下载硬件
11.运行RUN
六.头文件
6.1music.h
#ifndef_MUSIC_H
#define_MUSIC_H
#include"system.h"
//rhythm:
quarternoteasameter//持续时间的长短
#defineRHYTHM36
#define_1RHYTHM*4//note
#define_1dRHYTHM*6//dottednote
#define_2RHYTHM*2//halfnote
#define_2dRHYTHM*3//dottedhalfnote
#define_4RHYTHM*1//quarternote
#define_4dRHYTHM*3/2//dottedquarternote
#define_8RHYTHM*1/2//eighthnote
#define_8dRHYTHM*3/4//dottedeighthnote
#define_16RHYTHM*1/4//sixteenthnote
#define_16dRHYTHM*3/8//dottedsixteenthnote
#define_32RHYTHM*1/8//thirty-secondnote
//低音
#define_1DO(ALT_CPU_FREQ/131)
#define_1DOr(ALT_CPU_FREQ/139)
#define_1RE(ALT_CPU_FREQ/147)
#define_1REr(ALT_CPU_FREQ/155)
#define_1MI(ALT_CPU_FREQ/165)
#define_1FA(ALT_CPU_FREQ/175)
#define_1FAr(ALT_CPU_FREQ/185)
#define_1SOL(ALT_CPU_FREQ/196)
#define_1SOLr(ALT_CPU_FREQ/207)
#define_1LA(ALT_CPU_FREQ/220)
#define_1LAr(ALT_CPU_FREQ/233)
#define_1SI(ALT_CPU_FREQ/247)
//中音
#define_DO(ALT_CPU_FREQ/262)
#define_DOr(ALT_CPU_FREQ/277)
#define_RE(ALT_CPU_FREQ/294)
#define_REr(ALT_CPU_FREQ/311)
#define_MI(ALT_CPU_FREQ/330)
#define_FA(ALT_CPU_FREQ/349)
#define_FAr(ALT_CPU_FREQ/370)
#define_SOL(ALT_CPU_FREQ/392)
#define_SOLr(ALT_CPU_FREQ/416)
#define_LA(ALT_CPU_FREQ/440)
#define_LAr(ALT_CPU_FREQ/466)
#define_SI(ALT_CPU_FREQ/492)
//高音
#define_DO1(ALT_CPU_FREQ/523)
#define_DO1r(ALT_CPU_FREQ/554)
#define_RE1(ALT_CPU_FREQ/579)
#define_RE1r(ALT_CPU_FREQ/740)
#define_MI1(ALT_CPU_FREQ/651)
#define_FA1(ALT_CPU_FREQ/695)
#define_FA1r(ALT_CPU_FREQ/740)
#define_SOL1(ALT_CPU_FREQ/784)
#define_SOL1r(ALT_CPU_FREQ/830)
#define_LA1(ALT_CPU_FREQ/880)
#define_LAR1r(ALT_CPU_FREQ/932)
#define_SI1(ALT_CPU_FREQ/983)
#defineSONG_SIZE1200
#defineSONG_SIZE2200
#defineSONG_SIZE3200
#defineSONG_SIZE4200
#defineSONG_SIZE5200
#defineSONG_SIZE6200
#defineMUTE(TONE)(TONE)>>2//低音为25%占空比
#defineLOUD(TONE)(TONE)>>1//高音为50%占空比
//1=G3/4
//乐曲为一个多行3列的2维数组
//第1列为音调,第2列为节拍,第3列音高(高音、低音)
intburro[SONG_SIZE1][3]={
{_DO,_2,MUTE(_DO)},//1
{_MI,_32,0},
{_DO,_2,MUTE(_DO)},//1
{_MI,_32,0},
{_DO,_2,MUTE(_DO)},//1
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_SOL,_2,LOUD(_SOL)},//5
{_MI,_32,0},
{_SOL,_2,LOUD(_SOL)},//5
{_MI,_32,0},
{_SOL,_2,LOUD(_SOL)},//5
{_MI,_32,0},
{_SOL,_2,LOUD(_SOL)},//5
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_DO1,_2,LOUD(_DO1)},//1
{_MI,_32,0},
{_SOL,_1,LOUD(_SOL)},//5
{_MI,_32,0},
{_FA,_2,MUTE(_FA)},//4
{_MI,_32,0},
{_FA,_2,MUTE(_FA)},//4
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_RE,_2,MUTE(_RE)},//2
{_MI,_32,0},
{_RE,_2,MUTE(_RE)},//2
{_MI,_32,0},
{_RE,_2,MUTE(_RE)},//2
{_MI,_32,0},
{_RE,_2,MUTE(_RE)},//2
{_MI,_32,0},
{_SOL,_1,MUTE(_SOL)},//5
{_MI,_32,0},
{_SOL,_4,MUTE(_SOL)},//5
{_DO,_2,MUTE(_DO)},//1
{_MI,_32,0},
{_DO,_2,MUTE(_DO)},//1
{_MI,_32,0},
{_DO,_2,MUTE(_DO)},//1
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_SOL,_2,MUTE(_SOL)},//5
{_MI,_32,0},
{_SOL,_2,MUTE(_SOL)},//5
{_MI,_32,0},
{_SOL,_2,MUTE(_SOL)},//5
{_MI,_32,0},
{_SOL,_2,MUTE(_SOL)},//5
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_DO1,_2,MUTE(_DO1)},//1
{_MI,_32,0},
{_SOL,_1,LOUD(_SOL)},//5
{_FA,_2,LOUD(_FA)},//4
{_MI,_32,0},
{_FA,_2,LOUD(_FA)},//4
{_MI,_32,0},
{_FA,_2,LOUD(_FA)},//4
{_MI,_32,0},
{_LA,_2,MUTE(_LA)},//6
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_MI,_4,MUTE(_MI)},//3
{_MI,_32,0},
{_MI,_4,MUTE(_MI)},//3
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_RE,_2,LOUD(_RE)},//2
{_MI,_32,0},
{_RE,_2,LOUD(_RE)},//2
{_MI,_32,0},
{_RE,_2,LOUD(_RE)},//2
{_MI,_32,0},
{_MI,_2,MUTE(_MI)},//3
{_MI,_32,0},
{_DO,_1,MUTE(_DO)},//1
};
intdachangjin[SONG_SIZE2][3]={
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_SI,_2d,LOUD(_SI)},//3.
{_LA,_4,MUTE(_LA)},//2_
{_SOL,_2,MUTE(_SOL)},//1
{_MI,_2,LOUD(_MI)},//.6
{_SOL,_2,MUTE(_SOL)},//1
{_SOL,_2d,MUTE(_SOL)},//1
{_LA,_16,MUTE(_LA)},//2__
{_SOL,_1d,MUTE(_SOL)},//1--
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_SI,_2d,LOUD(_SI)},//3.
{_RE1,_4,MUTE(_RE1)},//5
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_LA,_2,MUTE(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_4d,MUTE(_SI)},//3--
{_RE1,_2,LOUD(_RE1)},//5
{_MI1,_2,MUTE(_MI1)},//6
{_MI1,_2,MUTE(_MI1)},//6
{_MI1,_2d,LOUD(_MI1)},//6
{_RE1,_4,MUTE(_RE1)},//5
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,LOUD(_SI)},//3
{_RE1,_2,MUTE(_RE1)},//5
{_MI1,_4,MUTE(_MI1)},//6
{_RE1,_16,MUTE(_RE1)},//5
{_MI1,_16,MUTE(_MI1)},//6
{_RE1,_1d,MUTE(_RE1)},//5
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_LA,_2d,LOUD(_LA)},//3.
{_SI,_4,MUTE(_SI)},//2
{_SI,_2,MUTE(_SI)},//3
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_MI,_2,LOUD(_MI)},//.6
{_SOL,_8,MUTE(_SOL)},//1
{_MI,_1d,MUTE(_MI)},//.6
{_MI,_2,0},//stop
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_SI,_2d,LOUD(_SI)},//3.
{_LA,_4,MUTE(_LA)},//2_
{_SOL,_2,MUTE(_SOL)},//1
{_MI,_2,LOUD(_MI)},//.6
{_SOL,_2,MUTE(_SOL)},//1
{_SOL,_8d,MUTE(_SOL)},//1
{_LA,_16,MUTE(_LA)},//2__
{_SOL,_1d,MUTE(_SOL)},//1--
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_SI,_2d,LOUD(_SI)},//3.
{_RE1,_4,MUTE(_RE1)},//5
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_LA,_2,MUTE(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_1d,MUTE(_SI)},//3--
{_RE1,_2,LOUD(_RE1)},//5
{_MI1,_2,MUTE(_MI1)},//6
{_MI1,_2,MUTE(_MI1)},//6
{_MI1,_2d,LOUD(_MI1)},//6
{_RE1,_4,MUTE(_RE1)},//5
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,LOUD(_SI)},//3
{_RE1,_2,MUTE(_RE1)},//5
{_MI1,_2,MUTE(_MI1)},//6
{_RE1,_1d,MUTE(_RE1)},//5
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SI,_2,MUTE(_SI)},//3
{_LA,_2d,LOUD(_LA)},//3.
{_SI,_4,MUTE(_SI)},//2
{_SI,_2,MUTE(_SI)},//3
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_MI,_2,LOUD(_MI)},//.6
{_SOL,_8,MUTE(_SOL)},//1
{_MI,_1d,MUTE(_MI)},//.6--
{_LA,_8,LOUD(_LA)},//2
{_LA,_8,LOUD(_LA)},//2
{_LA,_8d,LOUD(_LA)},//2
{_SOL,_4,MUTE(_SOL)},//1
{_MI,_2,MUTE(_MI)},//.6
{_LA,_8,LOUD(_LA)},//2
{_LA,_8,LOUD(_LA)},//2
{_LA,_8d,LOUD(_LA)},//2
{_SOL,_4,MUTE(_SOL)},//1
{_MI,_2,MUTE(_MI)},//.6
{_LA,_2,LOUD(_LA)},//2
{_SI,_2,MUTE(_SI)},//3
{_SOL,_2,MUTE(_SOL)},//1
{_LA,_2d,LOUD(_LA)},//2
{_SI,_4,MUTE(_SI)},//3
{_RE1,_2,MUTE(_RE1)},//5
{_MI1,_8,LOUD(_MI1)},//6
{_MI1,_8,LOUD(_MI1)},//6
{_MI1,_8d,LOUD(_MI1)},//6
{_RE1,_4,MUTE(_RE1)},//5
{_SI,_2,MUTE(_SI)},//3
{_LA,_8,LOUD(_LA)},//2
{_LA,_8,LOUD(_LA)},//2
{_LA,_8d,LOUD(_LA)},//2
{_SOL,_4,MUTE(_SOL)},//1
{_MI,_2,MUTE(_MI)},//.6
{_MI,_2,LOUD(_MI)},//.6
{_RE,_2,MUTE(_RE)},//.5
{_MI,_2,MUTE(_MI)},//.6
{_MI,_1d,MUTE(_MI)},//.6
{_MI,_2,0},//stop
{_MI,_2,0},//stop
};
/*{_1SOL,_4d,MUTE(_1SOL)},//.1
{_1LA,_4d,MUTE(_1LA)},//.2
{_1SI,_4d,MUTE(_1SI)},//.3
{_DO,_4d,MUTE(_DO)},//.4
{_RE,_4d,MUTE(_RE)},//.5
{_MI,_4d,MUTE(_MI)},//.6
{_FA,_4d,MUTE(_FA)},//.7
{_SOL,_4d,MUT