《EDA乐曲硬件演奏电路设计 课程设计.doc》由会员分享,可在线阅读,更多相关《EDA乐曲硬件演奏电路设计 课程设计.doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、摘 要乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控
2、分频的原理设计乐曲硬件演奏电路,并定制LPM-ROM存储音乐数据,以“两只老虎”乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。关键词:FPGA;EDA;VHDL;音乐 目 录设计要求11、方案论证与对比11.1方案一11.2方案二11.3综合对比12 乐曲演奏电路原理22.1 音乐演奏电路原理22.2 音符频率的获得22.3 乐曲节奏的控制32.4 乐谱发生器32.5 乐曲演奏电路原理框图33音乐硬件演奏电路的设计实现43.
3、1 地址发生器模块43.1.1 地址发生器的VHDL设计43.2 分频预置数模块63.2.1 分频预置数模块的VHDL设计63.3 数控分频模块83.3.1 数控分频模块的VHDL设计83.4 music模块103.4.1 音符数据文件103.5.2 LPM-ROM定制123.6 顶层文件144 时序仿真及下载调试过程164.1 时序仿真图164.2 引脚锁定以及下载174.3调试过程及结果175扩大乐曲硬件演奏电路的通用性185.1 完善分频预置数模块的功能18设计总结与心得体会21参考文献222导验编春书计程术用 .叶版学京北第程术 著继松版业电京用发 著徐军版出工京 与字著斌明金版出清京
4、路子设 编年边版学清京 技 编继松文识的际理了趣的 对发设次,握好习炼断通,问决好能书学,去我间题识知感也同的真够得就总题明用文相有误的文够不如题到遇识见知了起在合和且识知固。 了步更关多我期计电件乐成顺指计验技用 术 学我计的周过性扩性、灵设提耗低数的了、期开短效更随可文变上此计的电演化好,设 -制和分时同设模化层 不实设电件音 放播一现使,件符 改需可,乐更靠性的奏硬音设 用明。的奏件音真片用 在法现思、原工描器播个现计电件乐 绍课本体得与能的模序写此数频符有了并符初(置的中出输 道数频应符有是功块 真仿编其片 选,为其 0 0 = 0 ;0= 00 = = ;0 ; 0 = 0 ; 00
5、 =0 = ;0 0= =0 0 0 00 = 0 0 0 00 =0 0 000 = = 00 0 ;00 =00 00 0 0 00 = 0 0 ; ; 00 = 0 00= 0= =0 0= 000000 0 0= ;000 =( ) , ( ) ) _ ) ( _ : ) ) _ _ _ )0 0 _ : ) _ ) _ _ ) _ ) _ ) _ : ( _ . 下文顶编线是示示制的 完 后,存 的 , :件 件 意 ::文件载中找” 口所图, 据制储存此置为宽程在择选界图现” “单选片选 须这。址地据数块模等出 时是 当 的时、 ; 0是 据音所址出能钟锁址 的 意,. :“名 注
6、 . :文路文中 , 的口图过口窗所图然 数二 设为宽 宽位 ,的 现键 单路选写 缀注 “件出径入的 最 面所图, “按” , 选 进下下步定 - ” :为径存 . 为名存,编文数其输,一到这数址 地 , 如数十址此边冒址 写号式表址地其 以 表/;进都达数址置表= = 数化 下据始初址地等 的文量据即深据 设 度宽的设 词的文文 编 法件据始(置的数制是输表 制信示 数 表 = 为输示 _ _ 数奏”只“;=文文 真和行件 制后制 进数后。个连数在符个则,的 即钟 是供,间时因址续一存音相乐文数编首上的个在音相将现来 用据数曲放块模 率频的高频 进时输 为数 知可表频 近接 . 即 .期号
7、脉输 0 的 数频音( 的。声的想,频率 号入,的初根的 0 = 0 # = ) 0 - , + = 0 = ) _ ( _ : ) ) 0( _ _ _ 下如率号”为出发0. 若模预在。应有率出 00 置预频样调的一决频输 定. 预 频的输 块分数的音是好/原为的时占均以个加,声利了信冲的脉号的中分数的 输端(设 块控 理原奏动器用利比 与频生发数现频控,变谱音 低的器声周信大频分 频发音率基频求下可频而分 ) 值数表下可初需时。信发音不可,的表数此,同给端的。率的作是溢此 号一生,满数, 的计成数法变值由。电数这得模数频的模频 数预的应输分 态其等频的音 为输 , “ 置预音 输 时 是
8、;预的休即 为 ,0是 置预应符出能 = ; -;= - = ;000 -= 0 =0 - 0 ;00 = = 0 -= 0 ;00 =0 0 - ; = 00 0 ; -= 0 0 - = = 000 = = ; = 0 0= = -0 0= ;0 0 00; -= ;00 0; 0= ;00= = 00 : )0 0 : _ : ) ( _ )0 ( : ( 下序。间持出的. 输模发由值0 向输0 输的程的 。 为决入输 (的生地拍间留音, 共预应对全曲虎“设描 模设设的模预 数置分音 用曲在出,”虎”初供模控即置分应音每提路查预的码乐是数分模置频 表数地件据的块都等音输冲个再增连址音也时
9、冲个来接增地 上应输冲时来 。数音存地将 值,钟每能 ) , = + 000 )0 _ ) ( _ _ ) ( : ) _ _ ( . _ 如程块预向端. 过一就音曲老样块数分端. ”符个续将 据从时地,数作频的按计的程么。 ,节了中在此“为一乐老“述辑 下在发地间续分拍四 音为, 间留数每即为频的设 器址.了出取个一符中 符增随址中 ,次器制位) (钟一每发的 数为,为大计器二 了块生 模器地率率所音出预分模频。计块频给即频块数频,发的数的所块 块发,来显中层顶,据中放是 块个模分数数频模生为共理层真和、来软 利计言 用要奏实设电件硬理理示 图原路曲到生发 为,计位一设 在 块的与输0 值.
10、 值的音间留停 在数预的所供 先功 中图定数的及速据须持系系有就频 .0 置预频分这符每决率 。. 置 比的入输 的是率时,其均触 需声驱于,式脉极号输来器数接, 由频 号) (较具入 。频个一, 图以器发或于类键琴 手琴弹 模 效的望所数这来件硬及值所个这获题素基两奏连曲时的值音符每的,框框奏曲 据数一中 就应来的 个存上地续 就符,相的 拍钟 辑逻”为符的中”“, 在存音谱生发低低速演就速拍慢,快速,就速输钟信控符音号时 可可次输符将只倍整 必(的时其, 时 生即频时个供只秒定间拍拍 节最,虎设本控奏曲 求要才计进 采分, 频大 原是时但/=占称对脉输频原频分再,率功器使力动信输。系分比(
11、信尖宽些号的分频。准 0得能分 对故 为信钟频的。频 文率基适,前差少,因方两综该际将频,误的减然虽频若。误整五四系则,准。入四频的算须,为又频,非率的个于获行频准过号率不多获率符接连 块 _” “为一需我此 和 是件 还文顶 且组码分 文 模统框路原电乐 原电演。案方。以路演简使技辑统凭,件具 大能于如得要的奏乐件纯相演乐理对合奏演乐电硬案案 路电产乐,频数模,路表音。率音之高至中谱以由音余音间 之到, 率音另。为率音个音 分间音 在相的之高音中如度 规率 乐奏件现 案案对证路电产乐块频数模,路找查计频音每高音中出以可全余音为 之 , 为频音另/为率半每半 分,音八倍差的间高音的如八每规率
12、。电件乐计 要设电件 参 _ _ 会心结0 _ 能块置分善 _ _ 性的路件曲 _ 果程试 _ 载及脚 图序 . _ 调下序 _ 件层. _ 定 . 0 件数音. 0 0 _ 块 0 设 块分控. 模分 . 设 的置频. _ 模置分 址 . _ 模器地. _ 的电硬乐 图路奏 . _ 生谱. _ _ 制节 . _ 获频符. _ 理奏乐 理奏乐 _ 比 . 案 _ _ 一. 论案 _ 要 _ - 目 - 音 奏演乐实可程连 - 新据音乐成将据音所 只奏演现段件以就 到据数,曲老“据乐 - 并电演硬理的控,器频设语 用发 品的非效片而独计以计具软的 入通件 库化造多装 的简一,这来件软今现性构保率
13、效牺允设同的万进不的间短益者辑数的多用应种,与普,换具 格,提集 随许方实备器智、机置答自广 广自、智方随, 换普应数益短不的牺保性件,的多化通的计计效品发 频的演 老数到以件奏 据乐新 可演 _ _ 案 . 案 . _ 乐 理 _ 符 制_ _ . 电 .模 _ . 模 频的 分 块_ 件 定 件 _ 下 序 果 路 善块 _ 心 参 设件。每如音的,半率另为 为音出高音找模块电证 现乐率中高在间 率为音到间音谱至音音模频电路硬演理演乐要于能件辑使路方演 路模 分组顶 此一_块 符不过行个的又,频。则系误虽减频该两少,适 频 故能 准的尖信系动器率分频称/时 分进求奏本虎拍间供频即 时必整将
14、次时音信就速,速低生音 “为逻钟相就 地存来 中 框每音曲两题这及来所效模手键于以 。 ) 接来极,声需,率 比 . 率分频 有系速的中 先供预数 音 . 的 计,生路原理件奏用利 、和共频分块 据,来发块的发块即计模分音地模 计, 每一)制 随中个了器设的即 音四续发辑“为此了。的计作时 个 .端数曲就 .预 . _ ( ( _ ) 每 地。时应 来冲址再冲音块地频分乐码路应即模虎出曲音数的设描虎全共音拍的输决 程 输发 .持间 : () ) : 0) 0 = 0 0-;000 0=00 0 ; =0= - =; =; 0 00 0 0- = 00 按图 最 径件 选 现,位设 二所过的 中
15、: . 名 . 址锁址 0 ; 是出等地这 选单”现择宽此制图 载文 存 完制是顶文 _ _ ) 0) _ ) ) _ ) ( = =) 设序真引到验蜂我曲及关实的各的时 仿 仿的仿仿脚所锁验如锁结奏 的细书程载虎可功计这它数首个择动()硬试电路两应电子,许要程实。,置对 分的面只输的预初会符修使那数 : 0 0= 0= 0= 00 0 = = 0 0; 0 = 0 0; 0 0 0 000 0 = 0 ; 0 = , 编 功符道出的符并数序的体绍乐计播工原现用件。设奏性乐需符现播 电 模同制-化演此文效短了耗设性周计术用验指电期更了固且和了遇到不误用明得的知间,书问断好,发趣际文松技清版编路
16、出明字 京出著 用业继术京学用程编 乐曲硬件演奏电路设计设计要求利用FPGA,设计一个乐曲硬件演奏电路。乐曲的12平均率规定:每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符的频率。设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。1、方案论证与对比1.1方案一利用FPGA来实现乐曲硬件演奏电路。乐曲的12平均率规定:每2个八度(如简谱中的中音1与高音1)之间的频率相差1
17、倍。在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。由此可以计算出简谱中从低音l至高音1之间每个音符的频率。设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。1.2方案二制作一个纯硬件电路来完成乐曲演奏。1.3综合对比与利用微处理器来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。所以选择方案一。2 乐曲演奏电路原理2.1 音乐演奏电路原理图1 电路原理框图该主
18、系统由三个模块:Songer顶层文件、div分频器、译码器组成。且Songer顶层文件还包括3个子文件分别是NoteTabs,ToneTaba和Speakera,此外,我们还需建立一个名为“music”的LPM_ROM模块与NoteTabs模块连接。2.2 音符频率的获得 多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提
19、下,选取合适的基准频率。本文中选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。由于最大分频系数是1274,故分频器采用11位二进制计数器才能满足要求。2.3 乐曲节奏的控制 本课设的两只老虎乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可
20、产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。 计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。2.4 乐谱发生器本文将乐谱中的音符数据存储在LPM-ROM中,如“两只老虎”乐曲中的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,音符“3”就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。2.5 乐曲演奏电路原理框图我们知道,组成乐曲的每个音符的
21、发音频率值及其持续的时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果。图1中,模块U1类似于弹琴人的手指;U2类似于琴键;U3类似于琴弦或音调发声器。音符的频率可以由图1中的SPEAKERA获得,这是一个数控分频器。由其clk端输入一具有较频率(这里是12MHz)的信号,通过SPEAKERA分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。SPEAKERA对clk输入信号的分频比由11位
22、预置数Tone10.0决定。SPKOUT的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone10.0与SPKOUT的输出频率,就有了对应关系。音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定,图1中模块TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在SPEAKERA输入口停留的时间即为此音符的节拍值。输向TONETABA中Index3.0的值ToneIndex3.0的输出值与持续的时间由模块NOTETABS决定。在NOTETABS中设置了一个8位二进制计数器,作为音符数据ROM的地址发生器。得到乐曲演奏电路的原理框图如图1所示:图1 电路原
23、理图3音乐硬件演奏电路的设计实现音乐硬件演奏电路主要是用VHDL语言来设计,并利用QuartusII软件工具来编译、测试和仿真。根据顶层原理图,共分为地址发生器模块、分频预置数模块、数控分频模块这三个模块。而music模块是存放乐曲中的音符数据,在我们的顶层原理图中并没有显示出来,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供计数初值。数控分频模块根据分频预置数输出各个音符所对应的频率。3.1 地址发生器模块 地址发生器模块设置了一个8位二进制计数器(计数最大值为138),作为音符数据ROM的地址发生器。每来一个时钟脉冲信
24、号(Clk),8位二进制计数器就计数一次,ROM文件中的地址也就随着递增,音符数据ROM中的音符也就一个接一个连续的取出来了。3.1.1 地址发生器的VHDL设计这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的VHDL逻辑描述中,“两只老虎”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。那么相应随着程序中的计数器按4Hz的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块。这样两只老虎乐曲中的音符就
25、一个接一个的通过toneindex3.0端口输向分频预置数模块。程序如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NoteTabs ISPORT (clk: IN STD_LOGIC;ToneIndex:OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END;ARCHITECTURE one OF NoteTabs ISCOMPONENT MUSICPORT (address: IN STD_LOGIC_VECTOR(7 DOWNTO 0); inclock
26、: IN STD_LOGIC; q: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END COMPONENT;SIGNAL Counter: STD_LOGIC_VECTOR (7 DOWNTO 0);BEGINCNT8: PROCESS(clk,Counter)BEGINIF Counter=138 THEN Counter=00000000;ELSIF (clkEVENT AND clk=1) THEN CounterCounter,q=ToneIndex,inclock=clk);END one;程序的功能是每来一个时钟,地址值递增1,并将这个地址上所存储的音符数
27、据输出。当Clk来了一个时钟脉冲,输出相应地址上的音符3,地址值递增1;接下来的三个时钟脉冲来时,输出也是音符3,地址连续递增3次;再下一个脉冲来时,输出为音符5等等都符合模块中的音符数据文件中的地址/数据表。3.2 分频预置数模块 分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,以”两只老虎”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。3.2.1 分频预置数模块的VHDL设计在这个模块的VHDL逻辑描述中设置了“两只老虎”乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模
28、块的时钟(Clk)的输入频率决定,在此为4Hz。这13个值的输出由程序的4位输入值index3.0确定。输向程序4中index3.0的值又由地址发生器模块的输出toneindex3.0的输出值和持续时间决定。程序如下:library ieee;use ieee.std_logic_1164.all;entity tonetaba isport(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
29、(10 downto 0);end entity tonetaba;architecture one of tonetaba isbeginsearch:process(index)begincase index iswhen0000=tone=11111111111;code=0000;hightone=01100000101;code=0001;hightone=01110010000;code=0010;hightone=10000001100;code=0011;hightone=10010101101;code=0101;hightone=10100001010;code=0110;
30、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;highnull;end case;end process;end one;模块的功能是输出各个音符所对应的分频预置数,当index是“0000”,tone输出为20
31、47,即休止符的分频预置数;当index是“0101”时, tone输出为1197即低音5的分频预置数;当index是“1111”时, tone输出为1728即高音1的分频预置数等等其它状态时,tone分别输出相应音符的分频预置数。3.3 数控分频模块 音符的频率由数控分频模块获得,这是一个数控分频电路。它是由一个初值可变的加法计数器构成。该计数器的模为2047,当计数器记满时,计数器产生一个溢出信号FULL,此溢出信号就是用作发音的频率信号。在计数器的输入端给定不同的初值,而此预置数就是表1中的计数初值,就可得到不同音符的发音频率信号。它计满时所需要的计数初值可由下式来表示。计数初值(Ton
32、e)=2047分频系数而分频系数又可有下式来求:分频系数=基准频率/音符的发生频率低音时Tone值小,分频系数大,溢出信号周期长,扬声器发出的声音低,Tone随音乐的乐谱变化大,自动控制分频比,实现了数控分频,发生信号的频率与音调Tone成正比。这就是利用数控分频器自动演奏音乐的原理。3.3.1 数控分频模块的VHDL设计其时钟(Clk)端输入的是12MHz的信号,从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,这时的频率就变为原来的1/2,刚好就是相应音符的频率。数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决
33、定。Fout的输出频率将决定每一个音符的音调,这样,分频计数器的预置值tone10.0与Fout的输出频率就有了对应关系。例如在分频预置数模块中若取tone10.0=1036,将发出音符为“3”音的信号频率。程序如下:use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speakera isport(clk: in std_logic; tone: in std_logic_vector(10 downto 0); spks: out std_logic);end entity speakera;architec
34、ture one of speakera issignal preclk,fullspks: std_logic;begindivideclk: process(clk)variable count4: std_logic_vector(3 downto 0);beginpreclk11 then preclk=1;count4:=0000;elsif clkevent and clk=1 then count4:=count4+1;end if;end process;genspks: process(preclk,tone)-11variable count11: std_logic_ve
35、ctor(10 downto 0);beginif preclkevent and preclk=1thenif 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;beginif fullspksevent and fullspks=1 then count2:=not count2;if count2=1 then spks=1;else spks=0;end if;end if;end process;end one;此模块的功能是根据初始值d的值,对输入时钟信号Clk的频率进行分频,得到想要的音符的发声频率。d的值设为6c0(即高音1的分频预置数1728),Clk的频率为750KHz,Fout输出的脉冲信号的周期为849.9291us(即1176.568Hz),接近高音1的发声频率。由表1中可知高音1的分频系数为319,即对输入时钟Clk进行319次分频就可得高音1的发声频率。3.4 music模块Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,将乐谱中相应的音符放在一个连续的地址
限制150内