基于FPGA的音乐播放器设计
更新时间:2024-04-02 15:23:01 阅读量: 综合文库 文档下载
目录
第1章 绪论 ......................................................................................................................... 1
1.1 研究背景 ................................................................................................................ 1
1.2 可编程逻辑控件FPGA ........................................................................................... 1 1.3 开发语言VHDL ....................................................................................................... 3 1.4 开发环境MAX+PLUSⅡ ........................................................................................... 4 1.5 研究思路及主要工作 ............................................................................................ 4 第2章 系统设计 ................................................................................................................. 5
2.1 系统原理 ................................................................................................................ 5
2.1.1 音调的控制 ................................................................................................. 6 2.1.2 音长的控制 ................................................................................................. 6 2.2 系统结构 ................................................................................................................ 7 第三章 各模块设计与仿真 ................................................................................................. 7
3.1 定制音符数据 ........................................................................................................ 7
3.1.1定制音符数据ROM的mif文件 .................................................................. 7 3.1.2在MAX+PLUSⅡ下定制的LPM_ROM .............................................................. 9 3.2 音符数据地址发生器模块NOTETABS ................................................................. 10 3.3 预置数查表电路模块TONETABA ......................................................................... 11 3.4 发声频率产生模块SPEAKERA ............................................................................. 12 3.5乐曲播放电路顶层电路 ....................................................................................... 13 第四章 硬件测试 ............................................................................................................... 14 第五章 结束语 ................................................................................................................... 14 参考文献 ............................................................................................................................. 16 附录 ..................................................................................................................................... 17 致谢 ..................................................................................................... 错误!未定义书签。
第1章 绪论
1.1 研究背景
随着电子技术的飞速发展,微电子技术的进步主要表现在大规模集成电路加工技术即半导体工艺技术的发展上,使得本征半导体的工艺水平的线宽已经达到了60nm,并在不断地缩小,面在硅片单位面积上,集成了更多的晶体管。集成电路设计正在不断地向超大规模,极低功耗和超高速的方向发展,电子产品的功能越来越强大,体积越来越小,功耗越来越低。
顺应电子技术的发展趋势,可编程逻辑器件和EDA 技术使设计方法发生了质的变化。把以前“电路设计+硬件搭试+调试焊接”转化为“功能设计+软件模拟+仿真下载”。利用EDA 开发平台,采用可编程逻辑器件CPLD/FPGA 使硬件的功能可通过编程来实现,这种新的基于芯片的设计方法能够使设计者有更多机会充分发挥创造性思维,实现多种复杂数字逻辑系统的功能,将原来由电路板设计完成的工作放到芯片的设计中进行,减少了连线和体积,提高了集成度,降低了干扰,大大减轻了电路设计和PCB设计的工作量和难度,增强了设计的灵活性,有效地提高了工作效率,增加了系统的可靠性和稳定性,提高了技术指标。
这些技术使得各种电子产品迅速的进入了我们的生活,我们处在一个被电子产品深度包围的时代,在一个普通老百姓的家里,衣食住行,每一个产品的诞生都离不开EDA技术,从彩色电视机,到智能冰箱,到全自动洗衣机,电饭煲,到微波炉,电磁炉,电子琴,再到个人随身用的手机,MP3音乐播放器都需要EDA技术提供支持。
本文应用VHDL硬件描述语言,设计一个乐曲硬件播放电路,它能将预先设置存储好的乐曲自动播放出来,下面对乐曲播放电路的设计与实现中涉及的EDA技术,以及EDA技术中常用的开发器件CPLD/FPGA可编程逻辑器件,开发语言VHDL以及开发软件MAX+PLUSII作简单介绍。 1.2 可编程逻辑控件FPGA
本设计中选用FPGA,主要是因为它与传统的MCU相比有以下几个方面的优点: ①编程方式简便先进。FPGA产品中部分是采用菊花链在系统编程方式的。这种先进的编程方式已成为当今世界上各类可编程器件发展的趋势。因为它省却了价格昂贵,操作不便的专用编程器,只需要一个十分简单的下载编程电路和一条PC机的打
印机通讯线就行了。它无须编程高压,在TTL电平下随时可进行在线编程,并可进行所谓菊花链式多片串行编程。
②高可靠性。在高可靠应用领域,MCU的缺憾为FPGA的应用留下了很大的用武之地。这族器件尽管在功能开发上是通过EDA软件实现的。但物理机制却像一片74LS164那样纯属硬件电路,十分可靠。通过合理设计,大多数应用中,无须考虑复杂的复位和初始化。设计中只需利用简单的语句将闲置状态导入同一初始入口,就能有效防止任何可能的“死机”现象。由于是并行工作,它的任一输入脚都可用作类似于MCU的中断监测引脚,且反应速度仅为纳妙级。FPGA的高可靠性还表现在几乎可将整个系统下载于同一芯片中,从而大大缩小了体积,易于管理和屏蔽。
③高速。FPGA的时钟延迟可达纳秒级,结合其并行工作方式,在超高速应用领域和实时测控方面有非常广阔的应用前景。
④功能强大,应用广阔。目前,FPGA的可选择范围很大,可根据不同的应用选用不同容量的芯片,如Lattice的ispLSI和AMD公司的MACH,最小芯片的等效逻辑门为1000门,最大达数十万门。ALTERA和XILINX公司推出的百万门的FPGA可实现几乎任何形式的数字电路或数字系统的设计。随着这类器件的广泛应用和成本的大幅下降,以及产品上市速率的提高,FPGA在系统中的直接应用率正直逼ASIC的开发。
⑤易学易用,开发便捷。单片机应用系统的设计对于行家里手来说是十分简单的事。然而,对于初学者,诸如CPU的工作方式、众多特殊寄存器的用法、中断概念等等,着实不是一件容易的事。相比之下,FPGA应用的学习却不需要太多的预备知识,只要稍具一点数字电路和计算机软件设计的基础知识,就能在短期内掌握基本的设计方法和开发技巧。而且反过来去学用单片机,就显得轻车熟路多了。这无疑是高技术为我们的学习提供了捷径,站在巨人的肩膀当然能更快地获得成功。可以预言,我国EDA技术的学习热潮和FPGA的应用热潮决不会逊色于过去10年的单片机热潮。
⑥开发周期短。由于相应的EDA软件功能完善而强大,仿真能力便捷而实时,开发过程形象而直观,兼之硬件因素涉及甚少,因此可以在很短时间内完成十分复杂的系统设计,这是产品快速进入市场的最宝贵的特征。一些EDA专家预言,未来的大系统的FPGA设计仅仅是各类再应用逻辑与IP核(CORE)的拼装,其设计周期仅以小时计。TI公司认为,一个ASIC百分之八十的功能可用IP核等现成逻辑合成。
2
1.3 开发语言VHDL
VHDL是非常高速集成电路硬件描述语言,是可以描述硬件电路的功能、信号连接关系及定时关系的语言.它能比电路原理图更有效地表示硬件电路的特性。使用VHDL语言,可以就系统的总体要求出发,自上至下地将设计内容细化,最后完成系统硬件的整体设计。VHDL语言的主要特点是:
①功能强大,灵活性高:VHDL语言是一种功能强大的语言结构,可用简洁明确的代码来进行复杂控制逻辑的设计。同时VHDL语言还支持层次化的设计,支持设计库和可重复使用的元件生成。目前,VHDL语言已成为一种设计、仿真、综合的标准硬件描述语言。
②器件无关性:VHDL语言允许设计者在生成一个设计时不需要首先选择一个具体的器件。对于同一个设计描述,可以采用多种不同器件结构来实现其功能。因此设计描述阶段,可以集中精力从事设计构思。当设计、仿真通过后,指定具体的器件综合、适配即可。
③可移植性:VHDL语言是一种标准的语言,故采用VHDL进行的设计可以被不同的EDA工具所支持。从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。在一个EDA工具中采用的技术技巧,在其它工具中同样可以采用。
④自顶向下的设计方法:传统的设计方法是,自底向上的设计或平坦式设计。自底向上的设计方法是先从底层模块设计开始,逐渐由各个模块形成功能复杂的电路。这种设计方法优点是很明显的,因为它是一种层次设计电路,一般电路的子模块都是按照结构或功能划分,因此这种电路层次清楚,结构明确,便于多人合作开发,同时设计文件易于存档,易于交流。自底向上设计方法的缺点也很明显,往往由于整体设计思路不对而使的花费几个月的低层设计付之东流。平坦式设计是整个电路只含有一个模块,电路的设计是平铺直叙的,没有结构和功能上的划分,因此不是层次电路的设计方式。优点是小型电路设计时可以节省时间和精力,但随着电路复杂程度的增加,这种设计方式的缺点变的异常突出。自顶向下的设计方法是将要设计的电路进行最顶层的描述(顶层建模),然后利用EDA软件进行顶层仿真,如果顶层设计的仿真结果满足要求,则可以继续将顶层划分的模块进行低一级的划分并仿真,这样一级一级设
3
计最终将完成整个电路的设计。自顶向下的设计方法与前面两种方法相比优点是很明显的。
⑤数据类型丰富:作为硬件描述语言的一种VHDL语言的数据类型非常丰富,除了VHDL语言自身预定义的十种数据类型外,在VHDL语言程序设计中还可以由用户自定义数据类型。特别是std_logic数据类型的使用,使得VHDL语言能最真实模拟电路中的复杂信号。
⑥运行库和程序包丰富:目前支持VHDL语言的程序包很丰富,大多以库的形式存放在特定的目录下,用户可随时调用。如IEEE库收集了std_logic_1164、std_logic_arith、std_logic_unsigned等程序包。在FPGA综合时,还可以使用EDA软件商提供的各种库和程序包。而且用户利用VHDL语言编写的各种成果都可以以库的形式存放,在后续的设计中可以继续使用。
⑦建模方便:由于VHDL语言中可综合的语句和用于仿真的语句齐备,行为描述能力强,因此VHDL语言特别适合信号建模。VHDL语言无论仿真还是综合都是非常合适的描述语言。
⑧ VHDL语言是一种硬件电路的建模描述语言,因此与普通的计算机语言有较大差别,普通计算机语言是CPU按照时钟的节拍,一条指令执行完后才能执行下一条指令,因此指令执行是有先后顺序的,也即是顺序执行,而每条指令的执行占用特定的时间。而与VHDL语言描述结果相对应的是硬件电路,它遵循硬件电路的特点,语句的执行没有先后顺序,是并发的执行的;而且语句的执行不象普通软件那样每条指令占用一定的时间,只是遵循硬件电路自身的延迟时间。 1.4 开发环境MAX+PLUSⅡ
MAX+PLUSⅡ提供了全面的逻辑设计能力,包括电路图、文本和波形的设计输入以及编译、逻辑综合、仿真和定时分析以及器件编程等诸多功能。特别是在原理图输入等方面,MAX+PLUSⅡ被公认为是最易使用、人机界面最友好的PLD 开发软件。这样灵活多变的输入方式,给设计使用者带来了极大的方便。 1.5 研究思路及主要工作
本文按照EDA开发流程,采用VHDL硬件描述语言开发,将乐曲硬件播放电路设计进行模块化分解,层次化设计,分成几个单独的结构体,每个结构体实现部分功能,最后,经顶层文件将各单独结构体进行综合,实现乐曲硬件播放。
4
主要工作:根据硬件播放电路的功能进行全局分析,采用自上至下的设计方法,从系统总体要求出发,逐步将设计内容细化,最后完成系统结构的整体设计,实现预先设置乐曲的播放功能。
实现功能乐曲播放,需要完成以下设计:
①.预置乐曲,本文选取了《梁祝》与《欢乐颂》作预置,作预置时,需要将乐曲音符转换成相应的代码,通过计算逐一将音符转换成代码,通过EDA开发平台MAX+PLUSII进行乐曲定制;
②.为了提供乐曲发音所需要的发音频率,编写数控分频器程序,对单一输入高频,进行预置数分频,生成每个音符发音的相应频率;
③.为了给分频提供预置数,需要计算分频预置数;
④.对每部分结构单元逐一进行编译,生成相应的元器件符号,并对独立结构单元功能进行仿真;
启动MAX+PLUSII全程编译,生成具体输入,输出端口的图形文件。启动全程功能仿真,生成仿真波形文件。生成下载文件,在ZYE1502D实验开发板上利用Altera公司的FLXE10K—EPF10K10LC84—4芯片进行功能验。
第2章 系统设计
2.1 系统原理
传统数字逻辑设计方法相比,本设计借助于功能强大的EDA工具和硬件描述语言来完成,如果只以纯硬件的方法完成乐曲播放电路的设计,将是难以实现的。本设计采用了《梁祝》与《欢乐颂》的曲子来完成。
表2.1 简谱中的音名与频率的关系表
频 率音符名 (Hz) 休止符 低音1 低音2 低音3 低音4 375000 低音5 294.349 低音6 330.396 低音7 370.92 中音4 386.598 中音5 音符名 (Hz) 394.737 中音6 495.376 中音7 555.56 高音1 频 率音符名 (Hz) 989.446 高音4 1136.363 高音5 1175.549 高音6 1353.790 高音7 1512.097 频 率音符名 (Hz) 1609.442 1802.884 2027.027 2272.727 频 率796.178 高音2 882.353 高音3 5
为了便于理解,首先介绍一下硬件电路的发声原理。我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。而乐曲中的每一音符对应着一个确定的频率,因此,要想FPGA发出不用音符的音调,实际上只要控制它输出相应音符的频率即可(音符和频率的关系见表2.1)。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。而要准确地播放出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续播放的两个关键因素。 2.1.1 音调的控制
频率的高低决定了音调的高低。计算出简谱中从低音1到高音1之间每个音名对应的频率,所有不同频率的信号都是从同一个基准频率分频得到的。由于音阶频率多为非整数,而分频系数又不能为小数,因此必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差较小,但分频数将变大。实际的设计应综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。因此,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。综合考虑各因素,本文中选取12MHZ作为CLK的分频计数器的输入分频信号。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。
2.1.2 音长的控制
音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此,在想控制音符的音长,就必须知道乐曲的速度和每个音符所对应的节拍数,在这个设计中所播放的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4HZ的时钟频率即可产生四分音符的时长。要想让系统知道现在应该播放哪个音符,而这个音符持续的时间应该是多少,就必须编写乐曲文件,在乐曲文件中音符是按地址存放的,当系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,而如果在曲谱文件中这个音符为三拍音长,那又该如何控制呢?
6
其实只要将该音符连续书写三遍,这时系统读乐曲文件的时候就会连续读到三次,也就会发三个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
3.3 预置数查表电路模块TONETABA
1)功能:音乐预置数查表电路电路模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里列出了在乐曲中所用到的22个音符的分频预置数见(表3.1)。
在这个模块的VHDL逻辑描述中设置了四四拍乐曲中全部音符所对应的分频预置数,共22个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。这22个值的输出由附录三的程序的4位输入值index[4..0]确定。输向附录四的程序中index[4..0]的值又由地址发生器模块的输出toneindex[4..0]的输出值和持续时间决定。
表3.1 各音阶对应的分频预置数关系表
频 率分频 计数初值 (Hz) 系数 375000 0 2047 773 912 1036 1077 1197 1290 1372 1410 1480 1542 294.349 1274 330.396 1135 370.92 1011 386.598 970 394.737 950 495.376 757 555.56 675 588.697 637 638.84 587 742.574 505 分频 系数 468 425 379 330 319 277 248 233 208 185 165 计数 初值 1579 1622 1668 1717 1728 1770 1799 1814 1839 1862 1882 音符名 休止符 低音1 低音2 低音3 低音4 低音5 低音6 低音7 中音1 中音2 中音3 音符名 中音4 中音5 中音6 中音7 高音1 高音2 高音3 高音4 高音5 高音6 高音7 频 率(Hz) 796.178 882.353 989.446 1136.363 1175.549 1353.790 1512.097 1609.442 1802.884 2027.027 2272.727
2)预置数查表电路电路模块TONETABA生成元件符号(见图3.4): 端口说明:
INDEX[4..0]端口:作为上一级音符数据地址的输入端; CODE[4..0]端口:作为音符数据简谱码的输出显示端;
HIGH端口:作为音符数据简谱码高8度的输出显示端; 图3.4 TONETABA生成元件符号 TONE[10..0]端口:作为音符数据分频预置数的输出端; 3)对应的程序见附录C。
4)音符数据地址发生器模块NOTETABA的仿真波形如(图3.5)所示:
11
图3.5 NOTETABA的仿真波形图
5)波形分析:
模块的功能是输出各个音符所对应的分频预置数,即当index是“00000”,tone输出为2047,即休止符的分频预置数;当index是“00101”时, tone输出为1197即低音5的分频预置数;当index是“01010”时, tone输出为1542即高音1的分频预置数等等其它状态时,tone分别输出相应音符的12分频预置数,仿真波形图证明了程序实现了模块的功能。 3.4 发声频率产生模块SPEAKERA
1)音符的频率由数控分频模块获得,这是一个数控分频电路。它是由一个初值可变的加法计数器构成。该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值,而此预置数就是表3.1中的计数初值,就可得到不同音符的发音频率信号。它计满时所需要的计数初值、分频系数可由下列式子来表示。
计数初值(Tone)=2047-分频系数 分频系数=基准频率/音符的发生频率
低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。这就是利用数控分频器自动播放音乐的原理。
时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。数控分频模块中对Clk输入信号的分频比由11位预置数tone[10..0]决定。SPKOUT的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone[10..0]与SPKOUT的输出频率就有了对应关系。 2)发声频率产生模块SPEAKERA生成元件符号(见图3.6):
12
端口说明:
CLK12MHZ端口:作为发音频率初始信号输入端口; TONE[10..0]端口:作为音符数据分频预置数的输入端;
SPKS端口:作为乐曲的声音输出端口; 图3.6 SPEAKERA生成元件符号 3)对应的程序见附录D。
4)发声频率产生模块SPEAKERA的仿真波形如(图3.7)所示:
图3.7 SPEAKERA的仿真波形图
波形分析:
Speakera 音乐符数控分频此模块的功能是根据初始值Tone的值,对输入时钟信号Clk的频率进行分频,得到想要的音符的发声频率其时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。在分频预置数模块中若取 tone[10..0]=912,将发出音符为低音2的信号频率的发声频率等等其它状态,因此这个程序实现了模块的功能。 3.5乐曲播放电路顶层电路
根据各个模块产生的元件符号,连接组成乐曲播放电路顶层文件,其顶层电路分为三个模块,音符数据地址发生器模块NOTETABS,预置数查表电路电路模块TONETABA,发声频率产生模块SPEAKERA,图3.8所示的是顶层电路组成图。
图3.8 顶层电路组成图
13
第四章 硬件测试
本设计目标器件选用ZYE1502D实验开发板上利用Altera公司的FLXE10K—EPF10K10LC84—4芯片进行功能验证(引脚锁定的对应关系如表4.1所示),通过EDA开发工具MAX+PLUSII对各个模块的VHDL源程序及顶层电路进行编译、逻辑综合,完成电路的纠错、验证、仿真等各种测试工作,将设计的顶层电路组成图music.gdf文件内容下载到对应的配置芯片中,外接扬声器,系统成功实现了乐曲《梁祝》与《欢乐颂》的播放,能自动从头开始循环播放,也可随时起停、整体复位、按键选择播放方式、循环演奏以及发光管二极管动态显示播放的音符和高8度音调。经实际电路测试验证,达到了设计的要求。
表4.1 实验箱主板与下载板元件的连接封装关系表
器件 名称 输出发光管 输出发光管 输出发光管 输出发光管 输出发光管 喇叭 信号名 LED1 LED2 LED3 LED4 LED5 SPEAK 端口名 CODE4 CODE3 CODE2 CODE1 CODE0 SPKOUT EPF 10K10 27 28 29 30 35 3 器件 名称 拨位开关 拨位开关 输出发光管 全局时钟1 全局时钟2 信号名 KD1 KD2 LED8 P2.4 P2.5 端口名 RST SEL HIGH CLK4HZ CLK12MHZ EPF 10K10 54 58 38 1 43
第五章 结束语
(1) 本次基于VHDL音乐播放器的设计经过了整体分析、模块化分析、整体与模块的仿真分析这样三个步骤,硬件实现了整体复位、按键选择播放方式、循环演奏以及发光管显示乐谱的功能。
(2) 在做数控分频器模块的仿真时一定要处理好时序问题。
(3) 本次设计可以说达到了设计要求,但尚有需要改进的地方。随着乐谱的复杂程度加大,如果依然在音调发生器的程序中通过时钟计数来决定音符的输出,会加大编程的繁杂度,这时一个很好的解决办法就是把将要演奏的乐谱存放在人为开辟的存储空间里,这样只需要在相应地址中读出音符即可。
(4)通过本次论文设计,让我进一步了解了数控分频器的工作原理和功能作用,
14
并学会了利用LPM模块制作ROM文件的方法,也更深一层地懂得了顶层文件通过例化语句与其他模块结合的好处,同时对EDA实验箱的操作有了进一步的了解,熟悉掌握了EDA的文本编程设计方法和仿真波形的编辑。
15
参考文献
[1]李国洪,沈明山,胡辉编.可编程器件EDA技术与实践.机械工业出版社,2005.8.1. [2]潘松,黄继业编著,EDA技术实用教程.科学出版社,2007.12. [3]徐志军,徐光辉,CPLD/FPGA的开发与应用,电子工业出版社,2001 [4]谭会生,EDA技术基础,湖南大学出版社,2004
[5]李岩,黄夫海,基于FPGA的MIDI音乐发生器设计,2010
[6]潘晓利,陈学煌,刘永志,基于MIDI模块的音乐发生器设计【期刊论文】电子测量技术,2007 [7]沈明山.EDA技术及可编程器件应用实训,科学出版社,2004.6(4):318-326.
[8]刘婷婷,李军.电子设计自动化(EDA).北京师范大学出版社,2007,9(2):250-257. [9]赵明富,李立军.EDA技术基础,北京大学出版社,2007.5(5):221-224. [10]刑建平,曾繁泰.VHDL程序设计教程.3版.北京:清华大学出版社,2005:45-46.
16
附录
附录A: 定制好的ROM文件VHDL程序
LIBRARY ieee;
USE ieee.std_logic_1164.all; ENTITY songer IS
PORT (address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock: IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (4 DOWNTO 0)); END songer;
ARCHITECTURE SYN OF songer IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); COMPONENT lpm_rom GENERIC (
lpm_width : NATURAL; lpm_widthad : NATURAL;
lpm_address_control : STRING; lpm_outdata : STRING; lpm_file : STRING );
PORT ( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (4 DOWNTO 0)); END COMPONENT; BEGIN
q <= sub_wire0(4 DOWNTO 0);
lpm_rom_component : lpm_rom GENERIC MAP (
LPM_WIDTH => 5, LPM_WIDTHAD => 8,
LPM_ADDRESS_CONTROL => \ LPM_OUTDATA => \
LPM_FILE => \PORT MAP ( address => address,inclock => inclock, q => sub_wire0 END SYN;
附录B: 音符数据地址发生器模块NOTETABS程序 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
);
ENTITY NoteTabs IS
PORT ( clk : IN STD_LOGIC; SEL : IN STD_LOGIC; RST : IN STD_LOGIC;
ToneIndex : OUT STD_LOGIC_VECTOR (4 DOWNTO 0) ); END;
ARCHITECTURE one OF NoteTabs IS COMPONENT songer
PORT( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (4 DOWNTO 0)); END COMPONENT;
SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL S:STD_LOGIC_VECTOR (1 DOWNTO 0); BEGIN
S(1)<=rst; S(0)<=sel;
CNT8 : PROCESS(clk, Counter,sel,rst)
VARIABLE Coun : STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN
IF (clk'EVENT AND clk = '1') then CASE S IS
WHEN \ WHEN \ WHEN \ WHEN OTHERS=>NULL; END CASE; END IF;
Counter<=Coun; END PROCESS;
u1 : songer PORT MAP(address=>Counter , q=>ToneIndex,inclock=>clk); END;
附录C: 预置数查表电路模块TONETABA程序 Library ieee;
Use ieee.std_logic_1164.all; Entity tonetaba is
Port( index : in std_logic_vector(4 downto 0); code : out std_logic_vector(4 downto 0); high : out std_logic;
tone : out std_logic_vector(10 downto 0)); End;
18
Architecture one of tonetaba is Begin
Search : process(index) Begin
Case index is
When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When \When others => null; End case; End process; End;
附录D: 发声频率产生模块SPEAKRA程序 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY Speakera IS
PORT ( clk : IN STD_LOGIC;
Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS : OUT STD_LOGIC ); END;
ARCHITECTURE one OF Speakera IS
SIGNAL PreCLK, FullSpkS : STD_LOGIC;
19
BEGIN
DivideCLK : PROCESS(clk)
VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN
PreCLK <= '0';
IF Count4>11 THEN PreCLK <= '1'; Count4 := \
ELSIF clk'EVENT AND clk = '1' THEN Count4 := Count4 + 1; END IF; END PROCESS;
GenSpkS : PROCESS(PreCLK, Tone)
VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0); BEGIN
IF PreCLK'EVENT AND PreCLK = '1' THEN
IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1'; ELSE Count11 := Count11 + 1; FullSpkS <= '0'; END IF; END IF; END PROCESS;
DelaySpkS : PROCESS(FullSpkS) VARIABLE Count2 : STD_LOGIC; BEGIN
IF FullSpkS'EVENT AND FullSpkS = '1' THEN Count2 := NOT Count2; IF Count2 = '1' THEN SpkS <= '1'; ELSE SpkS <= '0'; END IF; END IF; END PROCESS; END;
20
附录E:《梁祝》简谱
21
附录F:《欢乐颂》简谱
22
正在阅读:
基于FPGA的音乐播放器设计04-02
血液透析患者动静脉内瘘溶栓护理2例11-30
2016搞笑整人语句02-10
java 实训指导书401-01
汽车CAN总线技术及故障检测04-11
感人的母爱故事02-19
小胖子快餐店面形象设计悬赏任务说明书07-19
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 播放器
- 基于
- 设计
- 音乐
- FPGA
- 诸真宝诰 - 图文
- 3CIYUEK高中政治必修3期末考试
- 新课标化学教学面临的困惑与解决策略
- 2018年陕西省西工大附中九年级英语第三次适应性训练(无听力 含
- 儿童青少年精神障碍流调启动
- 人教版四年级上册语文全册教案 - 图文
- 2014年区赛理论试题库
- 吉林大学珠海学院创新发展模式,培养高素质、应用型人才
- 各级各类学校(机构)代码编制规则
- 初中英语静安寒暑假小升初补习班闸北区
- 轴系拉线照光工艺
- 四 - 年 - 级 - 语 - 文 - 课 - 外 - 知 - 识 - 精 - 选 - 图文
- 帮助学困生走出学习困境的方法例谈
- 2009-2015年广东省普通高中生物学业水平考试真题汇编(必修3)
- 初中数学专题复习八年级数学(下册)华东师大教材分析与建议
- 徽州文化答案
- 2013年九年级5月份月考语文测试卷
- 2019-2020年七年级生物上册 第三节单细胞生物教案 苏教版
- 专业面试委员会成员指导手册
- 投资学习题