《友谊地久天长》乐曲演奏电路设计.docx
《《友谊地久天长》乐曲演奏电路设计.docx》由会员分享,可在线阅读,更多相关《《友谊地久天长》乐曲演奏电路设计.docx(19页珍藏版)》请在冰豆网上搜索。
《友谊地久天长》乐曲演奏电路设计
黑龙江科技学院
课程设计任务书
一、设计题目:
二、设计的主要内容:
指导教师:
日期:
教师评语:
评阅成绩:
评阅人:
日期:
摘要
与利用微处理器(CPU或MCU)来实现乐曲演奏相比,以纯硬件完成乐曲演奏电路的逻辑要复杂得多,如果不借助于功能强大的EDA工具和硬件描述语言,仅凭传统的数字逻辑技术,即使最简单的演奏电路也难以实现。
如何使用EDA工具设计电子系统是人们普遍关心的问题,本设计在美国ALTERA公司MAX+plusⅡ的EDA软件平台上,使用层次化设计方法,实现了乐曲发生器的设计。
本系统是利用硬件描述语言VHDL的设计思想设计的一个乐曲演奏电路,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现。
系统由音调发生模块和数控分频模块两个部分组成。
系统实现是用硬件描述语言VHDL按模块化方式进行设计,然后进行编程、时序仿真、整合。
本系统功能比较齐全,有一定的使用价值。
关键词:
乐曲;4MHz时钟;VHDL;EDA
第1章《友谊地久天长》乐曲演奏电路设计概述
1.1系统设计目的
本系统是利用硬件描述语言VHDL的设计思想设计的一个乐曲演奏电路,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现。
系统由音调发生模块和数控分频模块两个部分组成。
系统实现是用硬件描述语言VHDL按模块化方式进行设计,然后进行编程、时序仿真、整合,本系统功能比较齐全,有一定的使用价值。
1.2设计要求
1.2.设计任务
(1)音高与频率的对应关系见下表1_1:
1
2
3
4
5
6
7
低音
131
147
165
175
196
221
248
中音
262
294
330
350
393
441
496
高音
525
589
661
700
786
882
990
音高与频率的对应关系见下表1_1
(2)《友谊地久天长》乐谱见图1_2:
第2章《友谊地久天长》乐曲演奏电路设计思想
2.1系统设计方案
2.1.1音符与频率的关系
我们知道,组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需的2个基本要素,首先让我们来了解音符与频率的关系。
乐曲的12平均率规定:
每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。
在2个八度音之间,又可分为12个半音,每2个半音的频率比为12√2。
另外,音符A(简谱中的低音6)的频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音。
由此可以计算出简谱中从低音l至高音1之间每个音符的频率,如表1所示:
产生各音符所需的频率可用一分频器实现,由于各音符对应的频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。
若分频器时钟频率过低,则由于分频系数过小,四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但会增加分频器的分频级数。
实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取合适的时钟频率。
本文设计的乐曲发生器选取4MHz的基准频率。
若无4MHz的时钟频率,则可以先分频得到4MHz或换一个新的基准频率。
实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会"走调"。
表1_1中的分频系数是从8MHz频率二分频得到的4MHz频率基础上计算得出的。
由于最大的分频系数为9101,故采用14位二进制计数器已能满足分频要求。
1
2
3
4
5
6
7
低音
131
147
165
175
196
221
248
中音
262
294
330
350
393
441
496
高音
525
589
661
700
786
882
990
音高与频率的对应关系见下表1_1
2.1.2程序设计原理
我们在美国AI.TERA公司MAX+plusⅡ的EDA软件平台上,使用层次化设计手段,实现了《友谊地久天长》乐曲发生器的设计。
图2为《友谊地久天长》乐曲发生器的顶层电路
音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,TABLE元件首先是为PULSE元件提供决定所发音符的分频预置数,而此数停留的时间即为此音符的节拍值。
在TABLE元件中设置了一个8位二进制计数器(计数最大值为138),这个计数器的计数频率选为4Hz,所以每一计数值的停留时间为0.25s,即四四拍的4分音符持续时间。
例如,《友谊地久天长》乐曲的第一个音符低音3"(1拍),停留的时间需用4个计数时钟节拍,即1s。
相应地,所对应的"低音3"音符分频预置值为9100,其值在AF[13..0]输出端停留了1s。
随着TABLE元件中的计数器按4Hz的时钟速率作加法计数时,《友谊地久天长》乐曲就开始连续自然地演奏起来了。
2.2各模块功能
模块总体框图如下:
模块PAIA控制每一个音的长短,送初值给FANA模块,从而控制音高。
音符的持续时间必须根据乐曲的速度以及每个音符的节拍数决定,因此此模块的功能也就是为FANA提供决定所发音的分频预置值,而此数在FANA输入口停留时间即为此音节节拍值。
模块FANA的功能是根据PAIA送来的初值倒计时,每次计到0时就使信号Q反转,由于初值不同,从而产生不同的音高。
所以音符的频率可以由此模块得到。
2.3系统工作原理及其流程
本程序设计主要应用了一下知识点:
(1)根据本程序的基本要求,设定脉冲上升沿有效;
(2)在尽量减小频率误差的前提下取合适的时钟频率,根据音高与频率的对应关系设定程序输入、输出;
(3)在元件中设置了一个8位二进制计数器(计数最大值为138),这个计数器的计数频率选为4Hz,所以每一计数值的停留时间为0.25s,即四四拍的4分音符持续时间
(4)使CLK6MH2与C10ck9相接(接受6MHz时钟频率),CLK4Hz与Clock2相接(接收4Hz时钟频率),发音输出接SPEAK
(5)设计输入根据电路设计所提出的要求,将程序输入到VHDL编辑器中去编辑。
(6)功能级模拟用VHDL,模拟器对编辑后的程序进行模拟,如果达不到设计要求,则可以重新修改程序,直到通过功能模拟。
(7)逻辑综合与优化将通过功能模拟的程序放到VHDL编译器中,进行逻辑综合与优化。
(8)门级模拟对电路用VHDL。
仿真器仿真。
可对门级电路的延时、定时状态、驱动能力等进行仿真。
如不符合要求,可重复步骤(3),再门级模拟,直到符合要求止。
第3章系统仿真/硬件验证
系统的有关仿真结果:
模块PAIA控制每一个音的长短,此模块输出Q送初值给FANA模块,从而控制音高。
音符的持续时间必须根据乐曲的速度以及每个音符的节拍数决定,因此此模块的功能也就是为FANA提供决定所发音的分频预置值,而此数在FANA输入口停留时间即为此音节节拍值即为图中q值。
模块FANA的功能是根据PAIA送来的初值倒计时,每次计到0时就使信号Q反转,由于初值不同,从而产生不同的音高。
第4章课程设计总结与分析
在完成此次课程设计后,我发现自己还有很多不足,所学到的知识还远不够,以至于还有一些功能被动完成。
但通过学习一次实践,增强了我的动手能力,提高和巩固了VHDL语言方面的知识,特别是对程序的总体熟练程度。
从中增强了我们的团队合作精神,并让我们认识到吧理论联系实际中式那么的重要。
经过努力,《友谊地久天长》乐曲演奏电路的设计基本上完成了。
在整个设计过程中,我收获了很多,现总结如下:
1)这个设计的基本是接触一门新的语言并加以应用,对于我来说,没有想到的是入手的速度比我的预料快,在以前编程的基础上,从接触到开始动手编程的时间得到了很大的缩短。
知识的接收速度在很大的程度上决定了动手的时间。
2)VHDL的编程与C语言的编程有着本质的不同,然而以往形成的旧编程习惯在VHDL编程中依然起着很大的作用。
一通百通,不是没有道理的。
对于学习新的知识并予以应用的信心,显得更足了。
3)VHDL的设计关键是电路逻辑设计,而一个程序的关键是总体设计。
对于硬件设计接触不多的我们清楚这一点也许不无好处。
4)通过这个程序设计让我学会一种新的语言,对数字系统结构也有了更进一步的了解和认识,对我以后的学习有很大的帮助。
希望其他人在看再做类似设计时有所借鉴。
通过几天的课程设计,我对数据库软件EDA技术、VHDL、等系列知识都有了一定的了解。
使用EDA技术开发页面的能力也有了很大提高。
在整个设计过程中,有很多人对任务的完成给予了重要的支持和帮助。
感谢老师给了我本次设计的机会并提供指导;感谢许多同学在我此课程设计遇到问题时给我的帮助使我能够顺利地进行设计的工作;论坛中有很多认识不认识的朋友也都为我的设计提出了很宝贵的建议,同样在这里感谢他们。
参考文献
[l][16]付家才,EDA原理与应用,化学工业出版社,2000年
[2]黄仁欣,EDA技术使用教程,清化大学出版社,2006年
[3]潘松,王国栋,VHDL使用教,电子科技大学出版社,2005年
[4]孙国丽,朱维勇,栾铭,EDA与数字系统设计,机械工业出版社,2004年
[5]李国洪,沈明山.可编程器件EDA技术与实践.北京机械工业出版社,2004年
程序清单:
LIBRARYieee;
USEieee.std_logic_1164.all;
entitypaiais
port(clk:
instd_logic;
q:
outintegerrange0to10204);
endpaia;
architecturepai_arcofpaiais
begin
process(clk)
variablecnt1:
integerrange0to1500000;
variablecnt2:
integerrange0to8;
variablen:
integerrange0to45;
begin
ifclk'eventandclk='1'then
ifcnt1<1500000then
cnt1:
=cnt1+1;
else
cnt1:
=0;
casenis
when0=>q<=10204;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=1;
endif;
when1=>q<=7634;
ifcnt2<6then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=2;
endif;
when2=>q<=6061;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=3;
endif;
when3=>q<=6803;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=4;
endif;
when4=>q<=7634;
n:
=5;
when5=>q<=6803;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=6;
endif;
when6=>q<=6061;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=7;
endif;
when7=>q<=7634;
ifcnt2<4then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=8;
endif;
when8=>q<=6061;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=9;
endif;
when9=>q<=5089;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=10;
endif;
when10=>q<=4534;
ifcnt2<9then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=11;
endif;
when11=>q<=5089;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=12;
endif;
when12=>q<=6061;
ifcnt2<2then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=13;
endif;
when13=>q<=7634;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=14;
endif;
when14=>q<=6803;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=15;
endif;
when15=>q<=7634;
n:
=16;
when16=>q<=6803;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=17;
endif;
when17=>q<=6061;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=8;
endif;
when18=>q<=7634;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=19;
endif;
when19=>q<=9050;
ifcnt2<2then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=20;
endif;
when20=>q<=10204;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=21;
endif;
when21=>q<=7634;
ifcnt2<7then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=22;
endif;
when22=>q<=4534;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=23;
endif;
when23=>q<=5089;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=24;
endif;
when24=>q<=6061;
ifcnt2<2then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=25;
endif;
when25=>q<=7634;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=26;
endif;
when26=>q<=6834;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=27;
endif;
when27=>q<=7634;
n:
=28;
when28=>q<=6803;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=29;
endif;
when29=>q<=4534;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=30;
endif;
when30=>q<=5089;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=31;
endif;
when31=>q<=6061;
ifcnt2<2then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=32;
endif;
when32=>q<=5089;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=33;
endif;
when33=>q<=4534;
ifcnt2<7then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=34;
endif;
when34=>q<=3809;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=35;
endif;
when35=>q<=5089;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=36;
endif;
when36=>q<=6061;
ifcnt2<2then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=37;
endif;
when37=>q<=7634;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=38;
endif;
when38=>q<=6803;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=39;
endif;
when39=>q<=6803;
n:
=40;
when40=>q<=6803;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=41;
endif;
when41=>q<=6061;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=42;
endif;
when42=>q<=7634;
ifcnt2<3then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=43;
endif;
when43=>q<=9050;
ifcnt2<2then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=44;
endif;
when44=>q<=10204;
ifcnt2<1then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=45;
endif;
when45=>q<=7634;
ifcnt2<7then
cnt2:
=cnt2+1;
else
cnt2:
=0;
n:
=0;
endif;
endcase;
endif;
endif;
endprocess;
endpai_arc;
LIBRARYieee;
USEieee.std_logic_1164.all;
entityfanais
port(a:
inintegerrange0to10204;
clk:
instd_logic;
q:
outstd_logic);
endfana;
architecturefan_arcoffanais
begin
process(clk)
variableb,d:
std_logic;
variablec:
integerrange0to10204;
begin
ifclk'eventandclk='1'then
ifb='0'then
c:
=a;
b:
='1';
else
ifc=0then
b:
='0';
d:
=notd;
else
c:
=c-1;
endif;
endif;
endif;
q<=d;
endprocess;
endfan_arc;
黑龙江科技学院
课程设计任务书
一、设计题目:
《友谊地久天长》乐曲演奏电路设计
二、设计的主要内容:
演奏电路可以控制每一个音的长短,从而控制音高。
音符的持续时间根据乐曲的速度以及每个音符的节拍数决定,而此数在电路一模块输入口停留时间即为此音节节拍值。
模块根据上一模块送来的初值倒计时,每次计到0时就使信号Q反转,由于初值不同,从而产生不同的音高。
所以音符的频率可以由此模块得到。
指导教师:
日期:
教师评语:
评阅成绩:
评阅人:
日期: