当前位置:首页 > 基于FPGA的音乐播放器设计1
其实只要将该音符连续书写三遍,这时系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,通过这样一个简单的操作就可以控制音乐的音长了。 2.2 系统结构
本系统主要由三个功能模块组成:NOTETABS.VHD,TONETABA.VHD和 SPEAKER.VHD。第一部分NOTETABS,地址发生器,实现按节拍读乐谱的功能;第二部分TONETABA,查表电路,为SPEAKER提供分频预置数,实现乐曲译码输出CODE[4:0];第三部分SPEAKERA,产生发音频率,实现乐曲播放;其结构如图2.1所示。
图2.1 乐曲播放电路结构方框图
第三章 各模块设计与仿真
3.1 定制音符数据
3.1.1定制音符数据ROM的mif文件
为了实现乐曲的播放,首先需要将曲谱定制到音符数据ROM里面,然后才能按照一定的节拍从ROM中读出曲谱。以下定制的是《梁祝》与《欢乐颂》的mif 文件(《梁祝》与《欢乐颂》的简谱见附录E、F)。
WIDTH=5; DEPTH=256; ADDRESS_RADIX=DEC; DATA_RADIX=DEC;
CONTENT BEGIN――注意:实用文件中是展开以下数据的,每一组占一行; 00:3;01:3;02:3;03:3;04:5;05:5;06:5;07:6;08:8;09:8;10:8;11:9;12:6;
7
13:8;14:5;15:5;16:12;17:12;18:12;19:15;20:13;21:12;22:10;23:12; 24:9;25:9;26:9;27:9;28:9;29:9;30:9;31:0;32:9;33:9;34:9;35:10;36:7; 37:7;38:6;39:6;40:5;41:5;42:5;43:6;44:8;45:8;46:9;47:9;48:3;49:3; 50:8;51:8;52:6;53:5;54:6;55:8;56:5;57:5;58:5;59:5;60:5;61:5;62:5; 63:5;64:10;65:10;66:10;67:12;68:7;69:7;70:9;71:9;72:6;73:8;74:5; 75:5;76:5;77:5;78:5;79:5;80:3;81:5;82:3;83:3;84:5;85:6;86:7;87:9; 88:6;89:6;90:6;91:6;92:6;93:6;94:5;95:6;96:8;97:8;98:8;99:9;100:12 101:12;102:12;103:10;104:9;105:9;106:10;107:9;108:8;109:8;110:6; 111:5;112:3;113:3;114:3;115:3;116:8;117:8;118:8;119:8;120:6;121:8; 122:6;123:5;124:3;125:5;126:6;127:8;128:5;129:5; 130:10;131:10; 132:10;133:10;134:11;135:11;136:12;137:12;138:12;139:12;140:11; 141:11;142:10;143:10;144:9;145:9;146:8;147:8;148:8;149:8;150:9; 151:9;152:10;153:10;154:10;155:10;156:10;157:9;158:9;159:9;160:9; 161:9;162:10;163:10;164:10;165:10;166:11;167:11;168:12;169:12; 170:12;171:12;172:11;173:11;174:10;175:10;176:9;177:9;178:8;179:8; 180:8;181:8;182:9;183:9;184:10;185:10;186:9;187:9;188:9;189:8;190:8; 191:8;192:8;193:8;194:9;195:9;196:9;197:9;198:10;199:10;200:8;201:8; 202:9;203:9;204:10;205:11;206:10;207:10;208:8;209:8;210:9;211:9; 212:10;213:11;214:10;215:10;216:8;217:8;218:8;219:8;220:9;221:9; 222:5;223:5;224:10;225:10;226:10;227:10;228:10;229:10;230:11;231:11; 232:12;233:12;234:12;235:12;236:11;237:11;238:10;239:10;240:9;241:9; 242:8;243:8;244:8;245:8;246:9;247:9;248:10;249:10;250:9;251:9;252:9; 253:8;254:8;255:8; END;
其中WIDTH=5,表示数据输出位宽为5;DEPTH=256,表示共有256个5位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数。
形成ROM中的配置数据(初始化数据)文件的方法如下:在MAX+PLUSⅡ中编辑.mif文件。首先在File菜单下的New菜单上选择Text Editor File命令,进入文本编辑
8
器,然后输入以上格式的数据文件。文件中的关键词WIDTH设置ROM的数据宽度;DEPTH设置ROM数据的深度,文件中设置的5即为5位数据的数量,256等效于8位地址线宽度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示设置地址和数据的表达式格式都是十进制;地址/数据表以CONTENT BEGIN开始,以END结束;其中的地址/数据表达方式是冒号左边写ROM地址值,冒号右边写对应此地址放置的十进制数据,如45:8,表示45为地址,8为该地址中的数据。这样每读到一个地址,即可输出其相应的数据。文件编辑好后,保存时取文件名为“songer.mif”,存盘的路径为“c:\\music \\ songer.mif”。
3.1.2在MAX+PLUSⅡ下定制的LPM_ROM
1)具体步骤如下:
(1) 进入MAX+PLUSⅡ,选菜单 TOOL->megawizard plug-in manager,选择“creat a new?”,然后按“next”键,选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名:c:\\music \\ songer.vhd,注意后缀vhd小写。
(2) 单击“next”键,,选择ROM数据位宽度为5,地址线宽为8,即设置此ROM能存储5位二进制数据共256个。
(3) 通过“ browse” 钮,找到ROM中的加载文件路径和文件名:c:\\music \\ songer.mif注意ROM元件的inclock是地址锁存时钟。
(4) 打开已定制的ROM文件songer.vhd,将它设置为工程,并确定目标器件,进行测试仿真波形。
2)定制好的ROM文件VHDL程序见附录A。
3)已定制的ROM文件songer.vhd的仿真波形如图3.1所示:
图3.1 songer模块仿真波形图
4)波形分析:
此乐谱发生器模块的功能是输出存储在LPM-ROM中的各个音符数据,由上面的仿真波形图可看到“梁祝”乐曲中的第一个音符为“3”即为“00011”此音在逻辑中停留了4个时钟,那么相应随着程序中的地址计数器按4Hz的时钟频率作加法计数时,
9
即随地址递增时,将从音符数据ROM中将连续取出4个音符“00011”,乐曲中的第二个音符为“5”即为“00101”此音在逻辑中停留了3个时钟,相应地,将从音符数据ROM中将连续取出3个音符“00101”等其它状态时,仿真波形图证明了模块的功能。 3.2 音符数据地址发生器模块NOTETABS
1)功能:NOTETABS模块设置了一个8位二进制计数器(计数最大值为256),作为音符数据ROM的地址发生器。每来一个时钟脉冲信号(Clk),8位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。
在地址发生器的VHDL设计中,这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。那么相应随着程序[1]中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex[4..0]端口输向分频预置数模块。这样梁祝乐曲中的音符就一个接一个的通过toneindex[4..0]端口输向分频预置数模块。 2)音符数据地址发生器模块NOTETABS生成元件符号(见图3.2): 端口说明:
CLK 4HZ端口:作为节拍脉冲信号输入端口;
RST端口:作为从头开始播放歌曲脉冲信号输入端口;
SEL端口:作为播放第二首歌脉冲信号输入端口; 图3.2 NOTETABS生成元件符号 TONEINDE[4..0]端口:作为音符数据地址的输出端口; 3)对应的程序见附录B。
4)音符数据地址发生器模块NOTETABS的仿真波形如(图3.3)所示:
图3.3 NOTETABS的仿真波形图
10
共分享92篇相关文档