基于FPGA的简易乐谱演奏其设计.docx
《基于FPGA的简易乐谱演奏其设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的简易乐谱演奏其设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于FPGA的简易乐谱演奏其设计
目录
1引言1
2课程简介2
2.1EDA介绍2
2.2VHDL介绍2
2.3QUARTUSII介绍3
3FPGA简介4
4设计原理与分析5
4.1设计题目5
4.2设计分析5
4.3设计思想7
5各模块及功能实现7
5.1手动\自动选择模块7
5.2音调发生与选择模块8
5.3数控分频器模块9
5.4音调编码器电路模块10
5.5顶层电路及仿真分析11
5.6硬件下载及实现11
6总结13
7参考文献14
附录15
1引言
VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
随着EDA技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件CPLD/FPGA的出现,给设计人员带来了诸多方便。
利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。
突出了其作为硬件描述语言的良好的可读性、可移植性和易读性等优点。
本文基于FPGA开发系统,在QuartusII7.2软件平台上,完成了简易多功能信号发生器电路的设计和与仿真,并下载到试验箱进行硬件实现。
首先,本文介绍了QuartusII7.2软件的基本使用方法和VHDL硬件描述语言的特点,采用VHDL硬件描述语言描述简易信号发生器,完成对电路的功能仿真。
在设计过程中,重点探讨了简易信号发生器设计思路和功能模块划分。
然后,初步探讨了电路逻辑综合的原理,该软件对简易多功能信号发生器电路进行了逻辑综合。
最后,使用EDA实验开发系统进行电路的下载和验证。
验证结果表明设计的简易简易信号发生器完成了预期的功能。
简易多功能信号发生器是信号发生器的一种,在生产实践和科研领域中有着广泛的应用。
在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都需要有信号源,由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察、测量被测仪器的输出响应,以分析确定它们的性能参数。
信号发生器是电子测量领域中最基本、应用最广泛的一类电子仪器。
它可以产生多种波形信号,如正弦波,三角波,方波和锯齿波等,因而广泛用于通信、雷达、导航、宇航等领域。
本设计是采用VHDL来实现的简易乐曲演奏器。
它能实现自动演奏已存歌曲和手动演奏简易乐曲。
且要求实现如下功能:
(1)通过按键输入来控制音响声音;
(2)演奏时可以通过按键选择是手动演奏还是自动演奏,手动演奏是通过按键进行简易乐曲的演奏,自动演奏则是演奏已存入的固定乐曲;
(3)至少保存一首自动演奏的乐曲,且自动演奏的乐曲能重复播放;
(4)进行手动演奏和自动演奏时,数码管上要同时能显示演奏乐曲的乐谱;
(5)自动播放时,设置低速,中速,快速控制键,能实现乐曲不同速度的播放。
2课程简介
2.1EDA介绍
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。
包括在机械、电子、通信、航空航天、化工、矿产、生物等各个领域,都有EDA的应用。
2.2VHDL介绍
硬件描述语言(HDL)是一种用于设计硬件电子系统的计算机语言,它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级描述方式相比,它更适合大规模系统的设计。
例如一个32位的加法器,利用图形输入软件需要输人500至1000个门,而利用VHDL语言只需要书写一行“A=B+C”即可。
而且VHDL语言可读性强,易于修改和发现错误。
早期的硬件描述语言,如ABEL、HDL、AHDL,由不同的EDA厂商开发,互不兼容,而且不支持多层次设计,层次间翻译工作要由人工完成。
为了克服以上不足,1985年美国国防部正式推出了高速集成电路硬件描述语言VHDL,1987年IEEE采纳VHDL为硬件描述语言标准(IEEE-STD-1076)。
VHDL是一种全方位的硬件描述语言,包括系统行为级。
寄存器传输级和逻辑门多个设计层次,支持结构、数据流和行为三种描述形式的混合描述,因此VHDL几乎覆盖了以往各种硬件俄语言的功能,整个自顶向下或由下向上的电路设计过程都可以用VHDL来完成。
VHDL还具有以下优点:
(1)VHDL的宽范围描述能力使它成为高层进设计的核心,将设计人员的工作重心提高到了系统功能的实现与调试,而花较少的精力于物理实现。
(2)VHDL可以用简洁明确的代码描述来进行复杂控制逻辑设计,灵活且方便,而且也便于设计结果的交流、保存和重用。
(3)VHDL的设计不依赖于特定的器件,方便了工艺的转换。
(4)VHDL是一个标准语言,为众多的EDA厂商支持,因此移植性好。
美国于1981年提出了一种新的、标准化的HDL,称之为VHSIC(VeryHighSpeedIntegratedCircuit)HardwareDescriptionLanguage,简称VHDL。
这是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言。
设计者可以利用这种语言来描述自己的设计思想,然后利用电子设计自动化工具进行仿真,再自动综合到门电路,最后用PLD实现其功能。
2.3QUARTUSII介绍
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。
AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
3FPGA简介
FPGA是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
它由早期的电子管、晶体管、小中规模集成电路,发展到超大规模集成电路(VLSIC,几万门以上)以及许多具有特定功能的专用集成电路。
但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。
系统设计师们更愿意自己设计专用集成电路(ASIC)芯片,而且希望ASIC的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列(FPGA)和复杂可编程逻辑器件(CPLD)。
这一阶段的产品主要有PAL(可编程阵列逻辑)和GAL(通用阵列逻辑)。
PAL由一个可编程的“与”平面和一个固定的“或”平面构成,或门的输出可以通过触发器有选择地被置为寄存状态。
PAL器件是现场可编程的,它的实现工艺有反熔丝技术、EPROM技术和E2PROM技术。
还有一类结构更为灵活的逻辑器件是可编程逻辑阵列(PLA),它也由一个“与”平面和一个“或”平面构成,但是这两个平面的连接关系是可编程的。
PLA器件既有现场可编程的,也有掩膜可编程的。
在PAL的基础上又发展了一种通用阵列逻辑(GAL,GenericArrayLogic),如GAL16V8、GAL22V10等。
它采用了EPROM工艺,实现了电可擦除、电可改写,其输出结构是可编程的逻辑宏单元,因而它的设计具有很强的灵活性,至今仍有许多人使用。
这些早期的PLD器件的一个共同特点是可以实现速度特性较好的逻辑功能,但其过于简单的结构也使它们只能实现规模较小的电路。
为了弥补这一缺陷,20世纪80年代中期,Altera和Xilinx分别推出了类似于PAL结构的扩展型CPLD(ComplexProgrammableLogicDvice)和与标准门阵列类似的FPGA(FieldProgrammableGateArray),它们都具有体系结构和逻辑单元灵活、集成度高以及适用范围宽等特点。
这两种器件兼容了PLD和通用门阵列的优点,可实现较大规模的电路,编程也很灵活。
与门阵列等其他ASIC(ApplicationSpecificIC)相比,它们又具有设计开发周期短、设计制造成本低、
开发工具先进、标准产品不需测试、质量稳定以及可实时在线检验等优点,因此被广泛应用于产品的原型设计和产品生产(一般在10000件以下)之中。
几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
4设计原理与分析
4.1设计题目
设计一个乐曲演奏电路,能够自动播放编写好的音乐。
要求将音乐通过实验箱上的喇叭播放出来,用发光二级管显示出乐曲的节拍。
(附加功能:
本设计在题目所要求的功能全部实现的基础之上又添加了许多附加功能,所有的功能将在“工程设计总述”中阐明,特此声明。
)
4.2设计分析
(1)音乐硬件演奏电路基本原理
硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
(2)音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频器获得。
由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。
若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取1MHz的基准频率。
数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=8191,此时扬声器不会发声。
(3)乐曲节奏的控制
一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。
(4)乐谱的发生
本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。
当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。
(5)选择模块
选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述比较简单,不在此详述。
4.3设计框图
根据设计要求,系统组成方框图4-1所示,它由音调发生器模块、音调编码器模块、分频器模块、手动\自动选择模块及数控分频器模块组成。
图4-1乐曲演奏电路结构方框图
5各模块及功能实现
5.1手动/自动选择模块
根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。
于是,可通过一个按键cs来进行自动与手动的选择,当cs按下时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键(与cs相连的按键除外)来控制不同的音符。
与此同时,还需要一个复位信号rst来控制该演奏器是否工作,当rst为1时,停止演奏,为0时,可以演奏。
以上提到的手动与自动的选择只能在rst为0时有效。
(1)模块图形如图5-1:
图5-1手动\自动选择模块
(2)仿真波形如图5-2:
图5-2选择模块仿真波形
(3)仿真波形分析
由仿真波形图可以看出输入index1与index2分别为手动与自动,当复位rst为1时,简易乐曲演奏器停止工作,当rst为0时该选择模块正常工作,当cs为1时,选择自动演奏,当cs为0是选择手动演奏,最由toneindex输出。
5.2音调发生与选择模块
在此模块中设置了一个9位二进制计数器((计数最大值为511),作为音符数据ROM的地址发生器。
这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰为当全音符设为1s时,四四拍的4分音符持续时间。
同时为了实现对歌曲选择得控制以及对播放速度的要求,可以多分出几个频率,然后由控制开关来选择歌曲和播放频率。
随着音调发生器模块中的计数器按不同的时钟速率作加法计数时,乐曲就开始连续自然地依据不同的速度演奏起来了。
(1)模块图形如图5-3:
图5-3音频发生与选择模块
(2)仿真波形如图5-4:
图5-4音频发生与选择模块仿真波形
(3)仿真波形分析
由仿真图可以看出,时钟clk计数,每计一次数输出toneindex的值随之发生一定的变化,输入sel1与sel2作为选择输入分别控制音乐的播放速度和音乐的选择,在不同模式下可以使音乐的播放速度不同,同时还可以实现对不同谱子的选择功能。
5.3数控分频器模块
该模块的clk端输入一个具有较高频率(本实验为20MHz)的信号,通过skfpq分频后由spks输出。
由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲信号,为了便于驱动喇叭,需另加一个D触发器均衡其占空比,也即作二分频处理。
skfpq对clk输入信号的分频比由11位预置数tone[10..0]决定。
spks的输出频率将决定每一音符的音调,这样分频计数器的预置数tone[10..0]与spks的输出频率就有了对应关系。
(1)模块图形如图5-5:
图5-5数控分频模块
(2)仿真波形如图5-6:
图5-6数控分频模块仿真波形
(3)仿真波形分析
有仿真图可以看出,输入clk频率较大所以看得不是很清楚,输入tone代表音符的分频初始值,最终由输出spks给蜂鸣器,使硬件发出声音来。
5.4音调编码器电路模块
该编码模块的作用为将输入的音符数据翻译为音乐产生模块的所需要的分频系数,并且显示音符的数字码型和高音阶,通过对照表各音名对应的分频系数值及初始值,根据输入得到初始值,从而得到分频系数以便进行分频,得到所需的频率。
(1)模块图形如图5-7:
图5-7音频编码电路模块
(2)仿真波形如图5-8:
图5-8音频编码电路模块仿真波形
(3)仿真波形分析
输入index为音调产生模块输出的音符数据,经过翻译后将tone输出到数控分频模块为其提供分频系数的初始值,输出code为数码管显示的内容,是数码管按音乐播放时的音调产生相应的数字,high1为中高音显示,当乐谱中有中或高音时,就会通过led灯显示出来。
5.5顶层电路及仿真分析
(1)手动连接生成的电路原理图如图5-9:
图5-9手动连接生成的电路原理图
(2)顶层文件分析
利用元件例化把各个子模块组合起来,进行编译、下载,从而实现整体功能。
它将音调发生器模块、分频器模块、手动\自动选择模块及数控分频器模块连接起来。
5.6硬件连接及下载实现
(1)电路的顶层文件管脚分配图5-10:
图5-10顶层电路引脚锁定
(2)引脚锁定后下载到FPGA试验箱的EP3C40Q240C8芯片中,通过开关及按键的控制,试验箱的蜂鸣器就会根据选择演奏优美的音乐,经验证本次设计完全达到了预先的设计要求。
硬件连接如图5-11:
图5-11硬件连接图
6心得体会
这次的EDA课程设计使我了解了很多东西,在做简易音乐演奏器前,对于通过软件或程序代码来控制硬件是一件一直很模糊的事情,对硬件的发声有很大的兴趣。
所以选择做了简易音乐演奏器。
起初是收集资料,从网上查阅的资料和同学们那多多少少有个初步的了解,根据任务书对功能也有了大概的了解,但还是有些不太相信这样就可以通过代码控制硬件了而且还能是硬件唱出我们编好的谱子。
接下来就是实验室代码的编写与硬件的下载验证。
在老师和同学的帮助下,程序代码基本完成同时也加深了EDA程序代码的运用编写能力,按照程序进行引脚锁定于硬件连接,当下载成功时扬声器发出声音并按输入的谱子那样唱出来,感觉兴奋,总之通过这次的课程设计使我真正了解了通过代码控制硬件的发声原理,使我对于软件与硬件的连接有了一个清晰的认识。
7参考文献
[1].VokneiA.Pedroni.《VHDL数字电路设计教程》[M].电子工业出版社,2008.5
[2].潘松,黄继业等.《EDA技术实用教程》(第二版)[M].科学出版社,2005.2
[3].焦素敏.《EDA应用技术》[M].清华大学出版社,2002.4
[4].徐向民.《数字系统设计及VHDL实践》[M].机械工业出版社,2007.10
[5].刘江海.《EDA技术课程设计》[M].华中科技大学出版社,2009.5
附录
1手动\自动选择模块的VHDL源程序:
libraryieee;
useieee.std_logic_1164.all;
entitybmuxisport(
index1:
inintegerrange0to15;
index2:
inintegerrange0to15;
cs:
instd_logic;
rst:
instd_logic;
toneindex:
outintegerrange0to15);
end;
architecturebhvofbmuxis
begin
process(cs,rst)
begin
if(rst='1')thentoneindex<=0;
else
casecsis
when'0'=>toneindex<=index1;
when'1'=>toneindex<=index2;
whenothers=>null;
endcase;
endif;
endprocess;
endbhv;
libraryieee;
useieee.std_logic_1164.all;
entityhandis
port(key:
instd_logic_vector(6downto0);
toneindex1:
outintegerrange0to15);
end;
architecturebhvofhandis
begin
search:
process(key)
begin
casekeyis
when"0000001"=>toneindex1<=1;
when"0000010"=>toneindex1<=2;
when"0000100"=>toneindex1<=3;
when"0001000"=>toneindex1<=4;
when"0010000"=>toneindex1<=5;
when"0100000"=>toneindex1<=6;
when"1000000"=>toneindex1<=7;
whenothers=>toneindex1<=0;
endcase;
endprocess;
end;
2音调发生器模块VHDL源程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYNOTETABSIS
PORT(CLK:
INSTD_LOGIC;
SEL1,SEL2:
INSTD_LOGIC_VECTOR(0to1);
TONEINDEX:
OUTINTEGERRANGE0TO15);
ENDNOTETABS;
ARCHITECTUREbhvOFNOTETABSIS
typeyuepu1isarray(0to255)ofintegerrange0to15;
typeyuepu2isarray(0to303)ofintegerrange0to15;
constantmemory1:
yuepu1:
=(
5,5,5,5,6,6,6,6,8,8,8,8,9,9,6,6,5,5,6,6,6,6,6,6,0,0,0,0,0,0,0,0,10,10,10,10,9,9,9,9,10,10,9,9,8,8,5,5,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,5,5,5,5,6,6,6,6,8,8,8,8,9,9,6,6,5,5,6,6,6,6,6,6,0,0,0,0,0,0,0,0,10,10,10,10,9,9,9,9,10,10,9,9,8,8,5,5,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,5,5,5,5,3,3,6,6,6,6,6,6,0,0,0,0,8,8,8,8,8,8,0,0,6,6,6,6,6,6,6,6,8,8,8,8,6,6,8,8,9,9,9