基于EDA技术的乐曲演奏电路的设计说明.docx

上传人:b****9 文档编号:25301838 上传时间:2023-06-07 格式:DOCX 页数:19 大小:150.40KB
下载 相关 举报
基于EDA技术的乐曲演奏电路的设计说明.docx_第1页
第1页 / 共19页
基于EDA技术的乐曲演奏电路的设计说明.docx_第2页
第2页 / 共19页
基于EDA技术的乐曲演奏电路的设计说明.docx_第3页
第3页 / 共19页
基于EDA技术的乐曲演奏电路的设计说明.docx_第4页
第4页 / 共19页
基于EDA技术的乐曲演奏电路的设计说明.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于EDA技术的乐曲演奏电路的设计说明.docx

《基于EDA技术的乐曲演奏电路的设计说明.docx》由会员分享,可在线阅读,更多相关《基于EDA技术的乐曲演奏电路的设计说明.docx(19页珍藏版)》请在冰豆网上搜索。

基于EDA技术的乐曲演奏电路的设计说明.docx

基于EDA技术的乐曲演奏电路的设计说明

成绩

 

指导教师:

 

成绩

指导教师:

 

《EDA技术与实验》课程设计

 

题目:

基于EDA技术的乐曲演奏电路的设计

姓名:

院系:

电子信息工程系

专业:

通信工程

班级:

通信102

学号:

指导教师:

 

2012年12月

基于EDA技术的乐曲演奏电路的设计

摘要:

此次设基于EDA技术,通过对输入脉冲的分对不同音符(高、中、低音)的控制,通过计数来实现对不同音符所持续时间长短的控制;通过Verilog语言来编程来实现乐曲演奏电路及扬声器的模拟,最后利用对Max+plusⅡ软件的仿真的时序波形图的额分析来完成“欢乐颂”片段的演奏。

关键字:

EDA;乐曲演奏;Verilog语言;Max+plusⅡ软件

前言

EDA是英文“ElectronicsDesignAutomation(电子设计自动化)”的缩写。

EDA技术是近几年迅速发展起来的计算机软件、硬件和微电子交叉的现代电子设计学科,是现代电子工程领域的一门新技术。

它是以可编程逻辑器件(PLD)为物质基础,以计算机为工作平台,以EDA工具软件为开发环境,以硬件描述语言(HDL)作为电子系统功能描述的主要方式,以电子系统设计为应用方向的电子产品自动化设计过程。

【1】

目前以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。

【2】超高速集成电路硬件描述语言VHDL是HDL的一种,是一种标准化程度较高的硬件描述语言,主要用于描述数字系统的结构、行为、功能和接口。

进入到21世纪后,EDA技术得到了更快的发展,开始步入了一个新的时期,突出地表现在以下几个方面:

电子技术各个领域全方位融入EDA技术,除了日益成熟的数字技术外,可编程模拟器件的设计技术也有了很大的进步。

EDA技术使得电子领域各学科的界限更加模糊,它们相互渗透和包容,如模拟与数字、软件和硬件、系统和器件、ASIC与FPGA、行为与结构等,软、硬协同设计技术也成为EDA技术的一个发展方向。

IP核在电子设计领域得到了广泛的应用,基于IP核的SOC设计技术趋向成熟,电子设计成果的可重用性进一步提高。

嵌入式微处理器软核的出现,更大规模的FPGA/CPLD器件的不断推出,使得可编程芯片系统步入实用化阶段,在一片FPGA芯片中实现一个完备的系统已成为可能。

用FPGA器件实现完备硬件的数字信号处理成为可能,用纯数字逻辑进行DSP模块的设计,使得高速DSP实现成为现实,并有力地推动了软件无线电技术的实用化。

基于FPGA的DSP技术为高速数字信号处理算法提供了实现途径。

在设计和仿真两方面支持标准硬件描述语言的EDA软件不断推出,系统级、行为验证级硬件描述语言的出现使得复杂电子系统的设计和验证更加高效。

在一些大型的系统设计中,设计验证工作非常艰巨,这些高效的EDA工具的出现减轻了开发人员的工作量。

Max+plusⅡ是Altera公司提供的FPGA/CPLD开发集成环境,Altera是世界上最大可编程逻辑器件的供应商之一。

Max+plusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件。

在Max+plusⅡ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。

【3】Max+plusⅡ提供丰富的库单元供设计者调用,其中包括74系列的全部器件和多种特殊的逻辑功能(Macro-Function)以及新型的参数化的兆功能(Mage-Function)。

Max+plusⅡ软件具有开放核的特点,允许设计人员添加自己认为有价值的宏函数。

1设计原理

本设计是在EDA的技术上,通过Verilog语句的编程来实现对输入脉冲的分频。

使音调和频率具有一一对应的关系。

为此,本设计将以利用数控分频器对一具有较高频率的信号进行分频来产生相应的频率。

对《欢乐颂》这首乐曲进行高、中、低音的代码编写和计数脉冲(音频的持续时间)的控制。

最后通过Max+plusⅡ软件进行仿真,通过分析仿真的时序波形图来验证设计的正确性。

2方案设计

2.1设计容

要求设计一个乐曲演奏电路,用FPGA器件驱动小扬声器演奏“欢乐颂”片段。

按照图一乐谱,设计相应电路控制speaker信号的方波频率,某一频率持续时间长短,各频率间间隔大小,就可以推动小扬声器演奏乐曲。

图一“欢乐颂”乐谱片段

2.2设计方案比较

方案一:

由单片机MSP430F149来实现乐曲演奏电路的设计,外围电源采用+3V电源供电,时钟有8MHz的晶振产生,中央处理器由MS430F149单片机来完成,乐曲演奏状态由七段数码管来模拟。

这种方案,结构简单容易掌握,各部分电路实现起来都非常容易,在传统的乐曲演奏设计中也应用得较为广泛,技术成熟。

其原理框图见图二。

图二单片机原理实现框图

方案二:

基于现场可编程门阵列FPGA,通过EDA技术。

采用VHDL超高速集成电路硬件描述语言实现乐曲演奏电路设计。

3程序设计思想

3.1分频电路产生不同频率方波;

3.2利用计数器实现speaker信号频率选择,某一频率持续时间长短,各频率间间隔大小,其原理框图见图三。

图三乐曲演奏电路原理框图

通过方案一二的比较,可以看出方案一的设计使用分立元件电路较为多,因此会增加电路调试难度,且电路的不稳定性也会随之增加,而采用FPGA芯片实现的电路,由于在整体性上较好,在信号处理和整个系统的控制中,FPGA的方案能大大缩减电路的体积,提高电路的稳定性。

此外其先进的开发工具使整个系统的设计调试周期大大缩短,一般来讲,同样的逻辑,基于FPGA要比基于单片机要快很多,因为它们工作的原理是完全不同的。

单片机是基于指令工作的,同样的激励到达单片机后,单片机首先要判断,然后读取相应的指令,最后做出响应,每一步都是需要在单片机的时钟驱动下一步步的进行。

而基于FPGA则是把相应的逻辑“暂时”固化为硬件电路,它对激励作出的响应速度是电信号从FPGA的一个管脚传播到另一个管脚的传播速度,当然这指的是异步逻辑,同时电信号也要在芯片进行一些栅电容的充放电动作,但这些动作都是非常非常快的。

结合本设计的要求及综合以上比较的情况,我们选择了基于FPGA的乐曲演奏电路的方案。

4设计过程

4.1乐曲演奏的原理

组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能持续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率高低和持续时间,就可以使扬声器发出连续的乐曲声。

首先来看怎样控制音调的高低变化。

4.2音调的控制

频率的高低决定了音调的高低。

音乐的十二平均率规定:

每两个八度音之间的频率相差一倍。

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

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

由此可以计算出简谱中从低音1到高音1之间每个音名对应的频率如表1所示。

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

音名

频率/Hz

音名

频率/Hz

音名

频率/Hz

低音1

261.6

中音1

523.3

高音1

1046.5

低音2

293.7

中音2

587.3

高音2

1174.7

低音3

329.6

中音3

659.3

高音3

1318.5

低音4

349.2

中音4

698.5

高音4

1396.9

低音5

392

中音5

784

高音5

1568

低音6

440

中音6

880

高音6

1760

低音7

493.9

中音7

987.8

高音7

1975.5

所有不同频率的信号都是从同一个基准频率分频得到的。

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

若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大。

若基准频率过高,虽然误差变小,但分频数将变大。

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

本例中选取6MHz为基准频率。

若无6MHz的时钟频率,则可以先分频得到6MHz或换一个新的基准频率。

实际上只要各个音名间的相对频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。

表2各音阶频率对应的分频比及预置数

音名

分频比

预置数

音名

分频比

预置数

低音5

7653

8730

中音3

4552

11831

低音6

6818

9565

中音5

3827

12556

中音1

5736

10647

中音6

3409

12974

中音2

5111

11272

高音1

2867

13516

这里需要演奏的是“欢乐颂”乐曲,该乐曲各音阶频率及相应的分频比如表2所示,为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。

表2中的分频比就是从6MHz频率二分频得到的3MHz频率基础上计算得出的。

如果用正弦波代替对称方波来驱动扬声器将会有更好的效果。

从表2可以看出,最大的分频系数7653,故采用14位二进制计数器分频可满足需要。

在表2中,除了给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的预置数。

对于不同的分频系数,只要加载不同的预置数即可。

采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些。

此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为

即可,此时扬声器将不会发声。

4.3音长的控制

音符的持续时间应根据乐曲的速度及每个音符的节拍数来确定。

设计中演奏的欢乐颂片段,最短的音符为四分音符,在我的设计中则只需要再提供一个4MHz的时钟频率即可产生四分音符的时长。

图三所示的乐曲演奏电路的原理框图,其中,乐谱产生电路用来控制音乐的音调和音长。

控制音调通过设置计数器的预置数来实现,预置不同的数值就可以使计数器产生不同频率的信号,从而产生不同的音调。

控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间越长。

每个音符的演奏时间都是0.25us的整数倍,对于节拍较长的音符,如二分音符,在记谱时将该音名连续记录两次即可。

音名显示电路用来显示乐曲演奏时应的音符。

可以用三个数码管分别显示高、中、低音名,实现演奏的动态显示,十分直观。

在本设计中,HIGH[3:

0]、MID[3:

0]、LOW[3:

0]等信号分别用于显示高音、中音和低音音符。

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

4.4程序代码

modulehuanlesong(clk_6MHz,clk_4MHz,speaker,high,mid,low);

inputclk_6MHz,clk_4MHz;//clk_4MHz:

用于控制音长(节拍)的时钟频率;

//clk_6MHz:

用于产生各种音阶频率的基准频率;

outputspeaker;//speaker:

用于扬声器的输出信号,在此设计中为方波信号

output[3:

0]high,mid,low;//high,med,low:

分别用于显示高音、中音和低音音符,各驱动一个数码管来显示

regspeaker;

reg[3:

0]high,mid,low;

reg[7:

0]counter;

reg[13:

0]divider,origin;

wirecarry;

assigncarry=(divider==16383);

always(posedgeclk_6MHz)

beginif(carry)divider<=origin;//如果divider==16383则执行这个

elsedivider<=divider+1;//如果if语句不成立则执行这个

end

always(posedgecarry)

beginspeaker<=~speaker;end//用非阻塞取反,避免引起自激

always(posedgeclk_4MHz)

begin

case({high,mid,low})

'b0:

origin<=9565;低音6的分预置数

'b1:

origin<=8730;低音5的分预置数

'b0:

origin<=12974;中音6的分预置数

'b0:

origin<=12556;中音5的分预置数

'b0:

origin<=11831;中音6的分预置数

'b0:

origin<=11272;中音2的分预置数

'b0:

origin<=10647;中音1的分预置数

'b0:

origin<=13516;高音1的分预置数

'b0:

origin<=16383;扬声器将不会发声时的

endcase

end

always(posedgeclk_4MHz)

begin

if(counter==71)counter<=0;

elsecounter<=counter+1;//计数器加1

case(counter)

0:

{high,mid,low}<='b0;//中3

1:

{high,mid,low}<='b0;

2:

{high,mid,low}<='b0;//中4

3:

{high,mid,low}<='b0;//中5

4:

{high,mid,low}<='b0;

5:

{high,mid,low}<='b0;

6:

{high,mid,low}<='b0;

7:

{high,mid,low}<='b0;

8:

{high,mid,low}<='b0;

9:

{high,mid,low}<='b0;

10:

{high,mid,low}<='b;

11:

{high,mid,low}<='b;

12:

{high,mid,low}<='b0;

13:

{high,mid,low}<='b0;

14:

{high,mid,low}<='b0;

15:

{high,mid,low}<='b0;

16:

{high,mid,low}<='b0;//中2

17:

{high,mid,low}<='b0;

18:

{high,mid,low}<='b0;

19:

{high,mid,low}<='b0;

20:

{high,mid,low}<='b0;//中3

21:

{high,mid,low}<='b0;

22:

{high,mid,low}<='b0;

23:

{high,mid,low}<='b0;//中5

24:

{high,mid,low}<='b0;//低4

25:

{high,mid,low}<='b0;//中3

26:

{high,mid,low}<='b0;//中2

27:

{high,mid,low}<='b0;

28:

{high,mid,low}<='b0;

29:

{high,mid,low}<='b0;

30:

{high,mid,low}<='b0;

31:

{high,mid,low}<='b0;//中2

32:

{high,mid,low}<='b0;

33:

{high,mid,low}<='b0;

34:

{high,mid,low}<='b0;

35:

{high,mid,low}<='b0;//中1

36:

{high,mid,low}<='b0;

37:

{high,mid,low}<='b0;

38:

{high,mid,low}<='b0;//中2

39:

{high,mid,low}<='b0;//中3

40:

{high,mid,low}<='b0;//中4

41:

{high,mid,low}<='b0;//中3

42:

{high,mid,low}<='b0;//中1

43:

{high,mid,low}<='b0;//中2

44:

{high,mid,low}<='b0;//中3

45:

{high,mid,low}<='b0;//中4

46:

{high,mid,low}<='b0;//中3

47:

{high,mid,low}<='b0;//中2

48:

{high,mid,low}<='b0;

49:

{high,mid,low}<='b0;//中2

50:

{high,mid,low}<='b1;//低5

51:

{high,mid,low}<='b0;//中3

52:

{high,mid,low}<='b0;//中3

53:

{high,mid,low}<='b0;//中3

54:

{high,mid,low}<='b0;//中4

55:

{high,mid,low}<='b0;//中5

56:

{high,mid,low}<='b0;//中5

57:

{high,mid,low}<='b0;//中4

58:

{high,mid,low}<='b0;//中3

59:

{high,mid,low}<='b0;//中4

60:

{high,mid,low}<='b0;//中2

61:

{high,mid,low}<='b0;//中1

62:

{high,mid,low}<='b0;//中1

63:

{high,mid,low}<='b0;//中2

64:

{high,mid,low}<='b0;//中3

65:

{high,mid,low}<='b0;//中2

66:

{high,mid,low}<='b0;//中2

67:

{high,mid,low}<='b0;//中2

68:

{high,mid,low}<='b0;//中1

69:

{high,mid,low}<='b0;//中1

70:

{high,mid,low}<='b0;//中1

71:

{high,mid,low}<='b0;//中1

endcase

end

endmodule

4.5乐谱模块电路图如下

图四顶层文件电路图

4.6仿真波形图如下

图五仿真时序波形图

4.7模块电路图如下

图六顶层文件电路外围连接图

5仿真波形图分析

在此次设计中我所设计的是用EDA技术来控制一段乐谱的演奏,如上的仿真波形,输入有两个,用CLK_6MHZ来控制这首歌的音调,CLK_4MHZ的时钟频率可产生四分音符的时长,音谱会出现在输出波形的high,mid,low中,每个音符要0.25us的时间,我所设计的这段乐谱要18,15us才能演奏完,如上波形,此时歌谱中的第二个1为高音,歌谱中的4和歌谱中的5位低音,其余的为中音,在波形都明确的显示了出来。

6结束语

在本次设计中,我基本完成了本系统设计的要求及功能。

本设计的目的是要现乐曲演奏的音调和音长,并且在数码管上显示频率,最终通过扬声器产生乐曲。

在设计的开始我对乐曲演奏的原理进行了详细的分析:

对乐曲的每个音符的频率值(音调)及其持续的时间(音长)这两个使乐曲能持续演奏所需的数据进行了研究。

也对Max+plusⅡ软件的功能和使用方法进行了多次练习和研究。

通过本次设计,在对EDA这门技术上有了更深刻的认识,也从实践的例子中去感受到了EDA设计给我们带来的进步。

不仅掌握了Max+plusⅡ软件的使用,也锻炼了自己的思维能力。

本次设计在功能上只是完成了一些基本功能,对于电路的可靠性,稳定性,准确性等参数还未做过详细的测试,乐曲的音调与音长可能会稍微有点误差。

参考文献

【1】王金明,冷自强.EDA技术与Verilog设计[M].:

科学,2008.

【2】江国强.EDA技术与应用[M].:

电子工业,2007.

【3】翁伟钿,歆奕.Max+plusⅡ在数字电路中的应用[M].:

科学,2007.

 

附录

本设计代码如下:

modulehuanlesong(clk_6MHz,clk_4MHz,speaker,high,mid,low);

inputclk_6MHz,clk_4MHz;//clk_4MHz:

用于控制音长(节拍)的时钟频率;

//clk_6MHz:

用于产生各种音阶频率的基准频率;

outputspeaker;//speaker:

用于扬声器的输出信号,在此设计中为方波信号

output[3:

0]high,mid,low;//high,med,low:

分别用于显示高音、中音和低音音符,各驱动一个数码管来显示

regspeaker;

reg[3:

0]high,mid,low;

reg[7:

0]counter;

reg[13:

0]divider,origin;

wirecarry;

assigncarry=(divider==16383);

always(posedgeclk_6MHz)

beginif(carry)divider<=origin;//如果divider==16383则执行这个

elsedivider<=divider+1;//如果if语句不成立则执行这个

end

always(posedgecarry)

beginspeaker<=~speaker;end//用非阻塞取反,避免引起自激

always(posedgeclk_4MHz)

begin

case({high,mid,low})

'b0:

origin<=9565;低音6的分预置数

'b1:

origin<=8730;低音5的分预置数

'b0:

origin<=12974;中音6的分预置数

'b0:

origin<=12556;中音5的分预置数

'b0:

origin<=11831;中音6的分预置数

'b0:

origin<=11272;中音2的分预置数

'b0:

origin<=10647;中音1的分预置数

'b0:

origin<=13516;高音1的分预置数

'b0:

origin<=16383;扬声器将不会发声时的

endcase

end

always(posedgeclk_4MHz)

begin

if(counter==71)counter<=0;

elsecounter<=counter+1;//计数器加1

case(counter)

0:

{high,mid,low}<='b0;//中3

1:

{high,mid,low}<='b0;

2:

{high,mid,low}<='b0;//中4

3:

{high,mid,low}<='b0;//中5

4:

{high,mid,low}<='b0;

5:

{high,mid,low}<='b0;

6:

{high,mid,low}<='b0;

7:

{high,mid,low}<='b0;

8:

{high,mid,low}<='b0;

9:

{high,mid,low}<='b0;

10:

{high,mid,low}<='b;

11:

{high,mid,low}<='b;

12:

{

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

当前位置:首页 > 小学教育 > 小升初

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

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