1、EDA技术及其应用乐曲演奏电路蓝雪英(电子信息工程学系 指导教师:余尤好)摘要:本设计基于现场可编程门阵列FPGA,通过EDA技术,采用VHDL超高速集成电路硬件描述语言实现乐曲演奏电路,用FPGA器件驱动小扬声器演奏“世上只有妈妈好”片段。关键字:EDA 乐曲演奏电路 FPGA Max+plus软件 1原理分析1.1 EDA技术在现代电子系统的设计中,EDA技术已经成为一种普遍的工具。EDA即电子设计自动化,EDA技术的发展是,以计算机科学,微电子技术的发展为基础,并融合了应用电子技术、智能技术以及计算机图形学、拓扑学、计算数学等众多学科的最新成果发展起来的。简单的说,EDA就是立足于计算机
2、工作平台而开发出来的一整套先进的设计电子系统的软件工具。电子系统的设计方法从电子计算机辅助设计CAD、电子计算机辅助工程CAE到电子设计自动化EDA,设计的自动化程度越来越高,设计的复杂性也越来越强。它采用硬件描述语言HDL进行设计。 FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过
3、简 单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。 超高速集成电路硬件描述语言VHDL是HDL的一种,是一种标准化程度较高的硬件描述语言,主要用于描述数字系统的结构、行为、功能和接口。进入到21世纪后,EDA技术得到了更快的发展,开始步入了一个新的时期,突出地表现在以下几个方面:(1) 电子技术各个领域全方位融入EDA技术,除了日益成熟的数字技术外,可编程模拟器件的设计技术也有了很大的进步。EDA技术使得电子领域各学科的界限更加模糊,它们相互渗透和包容,如模拟与数字、软件和硬件、系统和器件、ASIC与FPGA、行为与结构等,软、硬协同设计技术也成为EDA
4、技术的一个发展方向。(2) IP核在电子设计领域得到了广泛的应用,基于IP核的SOC设计技术趋向成熟,电子设计成果的可重用性进一步提高。(3) 嵌入式微处理器软核的出现,更大规模的FPGA/CPLD器件的不断推出,使得可编程芯片系统步入实用化阶段,在一片FPGA芯片中实现一个完备的系统已成为可能。(4) 用FPGA器件实现完备硬件的数字信号处理成为可能,用纯数字逻辑进行DSP模块的设计,使得高速DSP实现成为现实,并有力地推动了软件无线电技术的实用化。基于FPGA的DSP技术为高速数字信号处理算法提供了实现途径。(5) 在设计和仿真两方面支持标准硬件描述语言的EDA软件不断推出,系统级、行为验
5、证级硬件描述语言的出现使得复杂电子系统的设计和验证更加高效。在一些大型的系统设计中,设计验证工作非常艰巨,这些高效的EDA工具的出现减轻了开发人员的工作量。1.2 Max+plus软件 Max+plus是Altera公司提供的FPGA/CPLD开发集成环境,Altera是世界上最大可编程逻辑器件的供应商之一。Max+plus界面友好,使用便捷,被誉为业界最易用易学的EDA软件。在Max+plus上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。Max+plus提供丰富的库单元供设计者调用,其中
6、包括74系列的全部器件和多种特殊的逻辑功能(Macro-Function)以及新型的参数化的兆功能(Mage-Function)。Max+plus软件具有开放核的特点,允许设计人员添加自己认为有价值的宏函数。 2总体方案设计2.1设计内容 要求设计一个乐曲演奏电路,用FPGA器件驱动小扬声器演奏“世上只有妈妈好”片段。按照图一乐谱,设计相应电路控制speaker信号的方波频率,某一频率持续时间长短,各频率间间隔大小,就可以推动小扬声器演奏乐曲。 图一 “世上只有妈妈好”乐谱片段2.2设计方案比较方案一:由单片机MSP430F149来实现乐曲演奏电路的设计,外围电源采用+3V电源供电,时钟有8M
7、Hz的晶振产生,中央处理器由MS430F149单片机来完成,乐曲演奏状态由七段数码管来模拟。这种方案,结构简单容易掌握,各部分电路实现起来都非常容易,在传统的乐曲演奏设计中也应用得较为广泛,技术成熟。其原理框图见图二。图二 单片机原理实现框图方案二:基于现场可编程门阵列FPGA,通过EDA技术。采用VHDL超高速集成电路硬件描述语言实现乐曲演奏电路设计。程序设计思想为:1、 分频电路产生不同频率方波;2、利用计数器实现speaker信号频率选择,某一频率持续时间长短,各频率间间隔大小,其原理框图见图三。图三 乐曲演奏电路原理框图 通过方案一二的比较,可以看出方案一的设计使用分立元件电路较为多,
8、因此会增加电路调试难度,且电路的不稳定性也会随之增加,而采用FPGA芯片实现的电路,由于在整体性上较好,在信号处理和整个系统的控制中,FPGA的方案能大大缩减电路的体积,提高电路的稳定性。此外其先进的开发工具使整个系统的设计调试周期大大缩短,一般来讲,同样的逻辑,基于FPGA要比基于单片机要快很多,因为它们工作的原理是完全不同的。单片机是基于指令工作的,同样的激励到达单片机后,单片机首先要判断,然后读取相应的指令,最后做出响应,每一步都是需要在单片机的时钟驱动下一步步的进行。而基于FPGA则是把相应的逻辑“暂时”固化为硬件电路,它对激励作出的响应速度是电信号从FPGA的一个管脚传播到另一个管脚
9、的传播速度,当然这指的是异步逻辑,同时电信号也要在芯片内进行一些栅电容的充放电动作,但这些动作都是非常非常快的。结合本设计的要求及综合以上比较的情况,我们选择了基于FPGA的乐曲演奏电路的方案。2.3设计过程乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能持续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率高低和持续时间,就可以使扬声器发出连续的乐曲声。首先来看怎样控制音调的高低变化。1、 音调的控制频率的高低决定了音调的高低。音乐的十二平均率规定:每两个八度音之间的频率相差一倍。在两个八度音之间,又可分为12个半音,每两个半音的频率比为
10、。另外,音名A的频率为440HZ,音名B和C之间、E和F之间为半音,其余为全音。由此可以计算出简谱中从低音1到高音1之间每个音名对应的频率如表1所示。表1 简谱中的音名与频率的关系音 名频率/Hz音 名频率/Hz音 名频率/Hz低音1261.6中音1523.3高音11046.5低音2293.7中音2587.3高音21174.7低音3329.6中音3659.3高音31318.5低音4349.2中音4698.5高音41396.9低音5392中音5784高音51568低音6440中音6880高音61760低音7493.9中音7987.8高音71975.5 所有不同频率的信号都是从同一个基准频率分频得
11、到的。由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大。若基准频率过高,虽然误差变小,但分频数将变大。实际的设计中应综合考虑这两个方面的因素,在尽量减小频率误差的前提下取合适的基准频率。本例中选取6MHz为基准频率。若无6MHz的时钟频率,则可以先分频得到6MHz或换一个新的基准频率。实际上只要各个音名间的相对频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。表2 各音阶频率对应的分频比及预置数音 名分频比预置数音 名分频比预置数低音576538730中音3455211831低音6681
12、89565中音5382712556中音1573610647中音6340912974中音2511111272高音1286713516这里需要演奏的是“世上只有妈妈好”乐曲,该乐曲各音阶频率及相应的分频比如表2所示,为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表2中的分频比就是从6MHz频率二分频得到的3MHz频率基础上计算得出的。如果用正弦波代替对称方波来驱动扬声器将会有更好的效果。从表2可以看出,最大的分频系数7653,故采用14位二进制计数器分频可满足需要。在表2中,除了给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的
13、预置数。对于不同的分频系数,只要加载不同的预置数即可。采用加载预置数实现分频的方法比采用反馈复零法节省资源,实现起来也容易一些。此外,对于乐曲中的休止符,只要将分频系数设为0,即初始值为即可,此时扬声器将不会发声。音长的控制 音符的持续时间应根据乐曲的速度及每个音符的节拍数来确定。本例演奏的世上只有妈妈好片段,最短的音符为四分音符,如果将全音符的持续时间设为1s的话,则只需要再提供一个4Hz的时钟频率即可产生四分音符的时长。图三所示的乐曲演奏电路的原理框图,其中,乐谱产生电路用来控制音乐的音调和音长。控制音调通过设置计数器的预置数来实现,预置不同的数值就可以使计数器产生不同频率的信号,从而产生
14、不同的音调。控制音长是通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间越长。每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如二分音符,在记谱时将该音名连续记录两次即可。音名显示电路用来显示乐曲演奏时应的音符。可以用三个数码管分别显示高、中、低音名,实现演奏的动态显示,十分直观。在本设计中,HIGH3:0、MID3:0、LOW3:0等信号分别用于显示高音、中音和低音音符。为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。编写程序(1)新建文件:打开Max+plus软件,新建一个Text Editor文件,操作
15、界面见图四。图四 新建一个“text editor”文件在新建文件中输入如下源程序代码:/*信号定义与说明/clk_4Hz: 用于控制音长(节拍)的时钟频率;/clk_6MHz:用于产生各种音阶频率的基准频率;/speaker:用于激励扬声器的输出信号,本例中为方波信号;/high,med,low:分别用于显示高音、中音和低音音符,各驱动一个数码管来显示*/module mama(clk_6MHz,clk_4Hz,speaker,high,mid,low);input clk_6MHz,clk_4Hz;output speaker;output3:0 high,mid,low;reg spea
16、ker;reg3:0 high,mid,low;reg7:0 counter;reg13:0 divider,origin;wire carry;assign carry=(divider=16383);always (posedge clk_6MHz) begin if(carry) divider=origin; else divider=divider+1; endalways (posedge carry) begin speaker=speaker;endalways (posedge clk_4Hz) begin case(high,mid,low) b000000000110:o
17、rigin=9565; b000000000101:origin=8730; b000001100000:origin=12974; b000001010000:origin=12556; b000000110000:origin=11831; b000000100000:origin=11272; b000000010000:origin=10647; b000100000000:origin=13516; b000000000000:origin=16383; endcase endalways (posedge clk_4Hz) begin if(counter=60) counter=
18、0; else counter=counter+1; case(counter) 0:high,mid,low=b000001100000; /中6 1:high,mid,low=b000001100000; 2:high,mid,low=b000001100000; 3:high,mid,low=b000001010000; /中5 4:high,mid,low=b000000110000; 5:high,mid,low=b000000110000; 6:high,mid,low=b000001010000; 7:high,mid,low=b000001010000; 8:high,mid,
19、low=b000001010000; 9:high,mid,low=b000100000000; 10:high,mid,low=b000001100000; 11:high,mid,low=b000001010000; 12:high,mid,low=b000001100000; 13:high,mid,low=b000001100000; 14:high,mid,low=b000001100000; 15:high,mid,low=b000001100000; 16:high,mid,low=b000000110000; /中3 17:high,mid,low=b000000110000;
20、 18:high,mid,low=b000001010000; 19:high,mid,low=b000001100000; 20:high,mid,low=b000001010000; /中5 21:high,mid,low=b000001010000; 22:high,mid,low=b000000110000; 23:high,mid,low=b000000100000; 24:high,mid,low=b000000010000; 25:high,mid,low=b000000000110; /低6 26:high,mid,low=b000001010000; /中5 27:high,
21、mid,low=b000000110000; /中3 28:high,mid,low=b000000100000; /中2 29:high,mid,low=b000000100000; 30:high,mid,low=b000000100000; 31:high,mid,low=b000000100000; 32:high,mid,low=b000000100000; 33:high,mid,low=b000000100000; 34:high,mid,low=b000000100000; 35:high,mid,low=b000000110000; /中3 36:high,mid,low=b
22、000001010000; /中5 37:high,mid,low=b000001010000; /中5 38:high,mid,low=b000001010000; /中5 39:high,mid,low=b000001100000; /中6 40:high,mid,low=b000000110000; /中3 41:high,mid,low=b000000110000; /中3 42:high,mid,low=b000000110000; /中3 43:high,mid,low=b000000100000; /中2 44:high,mid,low=b000000100000; /中2 45
23、:high,mid,low=b000000010000; /中1 46:high,mid,low=b000000010000; 47:high,mid,low=b000000010000; 48:high,mid,low=b000000010000; 49:high,mid,low=b000001010000; /中5 50:high,mid,low=b000001010000; /中5 51:high,mid,low=b000001010000; /中5 52:high,mid,low=b000000110000; /中3 53:high,mid,low=b000000100000; /中2
24、 54:high,mid,low=b000000010000; /中1 55:high,mid,low=b000000000110; /低6 56:high,mid,low=b000000010000; /中1 57:high,mid,low=b000000000101; /低5 58:high,mid,low=b000000000101; /低5 59:high,mid,low=b000000000101; /低5 60:high,mid,low=b000000000101; /低5endcaseendendmodule(2)输入完程序后保存并命名为“mama.v”,点击FileProjec
25、tset project to current file 设置此项目为当前文件,如图五所示。图五 设置为当前文件 (3)编译文件:启动MAX+plus II Compiler 菜单,。按Start 开始编译,并显示编译结果,生成下载文件见图六所示。图六 编译文件(4)添加仿真激励信号波形:a.启动axplusIIavefrom editor 菜单,进入波形编辑窗口见图七所示;b将鼠标移至空白处并单击右键出现如图八所示对话框;c.选择 enter nodes from snf 选项并按左键确认出现如图九所示界面,单击和,选择欲仿真的管脚:clk_6MHz、clk_4Hz、speaker、high
26、、mid、low,d.单击按钮,列出仿真电路的输入、输出管脚图。图七 波形编辑窗口 图八 调入设计管脚 图九 加入要仿真的管脚 (5)为clk_6MHz、clk_4Hz两个输入端口添加信号:先选中clk_6MHz输入端“ ”,然后再点击窗口左侧的时钟信号源图标“ ”添加激励波形,然后保存为mama.scf文件所示。 (6)仿真:最后打开MaxplusIISimulator 菜单仿真电路,仿真结果如图十所示。图十 仿真时序图结束语: 在本次设计中,我完成了本系统设计的要求及功能。本设计要求实现乐曲演奏的音调和音长,还要在数码管上显示频率,最终通过小扬声器产生乐曲。在设计的开始我对乐曲演奏的原理进
27、行了详细的分析:对乐曲的每个音符的频率值(音调)及其持续的时间(音长)这两个使乐曲能持续演奏所需的两个基本数据进行了深入研究。并对Max+plus软件的功能和使用方法进行了多次练习和研究。通过本次设计,在对EDA这门技术上有了更深刻的认识,也从实践的例子中去感受到了EDA设计给我们带来的改变与进步。我不仅掌握Max+plus软件的使用,与此同时,我们还对电子设计的思路有了更多的认识。由于时间和自身水平的限制,本设计在功能上只是完成了一些基本功能,对于电路的可靠性,稳定性等参数还未做过详细的测试,在音调与音长故障分析方面也还未做周全的考虑。参考文献1 王金明,冷自强.EDA技术与Verilog设
28、计M.北京:科学出版社,20082 江国强. EDA技术与应用M. 电子工业出版社,2007-05-01附录 “世上只有妈妈好”乐曲片段源程序代码/*信号定义与说明/clk_4Hz: 用于控制音长(节拍)的时钟频率;/clk_6MHz:用于产生各种音阶频率的基准频率;/speaker:用于激励扬声器的输出信号,本例中为方波信号;/high,med,low:分别用于显示高音、中音和低音音符,各驱动一个数码管来显示*/module mama(clk_6MHz,clk_4Hz,speaker,high,mid,low);input clk_6MHz,clk_4Hz;output speaker;ou
29、tput3:0 high,mid,low;reg speaker;reg3:0 high,mid,low;reg7:0 counter;reg13:0 divider,origin;wire carry;assign carry=(divider=16383);always (posedge clk_6MHz) begin if(carry) divider=origin; else divider=divider+1; endalways (posedge carry) begin speaker=speaker;endalways (posedge clk_4Hz) begin case(
30、high,mid,low) b000000000110:origin=9565; b000000000101:origin=8730; b000001100000:origin=12974; b000001010000:origin=12556; b000000110000:origin=11831; b000000100000:origin=11272; b000000010000:origin=10647; b000100000000:origin=13516; b000000000000:origin=16383; endcase endalways (posedge clk_4Hz)
31、begin if(counter=60) counter=0; else counter=counter+1; case(counter) 0:high,mid,low=b000001100000; /中6 1:high,mid,low=b000001100000; 2:high,mid,low=b000001100000; 3:high,mid,low=b000001010000; /中5 4:high,mid,low=b000000110000; 5:high,mid,low=b000000110000; 6:high,mid,low=b000001010000; 7:high,mid,l
32、ow=b000001010000; 8:high,mid,low=b000001010000; 9:high,mid,low=b000100000000; 10:high,mid,low=b000001100000; 11:high,mid,low=b000001010000; 12:high,mid,low=b000001100000; 13:high,mid,low=b000001100000; 14:high,mid,low=b000001100000; 15:high,mid,low=b000001100000; 16:high,mid,low=b000000110000; /中3 1
33、7:high,mid,low=b000000110000; 18:high,mid,low=b000001010000; 19:high,mid,low=b000001100000; 20:high,mid,low=b000001010000; /中5 21:high,mid,low=b000001010000; 22:high,mid,low=b000000110000; 23:high,mid,low=b000000100000; 24:high,mid,low=b000000010000; 25:high,mid,low=b000000000110; /低6 26:high,mid,lo
34、w=b000001010000; /中5 27:high,mid,low=b000000110000; /中3 28:high,mid,low=b000000100000; /中2 29:high,mid,low=b000000100000; 30:high,mid,low=b000000100000; 31:high,mid,low=b000000100000; 32:high,mid,low=b000000100000; 33:high,mid,low=b000000100000; 34:high,mid,low=b000000100000; 35:high,mid,low=b000000
35、110000; /中3 36:high,mid,low=b000001010000; /中5 37:high,mid,low=b000001010000; /中5 38:high,mid,low=b000001010000; /中5 39:high,mid,low=b000001100000; /中6 40:high,mid,low=b000000110000; /中3 41:high,mid,low=b000000110000; /中3 42:high,mid,low=b000000110000; /中3 43:high,mid,low=b000000100000; /中2 44:high,
36、mid,low=b000000100000; /中2 45:high,mid,low=b000000010000; /中1 46:high,mid,low=b000000010000; 47:high,mid,low=b000000010000; 48:high,mid,low=b000000010000; 49:high,mid,low=b000001010000; /中5 50:high,mid,low=b000001010000; /中5 51:high,mid,low=b000001010000; /中5 52:high,mid,low=b000000110000; /中3 53:high,mid,low=b000000100000; /中2 54:high,mid,low=b000000010000; /中1 55:high,mid,low=b000000000110; /低6 56:high,mid,low=b000000010000; /中1 57:high,mid,low=b000000000101; /低5 58:high,mid,low=b000000000101; /低5 59:high,mid,low=b000000000101; /低5 60:high,mid,low=b000000000101; /低5endcaseendendmodule
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100