论文电子琴6.docx
《论文电子琴6.docx》由会员分享,可在线阅读,更多相关《论文电子琴6.docx(33页珍藏版)》请在冰豆网上搜索。
论文电子琴6
目录
1引言1
1.1电子琴设计的背景1
1.2电子琴设计的意义1
2电子琴设计方案的比较与选择2
2.1EDA技术设计电子琴2
2.2单片机设计电子琴3
2.2555定时器设计电子琴4
3简易电子琴设计5
3.1电子琴的工作原理5
3.1.1音调控制的设计6
3.1.2节拍控制的设计7
3.2电子琴中各模块的设计7
3.2.1乐曲自动演奏电路模块9
3.2.2音调发生模块11
3.2.3数控分频模块12
3.2.4顶层设计模块13
4系统仿真16
5总结17
参考文献18
附录19
致谢31
声明32
摘要
本设计主要采用EDA技术设计简易的八音符电子琴,可以通过按键输入来控制演奏已存入的乐曲。
本设计包含乐曲自动演奏模块,音调发生模块和数控分频模块。
程序通过试运行,时序仿真,电路功能验证,顺利的实现了设计目标。
本设计的特点是成本比较低,性能稳定,精度高,有一定的开发价值。
关键词:
电子琴;VHDL语言;EDA技术
Abstract
ThispaperintroducestheVHDLlanguageandmodulardesignmethodtoproduceanelectronicpianothatcangiveasignalofthekeyboard8scale.Thissystemcansauto-playmusicthathasbeenrestoredinsystem.Thissystemincludesauto-playedmodule,tonemoduleandfrequencydividermodule.Simulationshowedthisdesigncangetagoodresult.Themostspecialtyofthedesignislowcost,stableperformanceandhighprecision.
Keywords:
Electricpiano;Very-High-SpeedHardwareDescriptionLanguage;EDA
1引言
1.1电子琴设计背景
随着社会的发展进步,音乐逐渐成为人们生活中很重要的一部分。
有人曾说过喜欢音乐的人不会向恶,所以音乐能够陶冶人们的情操。
电子琴是现代科学技术与古典音乐相结合的产物,是一种新型键盘乐器,采用半导体集成电路,对乐音信号进行放大,通过扬声器产生音响。
现在的电子琴一般使用PCM或AWM采样音源。
所谓采样就是录制乐器的声音,将其数字化后存入ROM里,然后按下键时CPU回放该音。
甚至有一些高级编曲键盘可以使用外置采样(比如Tyros3的硬盘音色)。
现代电子琴并非“模仿”乐器音色,它使用的就是真实乐器音色。
当然,现在力度触感在电子琴里是必备的。
而且现代电子琴还加上了老式电子琴的滤波器,振荡器,包络线控制来制造和编辑音色。
甚至也带上了老式电子琴的FM合成机构。
1.2电子琴设计意义
本设计是采用EDA技术设计的一个八音符电子琴,再利用VHDL文本输入法设计乐曲演奏电路。
该系统基于计算机中时钟分频器的原理,采用自上而下的设计方法来实现,通过自动演奏已存入的歌曲。
它可以通过按键输入来控制音响。
系统由乐曲自动演奏模块、音调发生模块和数控分频模块三个部分组成。
系统实现用VHDL语言按模块化方式进行,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。
利用EDA技术设计一个电子琴有如下几点意义:
(1)这种方法对研究对象的材料性质依赖较小,有易于实现、成本低,体积小等优点;
(2)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计;
(3)因为本课题对应用VHDL语言编程要求较高,所以可以通过改变程序来实现不同音色,演奏不同的乐曲,灵活性较高,比传统电子琴功能更完善;
(4)EDA技术广泛应用在现代科技生活中,本课题的研究是非常有实用和商业价值的;
(5)对本课题的研究与设计,深入对EDA技术的理解和应用。
2电子琴设计方案的分析与选择
2.1EDA技术设计电子琴
运用VHDL语言对简易电子琴的各个模块进行设计,并使用EDA工具对各模块进行仿真验证。
本设计包含如下四个模块:
乐曲自动演奏模块,音调发生模块,数控分频模块和数码管显示模块最后把各个模块整合后,通过对应关系连接起来。
将验证好的程序下载到试验箱,通过试验箱的按键来实现曲谱的演凑。
采用VHDL语言编程来实现电子琴的各项功能。
VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。
从本文描述的系统可以看出,通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;这样,使用语言描述的形式,大大缩短了开发周期,减少了开发难度,并使得系统更加灵活、稳健。
设计框图如图1所示:
图1电路结构方框图
当12MHZ的时钟脉冲来到时,数控分频器就根据分频系数输出的相应频率(即:
此音符所对应的发生频率)给扬声器,扬声器就可以发出对应音符的声音来。
连续的8HZ的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音。
乐曲也就连贯了。
2.2单片机设计电子琴
电子琴的发生原理以及如何改变音色的基本原理:
声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线不断输出“高”“低”电平,则在该口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用程序控制“高”“低”电平的持续时间,就能改变输出波形的频率从而改变音调。
乐曲中,每一音符对应着确定的频率,下表给出各音符频率。
如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音。
根据此原理设计,对于单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延时的时间就可以改变输出方波的频率。
通过对单片机系统的学习和认识,我认识到通过8051单片机p1输入到系统,可以完成此简易电子琴的任务。
使用80C51单片机做此电子琴是我们的不二选择,因为在我们的课程学子中,了解和接触最多的就是80C51,别的型号的芯片我们不熟,所以80C51是个很好的选择。
乐音实际上是有固定周期的信号,我们可以用80C51的一个定时器(如T0)控制,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在P1.0脚上输出方波周期信号,产生乐音。
根据不同的按键,调节T0的溢出时间,可输出不同频率的乐音,单片机因其体积小、功能强、价格低廉而得到广泛应用。
本设计介绍用8051单片机设计微型电子琴的方法,仅需80C51最小系统,扩展一组小键盘,再加一个音频小功放,输出到扬声器,这样就做出了一台微型电子琴。
设计框图如图2所示:
图2系统结构框图
2.3555定时器设计电子琴
本设计方案采用由两个555集成定时器组成简易电子琴。
整个电路由主振荡器,颤音振荡器,扬声器和琴键按钮等部分组成。
它的振荡频率可以通过改变振荡电路中RC元件的数值进行改变。
根据这一原理,通过设定一些不同的RC数值并通过控制电路,按照一定的速度依次将不同值的RC组件接入振荡电路,就可以使振荡电路按照设定的要求,有节奏地发阳已设定的音频信号或音乐。
设计框图如图3所示
主振荡器由555定时器,七个琴键按钮S1~S7,外接电容C1、C2,外接电阻R8以及R1~R7等元件组成。
颤音振荡器由555定时器,电容C5及R9、R10等元件组成,颤音振荡器振荡频率较低为64Hz,若将其输出电压U连接到主振荡器555定时器复位端4,则主振荡器输出端出现颤音。
按框图接线后闭合不同按键即可令喇叭发出不同频率的声响,从而模拟出电子琴的工作。
555定时器是一种模拟-数字混合式集成定时器,外形为双列直插8脚结构,体积很小,使用起来方便。
只要在外部配上几个适当的阻容元件,就可以构成史密特触发器、单稳态触发器及自激多谐振荡器等脉冲信号产生与变换电路。
它在波形的产生与变换、测量与控制、定时电路、家用电器、电子玩具、电子乐器等方面有广泛的应用。
图3系统框图
综上所述,由于本设计主要用于儿童玩具方面,因此在设计上尽量使其安全和简单易操作。
经过对以上三个方案的比较和分析,方案一容易达到技术要求且操作简单安全,对设计者自身要求也最低,因此决定选用方案一来实现电子琴的设计。
3简易电子琴设计
3.1电子琴的工作原理
声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
而乐曲中的每一音符对应着一个确定的频率,因此,要想FPGA发出不用音符的音调,实际上只要控制它输出相应音符的频率即可(音符和频率的关系见表1)。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。
由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。
图4电子琴原理框图
3.1.1音调控制的设计
频率的高低决定了音调的高低。
音乐的十二平均率规定:
每两个八度音(如简谱中的中音1和高音1)之间的频率相差一倍。
在两个八度音之间又分为十二个半音。
另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音。
由此可以计算出简谱中从低音1到高音1之间每个音名对应的频率,所有不同频率的信号都是从同一个基准频率分频得到的。
由于音阶频率多为非整数,而分频系数又不能为小数,因此必须将计算得到的分频数四舍五入取整。
若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大;若基准频率过高,虽然误差较小,但分频数将变大。
实际的设计应综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。
因此,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音分频信号。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调。
不同的音调是因为所对应的频率不同,按照这个原理我们把一个较大的频率进行不同系数的分频,就可以得到高低不同的频率,从而实现电子琴的功能。
其所输出的预数由最后一级的数控频器所决定,其计算公式如下:
由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。
由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进器发声,根据
公式
,
其中
为音阶对应的频率,故最终输出信号的频率与预置数的关系如表1所示:
图5音调控制框图
3.1.2节拍控制的设计
音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。
因此,在想控制音符的音长,就必须知道乐曲的速度和每个音符所对应的节拍数,在这个设计中所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s的话,那么一拍所应该持续的时间为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生四分音符的时长。
要想让系统知道现在应该演奏哪个音符,而这个音符持续的时间应该是多少,就必须编写乐曲文件,在乐曲文件中音符是按地址存放的,当系统工作时就按4Hz的频率依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.25秒,而如果在曲谱文件中这个音符为三拍音长,只要将该音符连续书写三遍,这时系统读乐曲文件的时候就会连续读到三次,也就会发三个0.25秒的音长,这时我们听上去就会持续了三拍的时间,通过这样一个简单的操作就可以控制音乐的音长了。
乐曲休止符,分频系数设为0,此时扬声器不发声。
本设计按最小节拍为1/4拍,若将1拍的时间定为1秒供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将音符连续输出相应的次数就可以了。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也相应的快;时钟慢时输出节拍的速度就慢,演奏的速度自然也相应的降低。
3.2电子琴中各模块设计
本设计由自顶向下的设计方式,有发声模块、自动播放模块和音调控制模块。
如下图6所示。
图6简易电子琴设计图
发声模块:
主要是根据音调的频率驱动蜂鸣器发声。
自动播放模块:
将多首音乐存放在存储器中,按照按键的变化循环演奏出选中的音乐。
音调控制模块:
根据自动演奏模块输出的音符,实现8音符的频率控制,驱动蜂鸣器发声。
图7电子琴设计流程图
本设计采用结构化程序设计方法,功能模块各自独立,实际上在设计中将按键输入和乐曲存储放在了一个自动演奏模块中。
软件设计的核心部分是数控分频器,按键输入和乐曲存储都是提供给它相应的分频比。
对输入的基准时钟信号进行多次分频,最终输出的就是想得到的音阶的频率。
首先将编译好的1首音乐存入存储器中,通过按下某按键来实现音乐的自动播放。
3.2.1乐曲自动演奏模块
此模块包含节拍产生模块和音符产生模块两个子模块,可合写成一个文件。
(1)节拍产生模块设计分析
此模块为一计数器,现在需要进一步决定计数器的模及其输入时钟频率。
根据乐曲《梁祝》的简谱,如图5所示,此乐曲以四分音符为一拍,四拍为一节,所有的音长的最小因数是一个十六分音符时值,所以以十六分音符时值作为一个状态持续时间,把乐曲《梁祝》中各个音所占据状态个数累加而得知节拍产生模块计数器的模为139,最后休止符用了3个单位时间。
根据经验设定1min演奏60拍,因此1拍持续时间即四分音符的时值为1s,一个状态持续时间即一个十六分音符时值为0.25s。
故节拍产生模块的输入时钟周期为0.25s,频率为4Hz。
(2)音符产生模块设计分析
音符产生模块的功能时将节拍电路的计数器的计数值按照乐曲《梁祝》的简谱译成对应的音符,若用Counter表示计数器的状态,Dataout表示音符符号,则可对乐曲《梁祝》的简谱出现的音作如下规定见表3。
其中输入时钟信号与CLK4Hz相连;INDEX表示音符信息。
INDEX取值为1~15,故为4为二进制信号。
PROCESS(CLK,AUTO)
VARIABLECOUNT:
INTEGERRANGE0TO10;
BEGIN
IFAUTO='1'THEN
COUNT:
=0;
CLK2<='0';
ELSE(CLK'EVENTANDCLK='1')THEN
COUNT:
=COUNT+1;
IFCOUNT>11THEN
CLK2<='1';
ELSIFCOUNT=0THEN
CLK2<='0';COUNT:
=0;
ENDIF;
ENDIF;
ENDPROCESS;
图8乐曲自动演奏模块原理图
3.2.2音调发生模块
此模块的功能是产生提供可控分频模块的分频系数、提供给外围数码管的数据。
其中,INDEX为四位二进制信号,表示音符的信息;TONE是供给可控分频模块的分频系数。
它们的关系见表1。
结构体设计分析:
PROCESS(INDEX)
BEGIN
CASEINDEXIS----------此项用来检索音调的频率,高八度和低八度共16个音符
WHEN0=>TONE<=2047;CODE<=0;HIGH<=‘0’;
WHEN1=>TONE<=773;CODE<=0;HIGH<=‘0’;
WHEN2=>TONE<=912;CODE<=0;HIGH<=‘0’;
WHEN3=>TONE<=1036;CODE<=0;HIGH<=‘0’;
WHEN4=>TONE<=1116;CODE<=0;HIGH<=‘0’;
WHEN5=>TONE<=1197;CODE<=0;HIGH<=‘0’;
WHEN6=>TONE<=1290;CODE<=0;HIGH<=‘0’;
WHEN7=>TONE<=1372;CODE<=0;HIGH<=‘0’;
WHEN8=>TONE<=1410;CODE<=0;HIGH<=‘1’;
WHEN9=>TONE<=1480;CODE<=0;HIGH<=‘1’;
WHEN10=>TONE<=1542;CODE<=0;HIGH<=‘1’;
WHEN11=>TONE<=1590;CODE<=0;HIGH<=‘1’;
WHEN12=>TONE<=1622;CODE<=0;HIGH<=‘1’;
WHEN13=>TONE<=1668;CODE<=0;HIGH<=‘1’;
WHEN14=>TONE<=1692;CODE<=0;HIGH<=‘1’;
WHEN15=>TONE<=1728;CODE<=0;HIGH<=‘1’;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
乐曲《梁祝》是C调,其频率数据见表,在表中,可控分频模块的输入时钟为12MHz,经前后
分频后为500000Hz,故供给可控分频模块的分频系数为:
,
又考虑到最大分频比为
,其中二进制表示为10110011000,故可控分频模块的计数器为11位二进制计数器。
图9音调发生模块原理图
3.2.3数控分频模块
此模块的功能是用一个可控分频电路来产生演奏音乐所需的每个音。
可控分频模块结构体描述如下:
图10数控分频模块原理图
可控分频模块是一个具有12预分频和2后分频的可控电路。
可控分频模块的输入时钟信号CLK频率选12MHz,为了使可控分频模块分频系数取值范围比较合适,输入时钟先经12分频,同时为了使输出信号SPKS具有较高的驱动功率,可控分频后再经2分频,使输出信号SPKS具有50%的占空比,从而具有较高的驱动功率。
分频电路的描述与计数器电路相似,下面进程描述一个12分频电路:
PROCESS(CLK)
VARIABLECOUNT4:
INTEGERRANGE0TO15;
BEGIN
PRECLK<=‘0’;-----将CLK进行12分频,PRECLK为CLK的12分频
IFCOUNT4>11THEN
PRECLK<=‘1’;
COUNT4:
=0;
ELSIF(CLK’EVENTANDCLK=‘1’)THEN
COUNT4:
=COUNT4+1;
ENDIF;
ENDPROCESS;
3.2.4顶层设计模块
顶层模块由乐曲自动演奏模块和音调发声模块和数控分频模块(speakera)设置一个自动演奏/键盘输入切换AUTO,即当AUTO=‘0’时,选择自动演奏音乐存储器里面的乐曲,AUTO=‘1’时,选择由键盘输入的信号,再对其进行编码输出的都是八位二进制数,对应音调发生器的输入。
模块设计原理图如图10所示:
图10顶层设计模块的原理图
ARCHITECTUREARTOFSONGERIS
COMPONENTAUTOPLAY
PORT(CLK:
INSTD_LOGIC;
AUTO:
INSTD_LOGIC;
CLK2:
BUFFERSTD_LOGIC;
DATAOUT:
ININTEGERRANGE0TO15;
INDEX:
OUTINTEGERRANGE0TO15);
ENDCOMPONENT;
COMPONENTTONETABA
PORT(INDEX:
ININTEGERRANGE0TO15;
CODE:
OUTINTEGERRANGE0TO15;
HIGH:
OUTSTD_LOGIC;
TONE:
OUTINTEGERRANGE0TO16#7FF#);
ENDCOMPONENT;
COMPONENTSPEAKERA
PORT(CLK:
INSTD_LOGIC;
TONE1:
ININTEGERRANGE0TO16#7FF#;
SPKS:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALTONE:
INTEGERRANGE0TO16#7FF#;
SIGNALTONEINDEX:
INTEGERRANGE0TO15;
BEGIN
U1:
AUTOPALYPORTMAP(CLK=>CLK8HZ,TONEINDEX=>TONEINDEX);
U2:
TONETABAPORTMAP(INDEX=>TONEINDEX,TONE=>TONE,CODE=>CODE1,HIGH=>HIGH1);
U3:
SPEAKERAPORTMAP(CLK=CLK12HZ,TONE=>TONE,SPKS=>SPKOUT);
ENDART;
4系统仿真
由于本设计从功能和时序仿真图上来判断设计是否成功不太直观。
最好的方法是完成下载验证通过实际电路验证,所以这里给出仿真结果有误差不是很符合实际效果。
(1)乐曲自动演奏模块由VHDL语言实现后,其仿真图如图11所示:
图11乐曲自动演奏模块的仿真图
该图输入系统时钟信号CLK初值设为0,自动演奏AUTO设为1,键盘输入信号INDEX2为00,INDEX0为音符信号输出,是5位的二进制代码它根据COUNT0的值改变而改变。
(2)音调发生模块由VHDL实现后,其仿真图如图12所示:
图12音调发生模块仿真图
该模块的唯一输入信号INDEX对应就是自动模块中最后的输出TONE,音符显示信号CODE,高低音显示信号HIGH和音符分频系数都是根据音符输入确定的。
由图可知输入为INDEX分别为0,1,2,3,4,5,6,7和8,9,A,C,D,E,F时分别对应CODE都是0,1,2,3,4,5,6,7。
(3)数控分频模块由VHDL程序实现后,其仿真图如图13所示:
图13数控分频模块仿真图
因TONE1为11位,时序仿真是会因为计数次数过多而次导致仿真长时间不能完成。
故为便于时序仿真,VHDL语言描述中仅将TONE1[10DOWNTO0]修改为[3DOWNTO0],其仿真结果本质一致。
由时序仿真可见,根据预置数的不同,其输出的频率也有规律性的变化。
(3)顶层设计模块由VHDL程序实现后,其仿真图如图14所示:
图14简易电子琴整个系统的仿真图
该图输入系统时钟信号CLK12MHZ初值为0,自动演奏信号AUTO初值为0。
5总结
本设计主要采用EDA技术设计一个简易的八音符电子琴,可以通过按键输入来控制音响从而演奏出已存入的乐曲。
然后利用VHDL语言编