《EDA课程设计报告(共11页).doc》由会员分享,可在线阅读,更多相关《EDA课程设计报告(共11页).doc(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上EDA技术及其应用乐曲演奏电路蓝雪英(电子信息工程学系 指导教师:余尤好)摘要:本设计基于现场可编程门阵列FPGA,通过EDA技术,采用VHDL超高速集成电路硬件描述语言实现乐曲演奏电路,用FPGA器件驱动小扬声器演奏“世上只有妈妈好”片段。关键字:EDA 乐曲演奏电路 FPGA Max+plus软件 1原理分析1.1 EDA技术在现代电子系统的设计中,EDA技术已经成为一种普遍的工具。EDA即电子设计自动化,EDA技术的发展是,以计算机科学,微电子技术的发展为基础,并融合了应用电子技术、智能技术以及计算机图形学、拓扑学、计算数学等众多学科的最新成果发展起来的。简单的
2、说,EDA就是立足于计算机工作平台而开发出来的一整套先进的设计电子系统的软件工具。电子系统的设计方法从电子计算机辅助设计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、行为与结构等,软、硬协同设计技
4、术也成为EDA技术的一个发展方向。(2) IP核在电子设计领域得到了广泛的应用,基于IP核的SOC设计技术趋向成熟,电子设计成果的可重用性进一步提高。(3) 嵌入式微处理器软核的出现,更大规模的FPGA/CPLD器件的不断推出,使得可编程芯片系统步入实用化阶段,在一片FPGA芯片中实现一个完备的系统已成为可能。(4) 用FPGA器件实现完备硬件的数字信号处理成为可能,用纯数字逻辑进行DSP模块的设计,使得高速DSP实现成为现实,并有力地推动了软件无线电技术的实用化。基于FPGA的DSP技术为高速数字信号处理算法提供了实现途径。(5) 在设计和仿真两方面支持标准硬件描述语言的EDA软件不断推出,
5、系统级、行为验证级硬件描述语言的出现使得复杂电子系统的设计和验证更加高效。在一些大型的系统设计中,设计验证工作非常艰巨,这些高效的EDA工具的出现减轻了开发人员的工作量。1.2 Max+plus软件 Max+plus是提供的FPGA/CPLD开发集成环境,Altera是世界上最大的供应商之一。Max+plus界面友好,使用便捷,被誉为业界最易用易学的EDA。在Max+plus上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。Max+plus提供丰富的库单元供设计者调用,其中包括74系列的全部器
6、件和多种特殊的逻辑功能(Macro-Function)以及新型的参数化的兆功能(Mage-Function)。Max+plus软件具有开放核的特点,允许设计人员添加自己认为有价值的宏函数。 2总体方案设计2.1设计内容 要求设计一个乐曲演奏电路,用FPGA器件驱动小扬声器演奏“世上只有妈妈好”片段。按照图一乐谱,设计相应电路控制speaker信号的方波频率,某一频率持续时间长短,各频率间间隔大小,就可以推动小扬声器演奏乐曲。 图一 “世上只有妈妈好”乐谱片段2.2设计方案比较方案一:由单片机MSP430F149来实现乐曲演奏电路的设计,外围电源采用+3V电源供电,时钟有8MHz的晶振产生,中央
7、处理器由MS430F149单片机来完成,乐曲演奏状态由七段数码管来模拟。这种方案,结构简单容易掌握,各部分电路实现起来都非常容易,在传统的乐曲演奏设计中也应用得较为广泛,技术成熟。其原理框图见图二。图二 单片机原理实现框图方案二:基于现场可编程门阵列FPGA,通过EDA技术。采用VHDL超高速集成电路硬件描述语言实现乐曲演奏电路设计。程序设计思想为:1、 分频电路产生不同频率方波;2、利用计数器实现speaker信号频率选择,某一频率持续时间长短,各频率间间隔大小,其原理框图见图三。图三 乐曲演奏电路原理框图 通过方案一二的比较,可以看出方案一的设计使用分立元件电路较为多,因此会增加电路调试难
8、度,且电路的不稳定性也会随之增加,而采用FPGA芯片实现的电路,由于在整体性上较好,在信号处理和整个系统的控制中,FPGA的方案能大大缩减电路的体积,提高电路的稳定性。此外其先进的开发工具使整个系统的设计调试周期大大缩短,一般来讲,同样的逻辑,基于FPGA要比基于单片机要快很多,因为它们工作的原理是完全不同的。单片机是基于指令工作的,同样的激励到达单片机后,单片机首先要判断,然后读取相应的指令,最后做出响应,每一步都是需要在单片机的时钟驱动下一步步的进行。而基于FPGA则是把相应的逻辑“暂时”固化为硬件电路,它对激励作出的响应速度是电信号从FPGA的一个管脚传播到另一个管脚的传播速度,当然这指
9、的是异步逻辑,同时电信号也要在芯片内进行一些栅电容的充放电动作,但这些动作都是非常非常快的。结合本设计的要求及综合以上比较的情况,我们选择了基于FPGA的乐曲演奏电路的方案。2.3设计过程乐曲演奏的原理是这样的:组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能持续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率高低和持续时间,就可以使扬声器发出连续的乐曲声。首先来看怎样控制音调的高低变化。1、 音调的控制频率的高低决定了音调的高低。音乐的十二平均率规定:每两个八度音之间的频率相差一倍。在两个八度音之间,又可分为12个半音,每两个半音的频率比为。另外,音名A的频率
10、为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低音668189565中音538
12、2712556中音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 speake
16、r;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) b0:origin=9565; b
17、1:origin=8730; b0:origin=12974; b0:origin=12556; b0:origin=11831; b0:origin=11272; b0:origin=10647; b0:origin=13516; b0:origin=16383; endcase endalways (posedge clk_4Hz) begin if(counter=60) counter=0; else counter=counter+1; case(counter) 0:high,mid,low=b0; /中6 1:high,mid,low=b0; 2:high,mid,low=b0;
18、 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=b0; 11:high,mid,low=b0; 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; /中3 17:high,mid,low=b0
19、; 18:high,mid,low=b0; 19:high,mid,low=b0; 20:high,mid,low=b0; /中5 21:high,mid,low=b0; 22:high,mid,low=b0; 23:high,mid,low=b0; 24:high,mid,low=b0; 25:high,mid,low=b0; /低6 26:high,mid,low=b0; /中5 27:high,mid,low=b0; /中3 28:high,mid,low=b0; /中2 29:high,mid,low=b0; 30:high,mid,low=b0; 31:high,mid,low=b0
20、; 32:high,mid,low=b0; 33:high,mid,low=b0; 34:high,mid,low=b0; 35:high,mid,low=b0; /中3 36:high,mid,low=b0; /中5 37:high,mid,low=b0; /中5 38:high,mid,low=b0; /中5 39:high,mid,low=b0; /中6 40:high,mid,low=b0; /中3 41:high,mid,low=b0; /中3 42:high,mid,low=b0; /中3 43:high,mid,low=b0; /中2 44:high,mid,low=b0; /中
21、2 45:high,mid,low=b0; /中1 46:high,mid,low=b0; 47:high,mid,low=b0; 48:high,mid,low=b0; 49:high,mid,low=b0; /中5 50:high,mid,low=b0; /中5 51:high,mid,low=b0; /中5 52:high,mid,low=b0; /中3 53:high,mid,low=b0; /中2 54:high,mid,low=b0; /中1 55:high,mid,low=b0; /低6 56:high,mid,low=b0; /中1 57:high,mid,low=b1; /低
22、5 58:high,mid,low=b1; /低5 59:high,mid,low=b1; /低5 60:high,mid,low=b1; /低5endcaseendendmodule(2)输入完程序后保存并命名为“mama.v”,点击FileProjectset project to current file 设置此项目为当前文件,如图五所示。图五 设置为当前文件 (3)编译文件:启动MAX+plus II Compiler 菜单,。按Start 开始编译,并显示编译结果,生成下载文件见图六所示。图六 编译文件(4)添加仿真激励信号波形:a.启动axplusIIavefrom editor
23、菜单,进入波形编辑窗口见图七所示;b将鼠标移至空白处并单击右键出现如图八所示对话框;c.选择 enter nodes from snf 选项并按左键确认出现如图九所示界面,单击和,选择欲仿真的管脚:clk_6MHz、clk_4Hz、speaker、high、mid、low,d.单击按钮,列出仿真电路的输入、输出管脚图。图七 波形编辑窗口 图八 调入设计管脚 图九 加入要仿真的管脚 (5)为clk_6MHz、clk_4Hz两个输入端口添加信号:先选中clk_6MHz输入端“ ”,然后再点击窗口左侧的时钟信号源图标“ ”添加激励波形,然后保存为mama.scf文件所示。 (6)仿真:最后打开Max
24、plusIISimulator 菜单仿真电路,仿真结果如图十所示。图十 仿真时序图结束语: 在本次设计中,我完成了本系统设计的要求及功能。本设计要求实现乐曲演奏的音调和音长,还要在数码管上显示频率,最终通过小扬声器产生乐曲。在设计的开始我对乐曲演奏的原理进行了详细的分析:对乐曲的每个音符的频率值(音调)及其持续的时间(音长)这两个使乐曲能持续演奏所需的两个基本数据进行了深入研究。并对Max+plus软件的功能和使用方法进行了多次练习和研究。通过本次设计,在对EDA这门技术上有了更深刻的认识,也从实践的例子中去感受到了EDA设计给我们带来的改变与进步。我不仅掌握Max+plus软件的使用,与此同
25、时,我们还对电子设计的思路有了更多的认识。由于时间和自身水平的限制,本设计在功能上只是完成了一些基本功能,对于电路的可靠性,稳定性等参数还未做过详细的测试,在音调与音长故障分析方面也还未做周全的考虑。参考文献1 王金明,冷自强.EDA技术与Verilog设计M.北京:科学出版社,20082 江国强. EDA技术与应用M. 电子工业出版社,2007-05-01附录 “世上只有妈妈好”乐曲片段源程序代码/*信号定义与说明/clk_4Hz: 用于控制音长(节拍)的时钟频率;/clk_6MHz:用于产生各种音阶频率的基准频率;/speaker:用于激励扬声器的输出信号,本例中为方波信号;/high,m
26、ed,low:分别用于显示高音、中音和低音音符,各驱动一个数码管来显示*/module mama(clk_6MHz,clk_4Hz,speaker,high,mid,low);input clk_6MHz,clk_4Hz;output speaker;output3: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)
27、 divider=origin; else divider=divider+1; endalways (posedge carry) begin speaker=speaker;endalways (posedge clk_4Hz) begin case(high,mid,low) b0:origin=9565; b1:origin=8730; b0:origin=12974; b0:origin=12556; b0:origin=11831; b0:origin=11272; b0:origin=10647; b0:origin=13516; b0:origin=16383; endcase
28、 endalways (posedge clk_4Hz) begin if(counter=60) counter=0; else counter=counter+1; case(counter) 0:high,mid,low=b0; /中6 1:high,mid,low=b0; 2:high,mid,low=b0; 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:
29、high,mid,low=b0; 11:high,mid,low=b0; 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; /中3 17:high,mid,low=b0; 18:high,mid,low=b0; 19:high,mid,low=b0; 20:high,mid,low=b0; /中5 21:high,mid,low=b0; 22:high,mid,low=b0; 23:high,mid,low=b0; 24:high,mid,low
30、=b0; 25:high,mid,low=b0; /低6 26:high,mid,low=b0; /中5 27:high,mid,low=b0; /中3 28:high,mid,low=b0; /中2 29:high,mid,low=b0; 30:high,mid,low=b0; 31:high,mid,low=b0; 32:high,mid,low=b0; 33:high,mid,low=b0; 34:high,mid,low=b0; 35:high,mid,low=b0; /中3 36:high,mid,low=b0; /中5 37:high,mid,low=b0; /中5 38:high
31、,mid,low=b0; /中5 39:high,mid,low=b0; /中6 40:high,mid,low=b0; /中3 41:high,mid,low=b0; /中3 42:high,mid,low=b0; /中3 43:high,mid,low=b0; /中2 44:high,mid,low=b0; /中2 45:high,mid,low=b0; /中1 46:high,mid,low=b0; 47:high,mid,low=b0; 48:high,mid,low=b0; 49:high,mid,low=b0; /中5 50:high,mid,low=b0; /中5 51:high,mid,low=b0; /中5 52:high,mid,low=b0; /中3 53:high,mid,low=b0; /中2 54:high,mid,low=b0; /中1 55:high,mid,low=b0; /低6 56:high,mid,low=b0; /中1 57:high,mid,low=b1; /低5 58:high,mid,low=b1; /低5 59:high,mid,low=b1; /低5 60:high,mid,low=b1; /低5endcaseendendmodule