乐曲硬件演奏电路设计3.doc_第1页
乐曲硬件演奏电路设计3.doc_第2页
乐曲硬件演奏电路设计3.doc_第3页
乐曲硬件演奏电路设计3.doc_第4页
乐曲硬件演奏电路设计3.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网易 新闻 微博 邮箱 相册 有道 摄影 闪电邮 手机邮 印像派 梦幻人生 更多 博客 手机博客 博客搬家 LiveWriter写博 Word写博 邮件写博 短信写博 群博客 博客油菜地 博客话题 博客热点 博客圈子 找朋友 发现小组风格 群博客召集令创建博客 登录 关注网易博客安全提醒:系统检测到您当前密码的安全性较低,为了您的账号安全,建议您适时修改密码立即修改|关闭 显示下一条|关闭 Minars blog走自己的路,让别人去说吧!导航首页 日志 相册 音乐 收藏 博友 关于我 日志孤灯 Minar 加博友 关注他 最新日志TI收购NS中国LED企业行业25强(2010LED可控硅调光技术兔年到LED照明发展方向红外温度计方案该作者的其他文章博主推荐相关日志随机阅读首页推荐实拍在白俄罗斯遭遇烧车之险性感美女酒醉北京街头糗大了云南凤凰谷:“性文化”主题旅游网易员工早餐吃些啥?尼泊尔买门票外国人比中国人贵10倍欧洲贵妇穿衣服有多麻烦更多对“推广广告”提建议 深圳规定乙肝检查不得列入体检常规项目 一位全加器源代码音乐硬件演奏电路设计2007-07-07 11:10:16|分类: 默认分类 阅读2275 评论16 字号:大中小订阅 引言乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA1软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。本文介绍在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计音乐硬件演奏电路,并定制LPM-ROM存储音乐数据,以“梁祝”乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。1音乐演奏电路原理先介绍一下硬件电路的发声原理。声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。21.1 音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本文中选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。表1中各音符的分频系数就是从750KHz的基准频率二分频得到的375KHz频率基础上计算得到的。由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=211-1=2047,此时扬声器不会发声。3表1 各个音符的频率及其对应的分频系数(基准频率375KHz) 音符名频 率(Hz)分频系数计数初值音符名频 率(Hz)分频系数计数初值休止符37500002047中音4796.1784681579低音1294.3491274773中音5882.3534251622低音2330.3961135912中音6989.4463791668低音3370.9210111036中音71136.3633301717低音4386.5989701077高音11175.5493191728低音5394.7379501197高音21353.7902771770低音6495.3767571290高音31512.0972481799低音7555.566751372高音41609.4422331814中音1588.6976371410高音51802.8842081839中音2638.845871480高音62027.0271851862中音3742.5745051542高音72272.72716518821.2 乐曲节奏的控制本文中的梁祝乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。1.3 乐谱发生器本文将乐谱中的音符数据存储在LPM-ROM中,如“梁祝”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。1.4 乐曲演奏电路原理框图当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的4Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。曲子也就流畅的播放出来了.综上所述,得到乐曲演奏电路的原理框图如图1所示图1 乐曲演奏电路的原理框图2 音乐硬件演奏电路的设计实现音乐硬件演奏电路主要是用VHDL语言来设计,并利用MAX+PLUSII软件工具来编译、测试和仿真。根据原理框图设计的乐曲演奏电路的顶层原理图如图2所示图2 顶层原理图2.1 各个模块的功能简介根据顶层原理图,共分为music模块、地址发生器模块、分频预置数模块、十六进制模块、数控分频模块这五个模块。music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值,十六进制模块对12MHz的时钟脉冲进行16分频,得到750KHz的频率,给数控分频模块提供时钟脉冲。数控分频模块根据分频预置数输出各个音符所对应的频率。2.2 music模块 Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,将乐谱中相应的音符放在一个连续的地址上。它首先是编写音符数据文件,将乐谱中相应的音符存放在一个连续的地址上。因为1拍的时间定为1秒,提供的是4Hz的时钟频率(即1/4拍的整数倍),则需将这个音符存储在相应次数的连续几个地址上。然后对音符数据进行ROM定制,最后对定制好的ROM文件进行测试和仿真。2.2.1 音符数据文件Width=4;-“梁祝”乐曲演奏数据Depth=256;Address_radix=dec;Data_radix=dec;Content begin00: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;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:9;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:5;131:5;132:5;133:5;134:5;135:5;136:0;137:0;138:0;End;其中WIDTH=4,表示数据输出为宽为4;DEPTH=256,表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数。形成ROM中的配置数据(初始化数据)文件的方法如下:在MAX+plusII中编辑.mif文件。首先在File菜单下的New菜单上选择Text Editor File命令,进入文本编辑器,然后输入以上格式的数据文件。文件中的关键词WIDTH设置ROM的数据宽度;DEPTH设置ROM数据的深度,即4位数据的数量,文件中设置的256等效于8位地址线宽度;ADDRESS-RADIX=DEC和DATA-RADIX=DEC表示设置地址和数据的表达式格式都是十进制;地址/数据表以CONTENT BEGIN开始,以END结束;其中的地址/数据表达方式是冒号左边写ROM地址值,冒号右边写对应此地址放置的十进制数据,如46:9,表示46为地址,9为该地址中的数据。这样每读到一个地址,即可输出其相应的数据。文件编辑好后,保存时取文件名为“shuj.mif”,存盘的路径为“f:sqqff1 shujuwenjuan”。42.2.2 定制音符数据的ROM文件按照2.2.3节中的定制步骤对音符数据文件进行ROM定制,定制好的ROM文件程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY c IS PORT ( address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END c;ARCHITECTURE SYN OF c IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR (3 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 (3 DOWNTO 0) ); END COMPONENT;BEGIN q 4, LPM_WIDTHAD = 8, LPM_ADDRESS_CONTROL = REGISTERED, LPM_OUTDATA = UNREGISTERED, LPM_FILE = F:/sqqff1/shujuwenjian/shuj.mif ) PORT MAP ( address = address, inclock = inclock, q = sub_wire0 );END SYN;2.2.3 LPM-ROM定制定制的基本步骤如下:1) 进入MAX+PLUSII,选菜单 file-megawizard plug-in manager,选择“creat a new”,然后按“next”键,进入图3所示界面。选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名:“f:sqqff1music1c.vhd”,注意后缀vhd小写。图32) 单击“next”键,将出现图4所示的界面,选择ROM数据位宽度为4,地址线宽为8,即设置此ROM能存储8位二进制数据共64个,然后进入图5所示的窗口。 图43) 通过在图5所示窗口的“browse”钮,找到ROM中的加载文件路径和文件名:“f:sqqff1shujuwenjianshuj.mif”,注意ROM元件的inclock是地址锁存时钟。 图54) 在MAX+PLUSII中打开已定制的ROM文件。将它设置为工程,并确定目标器件,进行测试,仿真波形如图6。42.2.4 波形仿真将music模块中定制好的ROM文件设置为工程,对其进行仿真。仿真选用的目标芯片是FLEX10K中的EPF10K10TC144-3。仿真结果如下图:图6 音符数据定制的ROM文件的仿真波形图此模块的功能是输出相应地址上所存储的音符数据,从图中可以看到,当address是0、1、2、3时,q的输出是3;当address是4、5、6时,q的输出是5;当address是7时,q的输出是6等等都符合模块中的音符数据文件中的地址/数据表,因此这个仿真波形图证明了所定制的ROM文件实现了模块的功能。2.3 地址发生器模块地址发生器模块设置了一个8位二进制计数器(计数最大值为138),作为音符数据ROM的地址发生器。每来一个时钟脉冲信号(Clk),8位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。2.3.1 地址发生器的VHDL设计这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。那么相应随着程序4中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块。这样梁祝乐曲中的音符就一个接一个的通过toneindex3.0端口输向分频预置数模块。程序如下Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity notetabs is Port( clk : in std_logic;Toneindex : out std_logic_vector(3 downto 0); End;Architecture one of notetabs is Component c Port(address: in std_logic_vector(7 downto 0);Inclock : in std_logic;q : out std_logic_vector(3 downto 0); End component; Signal counter : std_logic_vector(7 downto 0); Begin Cnt8 : process(clk) Begin If counter=”11111111”then counter=”00000000”; Elsif(clkevent and clk=1)then countercounter,q=toneindex,inclock=clk);End;2.3.2 波形仿真将所编写的地址发生器模块的程序设为工程,选用FLEX10K中的EPF10K10TC144-3为目标芯片进行仿真。仿真结果如下图:图7 地址发生器模块的仿真波形图程序的功能是每来一个时钟,地址值递增1,并将这个地址上所存储的音符数据输出。从图中可以看到,当Clk来了一个时钟脉冲,输出相应地址上的音符3, 地址值递增1;接下来的三个时钟脉冲来时,输出也是音符3,地址连续递增3次;再下一个脉冲来时,输出为音符5等等都符合模块中的音符数据文件中的地址/数据表。这个仿真波形图证明了程序实现了地址发生器模块的功能。2.4 分频预置数模块分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。2.4.1 分频预置数模块的VHDL设计在这个模块的VHDL逻辑描述中设置了“梁祝”乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。这13个值的输出由程序3的4位输入值index3.0确定。输向程序4中index3.0的值又由地址发生器模块的输出toneindex3.0的输出值和持续时间决定。程序3如下:Library ieee;Use ieee.std_logic_1164.all;Entity tonetaba is Port( index : in std_logic_vector(3 downto 0); code : out std_logic_vector(3 downto 0); high : out std_logic;tone : out std_logic_vector(10 downto 0);End;Architecture one of tonetaba isBegin Search : process(index) Begin Case index is When “0000”=tone=”11111111111”;code=”0000”;hightone=”01100000101”;code=”0001”;hightone=”01110010000”;code=”0010”;hightone=”10000001100”;code=”0011”;hightone=”10010101101”;code=”0101”;hightone=”10100001010”;code=”0110”;hightone=”10101011100”;code=”0111”;hightone=”10110000010”;code=”0001”;hightone=”10111001000”;code=”0010”;hightone=”11000000110”;code=”0011”;hightone=”11001010110”;code=”0101”;hightone=”11010000100”;code=”0110”;hightone=”11011000000”;code=”0001”;high null; End case; End process;End;2.4.2 波形仿真将所编写的分频预置数模块的程序设为工程,仿真选用的目标芯片是MAX7000。仿真结果如下图:图8 分频预置数模块的仿真波形图模块的功能是输出各个音符所对应的分频预置数,由上面的仿真波形图可看到当index是“0000”,tone输出为2047,即休止符的分频预置数;当index是“0101”时, tone输出为1197即低音5的分频预置数;当index是“1111”时, tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数。这个仿真波形图证明了程序实现了模块的功能。 2.5 十六进制模块由其clk端输入一具有较高频率的信号(这里是12MHz)的信号,通过分频后由cout输出。这里是对12MHz的信号进行16分频得到750KHz的信号。750KHz的时钟脉冲信号是给数控分频模块提供时钟信号。2.5.1十六进制模块的VHDL设计用以下的VHDL逻辑描述来实现十六进制模块的功能。Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt16 is port( clk : in std_logic; cq : out std_logic_vector(3 downto 0); cout : out std_logic);end cnt16;architecture shiliu of cnt16 is begin process(clk) variable cqi : std_logic_vector(3 downto 0); begin if cqi1111 then cqi:=0000; elsif clkevent and clk=1 then cqi:=cqi+1; end if; if cqi=1111then cout=1; else cout=0; end if; cq=cqi; end process;end shiliu;2.5.2 波形仿真将程序设为工程,选用目标芯片为MAX7000对程序进行编译和仿真。仿真结果如下图:图9 十六进制仿真波形图此模块的功能是对输入的时钟脉冲信号的频率进行16分频。从仿真波形图上可以看到当cq从0计数到F(即15),cout输出一个脉冲,此时的Clk刚好来第16个脉冲,即cout的频率是Clk频率的16分之一。可见所编写的程序实现了模块的功能。2.6 数控分频模块音符的频率由数控分频模块获得,这是一个数控分频电路。它是由一个初值可变的加法计数器构成。该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。它计满时所需要的计数初值可由下式来表示。计数初值(Tone)=2047-分频系数而分频系数又可有下式来求:分频系数=基准频率/音符的发生频率低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。这就是利用数控分频器自动演奏音乐的原理。52.6.1 数控分频模块的VHDL设计其时钟(Clk)端输入的是在十六进制模块里对12MHz的信号进行16分频得到的750KHz,750KHz的信号根据分频预置数模块中所提供的计数初值,分别得出相应音符频率的两倍值。此时从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决定。Fout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone10.0与Fout的输出频率就有了对应关系。例如在分频预置数模块中若取tone10.0=1036,将发出音符为“3”音的信号频率。程序3如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity pulse is port ( clk : in std_logic; d : in std_logic_vector(10 downto 0); fout : out std_logic );end;architecture ONE of pulse is signal full : std_logic;begin p_reg: process(clk) variable cnt11,cnt111 : std_logic_vector(10 downto 0); begin if clkevent and clk = 1 then cnt111:= 2046 - d; if cnt11 = cnt111 then cnt11 := 00000000000; full = 1; else cnt11:= cnt11 + 1; full = 0; end if; end if; end process p_reg ; p_div: process(full) variable cnt2 : std_logic; begin if fullevent and full = 1 then cnt2 := not cnt2; if cnt2 = 1 then fout = 1; else fout clk4hz,toneindex=tin);U2 : tonetaba port map( index=tin,tone=to1,code=code1,high=high1);U3 : cnt16 port map(clk=clk12mhz,cq=cq1,cout=clkspeakera);U4 : pulse port map( clk=clkspeakera,d=to1,fout=yinyueout);End;将所编写的顶层文件程序设为当前工程,选用FLEX10K中的EPF10K10TC144-3为目标芯片对程序进行编译,仿真和元件例化。元件例化的图如下:图11 顶层文件的元件例化图 3 扩大音乐硬件演奏电路的通用性前面所设计的电路只能演奏“梁祝”曲子,但是在实际应用中,若能将电路实用于各种曲子的演奏,它的实用性和应用范围就会扩大许多。这里主要通过修改分频预置数模块的程序,使其实用于各种曲子的演奏。另外要使更改乐曲方便,主要通过重新设置音符数据文件,再对其进行LPM-ROM定制。3.1 完善分频预置数模块的功能 在前面的VHDL设计中,我们只能通过程序输出“梁祝”曲子中的13个音符的分频预置数(即计数初值),但是在其它的乐曲中可能会用到另外的那些音符,因此对程序进行修改完善它的功能,使其能输出另外那些音符的分频预置数。程序修改如下: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;Architecture one of tonetaba isBegin Search : process(index) Begin Case index is When 00000=tone=11111111111;code=00000;hightone=01100000101;code=00001;hightone=01110010000;code=00010;hightone=10000001100;code=00011;hightone=10000110101;code=00100;hightone=10010101101;code=00101;hightone=10100001010;code=00110;hightone=10101011100;code=00111;hightone=10110000010;code=01000;hightone=10111001000;code=01001;hightone=11000000110;code=01010;hightone=11000101000;code=01011;hightone=11001010110;code=01100;hightone=11010000100;code=01101;hightone=11010110101;code=01110;hightone=11011000000;code=10001;hightone=11011101010;code=10010;hightone=11100000111;code=10011;hightone=11100010110;code=10100;hightone=11100101111;code=10101;hightone=11101000110;code=10110;hightone=11101011010;code=10111;high null; End case; End process;End;将其设为当前工程,并选用FLEX10K中的EPF10K10TC144-3为目标芯片对其进行编译和仿真。仿真结果见下图:图12 修改后的分频预置数模块的仿真波形图完善后模块的功能是输出所有音符所对应的分频预置数。从图中可以看到tone的输出值与表1中的分频预置数(计数初值)相符合,并且输出了所有音符的分频预置数。因此所编写的程序实现了模块的功能。3.2 更改乐曲将3.1节中的程序代替原来此模块的程序连入顶层文件后,要使所设计的音乐硬件演奏电路可随意更改曲子,只要修改音符数据文件,在那些连续的地址上存储曲子中相应的音符,再对音符数据文件进行ROM定制,最后连接到整个电路中即可实现。4 结束语本文介绍了基于FPGA的音乐硬件演奏电路的设计,实现了一个乐曲播放器,而且描述了其工作原理、设计思路及实现方法,并在MAX+PLUS上选用目标芯片仿真实现了音乐硬件演奏电路的功能。实践证明:采用FPGA设计实现音乐硬件演奏电路的可行性和可靠性,而且更改乐曲容易,可根据需要修改ROM中的音符数据文件,从而使电路实现任一曲子的播放。这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论