硬件乐曲自动演奏电路设计要点Word文件下载.docx

上传人:b****6 文档编号:19960988 上传时间:2023-01-12 格式:DOCX 页数:20 大小:335.33KB
下载 相关 举报
硬件乐曲自动演奏电路设计要点Word文件下载.docx_第1页
第1页 / 共20页
硬件乐曲自动演奏电路设计要点Word文件下载.docx_第2页
第2页 / 共20页
硬件乐曲自动演奏电路设计要点Word文件下载.docx_第3页
第3页 / 共20页
硬件乐曲自动演奏电路设计要点Word文件下载.docx_第4页
第4页 / 共20页
硬件乐曲自动演奏电路设计要点Word文件下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

硬件乐曲自动演奏电路设计要点Word文件下载.docx

《硬件乐曲自动演奏电路设计要点Word文件下载.docx》由会员分享,可在线阅读,更多相关《硬件乐曲自动演奏电路设计要点Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。

硬件乐曲自动演奏电路设计要点Word文件下载.docx

4.4乐曲硬件演奏电路顶层电路的设计和仿真21

5.实验总结与心得24

6.参考文献25

前言

乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。

实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。

如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。

使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。

FPGA预装了很多已构造好的参数化库单元LPM器件。

通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。

本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,以“欢乐颂”乐曲为例,将音乐数据存储到音乐节拍器中,就达到了以纯硬件的手段来实现乐曲的演奏效果。

只要修改音乐节拍器所存储的音乐数据,将其换成其他乐曲的音乐数据,连接到程序中就可以实现其它乐曲的演奏。

关键词:

FPGA;

EDA;

VHDL;

音乐

乐曲硬件演奏电路EDA设计

1.设计要求

利用可编程逻辑器件FPGA,设计一个乐曲硬件演奏电路。

由键盘输入控制音响,同时可自动演奏乐曲。

演奏时可选择键盘输入乐曲或者已存入的乐曲,并配以一个小扬声器。

其结构如图所示,该设计产生的音乐选自"欢乐颂"片段。

图2.1乐曲演奏电路结构方框图

2.设计方案

利用FPGA来实现乐曲硬件演奏电路。

乐曲的12平均率规定:

每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍。

在2个八度音之间,又可分为12个半音,每2个半音的频率比为12/2。

另外,音符A的频率为440HZ,音符B到C之间,E到F之间为半音,其余为全音。

由此可以计算出简谱中从低音l至高音1之间每个音符的频率。

设计音符查找表电路模块,时钟模块,数控分频器模块,音乐节拍产生模块电路。

3.原理描述

产生音乐的两个因素是音乐频率和音乐的持续时间(即音高和节拍),以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。

根据设计要求,乐曲硬件演奏电路系统主要由数控分频器和乐曲存储模块组成。

数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。

乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。

3.1音名与频率的关系

音乐的十二平均率规定:

每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍.在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。

另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如下表所示.

表3-1简谱中的音名与频率的关系

音名

频率/Hz

低音1

261.63

中音1

532.25

高音1

1046.50

低音2

293.67

中音2

587.33

高音2

1174.66

低音3

329.63

中音3

659.25

高音3

1318.51

低音4

349.23

中音4

698.46

高音4

1396.92

低音5

391.99

中音5

783.99

高音5

1567.98

低音6

440

中音6

880

高音6

1760

低音7

493.88

中音7

987.76

高音7

1975.52

由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。

若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。

实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。

本设计中选取4MHz的基准频率,若无4MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。

各音阶频率及相应的分频系数如下表所示。

为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。

由于最大的分频系数为7644,故采用13位二进制计数器已能满足分频要求。

在下面表中除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为8191即可,此时扬声器将不会发声。

对于不同的分频系数,加载不同的初始值即可。

用加载初始值而不是将分频输出译码反馈,可以有效地减少本设计占用可编程逻辑器件的资源,也是同步计数器的一个常用设计技巧。

3.2控制音长的节拍发生器

该演奏电路演奏的乐曲是“欢乐颂”片段,其最小的节拍为1拍。

将1拍的时长定为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。

对于占用时间较长的节拍(一定是拍的整数倍),如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。

要求演奏时能循环进行,因此需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。

该计数器控制真值表按顺序输出简谱。

4.乐曲硬件演奏电路的层次化设计方案

根据层次化的设计思路,可把乐曲硬件演奏电路分为三个模块,音乐节拍发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频模块(speaker)。

下面给出其EDA设计过程:

4.1音乐节拍发生器NoteTabs

该模块将利用FPGA的片内ROM存放乐曲简谱真值表,由一个二进制计数器为乐曲数据存储器ROM的地址发生器。

该计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,随着NoteTaba中计数器按4Hz的时钟频率作加法计数时,即随地址值递增时,乐曲数据ROM中的音符数据,将从ROM中的输出口输向音符译码电路Tonetaba,所存储乐曲就开始连续自然地演奏起来。

二进制计数器的位数将根据所存放乐曲简谱基本节拍数来决定,对于乐曲“欢乐颂”片段其节拍数为138,即选择计数器的位数为8即可。

其VHDL源程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYNoteTabsIS

PORT(clk:

INSTD_LOGIC;

ToneIndex:

OUTINTEGERRANGE0TO15);

END;

ARCHITECTUREoneOFNoteTabsIS

SIGNALCounter:

INTEGERRANGE0TO138;

BEGIN

CNT8:

PROCESS(clk)

BEGIN

IFCounter=138THENCounter<

=0;

ELSIF(clk'

EVENTANDclk='

1'

)THEN

Counter<

=Counter+1;

ENDIF;

ENDPROCESS;

Search:

PROCESS(Counter)

CASECounterIS

WHEN00=>

ToneIndex<

=10;

WHEN01=>

WHEN02=>

WHEN03=>

WHEN04=>

WHEN05=>

WHEN06=>

WHEN07=>

WHEN08=>

=11;

WHEN09=>

WHEN10=>

WHEN11=>

WHEN12=>

=12;

WHEN13=>

WHEN14=>

WHEN15=>

WHEN16=>

WHEN17=>

WHEN18=>

WHEN19=>

WHEN20=>

WHEN21=>

WHEN22=>

WHEN23=>

WHEN24=>

WHEN25=>

WHEN26=>

WHEN27=>

WHEN28=>

=9;

WHEN29=>

WHEN30=>

WHEN31=>

WHEN32=>

=8;

WHEN33=>

WHEN34=>

WHEN35=>

WHEN36=>

WHEN37=>

WHEN38=>

WHEN39=>

WHEN40=>

WHEN41=>

WHEN42=>

WHEN43=>

WHEN44=>

WHEN45=>

WHEN46=>

WHEN47=>

WHEN48=>

WHEN49=>

WHEN50=>

WHEN51=>

WHEN52=>

WHEN53=>

WHEN54=>

WHEN55=>

WHEN56=>

WHEN57=>

WHEN58=>

WHEN59=>

WHEN60=>

WHEN61=>

WHEN62=>

WHEN63=>

WHEN64=>

WHEN65=>

WHEN66=>

WHEN67=>

WHEN68=>

WHEN69=>

WHEN70=>

WHEN71=>

WHEN72=>

WHEN73=>

WHEN74=>

WHEN75=>

WHEN76=>

WHEN77=>

WHEN78=>

WHEN79=>

WHEN80=>

WHEN81=>

WHEN82=>

WHEN83=>

WHEN84=>

WHEN85=>

WHEN86=>

WHEN87=>

WHEN88=>

WHEN89=>

WHEN90=>

WHEN91=>

WHEN92=>

WHEN93=>

WHEN94=>

WHEN95=>

WHEN96=>

WHEN97=>

WHEN98=>

WHEN99=>

WHEN100=>

WHEN101=>

WHEN102=>

WHEN103=>

WHEN104=>

WHEN105=>

WHEN106=>

WHEN107=>

WHEN108=>

WHEN109=>

WHEN110=>

WHEN111=>

WHEN112=>

WHEN113=>

WHEN114=>

WHEN115=>

WHEN116=>

WHEN117=>

WHEN118=>

WHEN119=>

WHEN120=>

WHEN121=>

WHEN122=>

WHEN123=>

WHEN124=>

WHEN125=>

WHEN126=>

WHEN127=>

WHEN128=>

WHEN129=>

WHEN130=>

WHEN131=>

WHEN132=>

WHEN133=>

WHEN134=>

WHEN135=>

WHEN136=>

WHEN137=>

WHEN138=>

WHENOTHERS=>

NULL;

ENDCASE;

ENDPROCESS;

音乐节拍发生器的仿真输出波形文件如图4.1(a)所示,分析可知仿真结果正确无误,将以上设计的音乐节拍发生器电路设置成可调用的元件,以备高层设计中使用,其元件符号如图4.1(b)所示

(a)

(b)图4.1音乐节拍发生器

(a)仿真输出波形(b)元件符号图

图4.2欢乐颂曲谱

4.2音符译码电路Tonetaba模块

音符译码电路即音调发生器实际上是一个查表电路,放置21个音乐简谱对应的频率表,根据该表为数控分频模块(speaker)提供所发音符频率的初始值,而此数在数控分频模块入口的停留时间即为此音符的节拍数,不失一般性,,以下VDHL程序中仅设置了“欢乐颂”乐曲全部音符所对应的音符频率的初始值,共16个,每个音符停留时间由音乐节拍发生器的时钟频率决定,在此为4Hz信号,这16个值的输出由对应于音符译码电路的4位输入值Index[3..0]确定,该值中音符的停留时间由音乐节拍发生器中的音符数据决定,该数据重复的次数为该音符的节拍数,如为2则为四二拍,如为4则为四四拍即全音符。

ENTITYToneTabaIS

PORT(Index:

INSTD_LOGIC_VECTOR(3DOWNTO0);

CODE:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

HIGH:

OUTSTD_LOGIC;

Tone:

OUTSTD_LOGIC_VECTOR(12DOWNTO0));

ARCHITECTUREoneOFToneTabaIS

PROCESS(Index)

CASEIndexIS

WHEN"

0000"

=>

Tone<

="

1111111111111"

;

CODE<

;

HIGH<

='

0'

--8191

0001"

1000100010001"

--4369;

0010"

1001010110010"

--4786;

0011"

1010000011111"

--5151;

0101"

1011000001000"

--5640;

0110"

1011100011110"

--5918;

0111"

1100000010110"

--6166;

1000"

1100010001000"

--6280;

1001"

1101100001001"

--6921;

1010"

1101000010010"

--6674;

1100"

1101001100111"

--6759;

1101"

1101110001110"

--7054;

1111"

1110001000010"

--7234;

WHENOTHERS=>

在源程序中Index[3..0]是音乐节拍发生器输出的音符数据;

TONE[12..0]是为数控分频模块提供的音符频率初始值,为方便测试,特设置一个音名代码显示输出CODE[3..0]和音高指示信号HIGH,可以通过一个数码管或LED来显示乐曲演奏时对应的音符和高音名。

音符译码电路Tonetaba模块的仿真输出波形如图4.2(a)所示,例如当输入Index=9,产生的分频系数便是6921,CODE输出对应该音阶简谱的显示数码2,high输出为高电平,指示音阶为高音,high输出为低电平时则指示音阶为中音,分析可知仿真结果正确无误。

将以上设计的音符译码电路To

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1