基于FPGA简易乐器演奏器设计.docx
《基于FPGA简易乐器演奏器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA简易乐器演奏器设计.docx(27页珍藏版)》请在冰豆网上搜索。
基于FPGA简易乐器演奏器设计
1引言
VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
本文基于FPGA开发系统,在QuartusII9.0软件平台上,完成了简易乐曲演奏器电路的设计和与仿真,并下载到试验箱进行硬件实现。
首先,本文介绍了QuartusII9.0软件的基本使用方法和VHDL硬件描述语言的特点,采用VHDL硬件描述语言描述简易信号发生器,完成对电路的功能仿真。
在设计过程中,重点探讨了简易信号发生器设计思路和功能模块划分。
然后,初步探讨了电路逻辑综合的原理,该软件对简易多功能信号发生器电路进行了逻辑综合。
最后,使用EDA实验开发系统进行电路的下载和验证。
验证结果表明设计的简易乐曲演奏器完成了预期的功能。
本设计是采用VHDL来实现的简易乐曲演奏器。
它能实现自动演奏已存歌曲和手动演奏简易乐曲。
且要求实现如下功能:
(1)通过按键输入来控制音响声音;
(2)演奏时可以通过按键选择是手动演奏还是自动演奏,手动演奏是通过按键进行简易乐曲的演奏,自动演奏则是演奏已存入的固定乐曲;
(3)至少保存一首自动演奏的乐曲,且自动演奏的乐曲能重复播放;
(4)进行手动演奏和自动演奏时,数码管上要同时能显示演奏乐曲的乐谱;
(5)自动播放时,设置低速,中速,快速控制键,能实现乐曲不同速度的播放。
2EDA及QuartusII软件简介
2.1EDA简介
EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。
包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。
目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。
例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
本文所指的EDA技术,主要针对电子电路设计、PCB设计和IC设计。
2.2硬件描述语言VHDL
VHDL的全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
VHDL语言是一种用于电路设计的高级语言,主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
2.3VHDL的设计流程
在用VHDL语言来设计电路时,主要的过程是这样的:
(1)使用文本编辑器输入设计源文件。
(2)使用编译工具编译源文件。
VHDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器。
(3)功能仿真。
对于某些人而言,仿真这一步似乎是可有可无的。
但是对于一个可靠的设计而言,任何设计最好都进行仿真,以保证设计的可靠性。
另外,对于作为一个独立的设计项目而言,仿真文件的提供足可以证明你设计的完整性。
(4)综合。
综合的目的是在于将设计的源文件由语言转换为实际的电路。
这一部分的最终目的是生成门电路级的网表(Netlist)。
(5)布局、布线。
这一步的目的是生成用于烧写的编程文件。
在这一步,将用到第(4)步生成的网表并根据CPLD/FPG厂商的器件容量,结构等进行布局、布线。
这就好像在设计PCB时的布局布线一样。
先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位。
然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来。
(6)后仿真。
这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足你的设计要求。
2.4软件介绍
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作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
3总体设计
3.1乐曲演奏电路原理
声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
当一个20MHz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数,将分频系数送给数控分频器模块,当20MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的4Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。
曲子也就流畅的播放出来了。
3.2整体设计思想
根据设计要求,系统组成方框图3-1所示,它由乐曲选择模块、数码显示模块、蜂鸣器模块、模式选择模块及手动输入模块组成。
图3-1乐曲演奏电路结构方框图
3.3乐曲演奏电路模块
3.3.1乐曲选择模块
1乐曲选择模块
在此模块中设置了一个9位二进制计数器((计数最大值为511),作为音符数据ROM的地址发生器。
这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25s,恰为当全音符设为1s时,四四拍的4分音符持续时间。
同时为了实现对歌曲选择得控制以及对播放速度的要求,可以多分出几个频率,然后由控制开关来选择歌曲和播放频率。
随着音调发生器模块中的计数器按不同的时钟速率作加法
计数时,乐曲就开始连续自然地依据不同的速度演奏起来了。
2乐曲选择模块的仿真图
图3-2乐曲选择模块仿真图
通过仿真图可以清楚的看到,时钟clk由0开始计数,每计一次数输出toneindex的值随之发生一定的变化,只不过根据乐谱的不同,输出的变化也不尽相同。
由于选择开关的控制可以看出,在不同模式下播放的歌曲是不同的,实现了选歌的功能。
3乐曲选择模块生成的逻辑符号图
图3-3乐曲选择模块逻辑符号图
3.3.2数码显示模块
1数码显示模块
该编码模块的作用为将输入的音符数据翻译为音乐产生模块的所需要的分频系数,并且显示音符的数字码型和高音阶,通过对照表各音名对应的分频系数值及初始值,根据输入得到初始值,从而得到分频系数以便进行分频,得到所需的频率。
2音数码显示模块的仿真图
图3-4数码显示模块仿真图
在此程序中index为音乐节拍产生模块输出的音符数据,经过翻译后将tone输出到数控分频模块为其提供分频系数的初始值,code为数码管显示的字符数,high1为高音显示,当乐谱中有高音时,就会相应地以二进制的形式表现出来。
3数码显示模块生成的逻辑符号图
图3-5数码显示生模块逻辑符号图
3.3.3模式选择模块
1模式选择模块
根据设计的要求,该简易乐曲演奏器能实现手动或自动演奏乐曲的功能。
于是,可通过一个按键cs来进行自动与手动的选择,当cs为1时,乐曲自动演奏,其他情况下均为手动演奏乐曲,即可以通过按下其他的按键(与cs相连的按键除外)来控制不同的音符。
与此同时,还需要一个整体复位信号rst来控制该演奏器是否工作,当rst为1时,停止演奏,为0时,可以演奏。
2模式选择模块仿真图
图3-6模式选择模块仿真图
由仿真图可以看出,当rst为1时,输出为0,电路停止工作,当rst为0时,由选择开关来控制选择是手动还是自动演奏的音符,从而也达到了演奏方式选择的功能。
3模式选择模块生成的逻辑符号图
图3-7模式模块逻辑符号图
3.3.4手动输入电路模块
1手动输入模块
此模块用于实现手动演奏乐曲的功能,用6个按键来代表:
1,2,3,4,5,6,7这7个音符,通过按键可以演奏简单的歌曲。
2手动输入模块的仿真图
图3-8手动输入模块的仿真图
由仿真图可以清楚的看到,当key处在不同的模式下,可以输出不同的音符,从而实现乐曲演奏的功能。
3手动输入模块生成的逻辑符号图
图3-9手动输入模块逻辑符号图
3.3.5蜂鸣器模块
1蜂鸣器模块
该模块的clk端输入一个具有较高频率(本实验为20MHz)的信号,通过分频后由spks输出。
由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲信号,为了便于驱动喇叭,需另加一个D触发器均衡其占空比,也即作二分频处理。
speak对clk输入信号的分频比由11位预置数tone[10..0]决定。
spks的输出频率将决定每一音符的音调,这样分频计数器的预置数tone[10..0]与spks的输出频率就有了对应关系。
2蜂鸣器模块的仿真图
图3-10蜂鸣器模块仿真图
在此仿真图中,输入clk是一个频率较大的时钟信号,输入tone代表着某个音符的分频初始值,输出spks则代表将输入clk先经过12次分频,再经过(预置数终值2048-tone)次分频,最终再进行二分频处理,而这个信号的频率就是我们需要演奏的音谱的频率,根据频率的不同,从而能通过喇叭听到不同的声音,实现音乐的播放。
3蜂鸣器模块生成的逻辑符号图
图3-11蜂鸣器模块逻辑符号图
3.4顶层文件
利用元件例化把各个子模块组合起来,进行编译、下载,从而实现整体功能。
它将音调发生器模块、音调编码器模块、分频器模块、模式选择模块,手动输入模块及数控分频器模块连接起来。
图3-12顶层文件仿真图
3.5硬件下载
输入程序并且编译无误,并且仿真无误后,便进行引脚锁定及程序下载,在进行引脚锁定时必须对照引脚锁定图进行锁定。
引脚锁定图如图3-13所示:
CLK为20M时钟输入,RST为整体复位开关,CODE1为数码管显示,HIGH1为高音显示,KEY为手动演奏,CS为模式选择,SEL速度控制开关,SPKS为蜂鸣器输入。
图3-13引脚锁定图
引脚锁定后下载到FPGA试验箱的EP3C40Q240C8芯片中,通过开关及按键的控制,试验箱的蜂鸣器就会根据选择演奏优美的音乐,经验证本次设计完全达到了预先的设计要求。
图3-14硬件连接图
4总结
通过本次课程设计,深刻体会了VHDL设计的优势,通过强大的EDA工具和硬件描述语言使演奏电路很易实现。
并且通过此次设计让我们把课本中的知识系统的联系起来,更加体会到模块式设计的方法所带来的方便和明了化。
通过模块式的方法,可以将复杂的总程序分成几个模块各自分工执行,独立工作互不干扰。
然后通过原理图将各个模块直接相连,或者用元件例化的方式,用VHDL语言进行描述,达到了统一化管理各个模块的作用。
通过查找资料,与同学交流增强了我们自主学习的能力;了解到了声音音谱的发生规律,信号的频率与声音的关系,并且通过对基准频率的分频,来生成不同的声谱。
从设计方面得知,在进行设计时,应首先对各方面的资料进行综合,在基本原理的范围内进行模块式的分解和综合,最后达到设计的需求。
这次设计使我对quartusⅡ的运用更加灵活,熟悉了对该软件从工程建立到程序下载执行各个步骤的操作,对以前学习上的不足得到了补充。
总之,这次设计让我们学到了很多知识,为我们以后的学习奠定了基础。
在课设的过程当中,不知不觉中增添了对专业课的学习兴趣,感觉我们学的东西终于与实际真正得结合起来了,学习的知识不再感觉枯燥乏味。
尤其是当自己设计的音乐播放器发出声音的时候,心中的喜悦与自豪油然而生。
最后,感谢老师的辛勤指导和严格要求。
真诚地说一声:
老师,您辛苦了!
参考文献
[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
附录
全部程序如下:
libraryieee;
useieee.std_logic_1164.all;
entityyuepuIS
port(clk:
instd_logic;
sel:
instd_logic_vector(0to1);
sel2:
instd_logic_vector(0to1);
toneindex:
outintegerrange0TO15);
endyuepu;
architecturebhvofyuepuIS
typeyinyue1isarray(0to369)ofintegerrange0to15;
typeyinyue2isarray(0to498)ofintegerrange0to15;
typeyinyue3isarray(0to198)ofintegerrange0to15;
typeyinyue4isarray(0to159)ofintegerrange0to15;
constantmemory1:
yinyue1:
=(
12,12,13,13,1,1,1,1,1,1,5,5,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,12,12,13,13,1,1,1,1,1,1,5,5,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,5,5,6,6,6,6,6,6,6,6,6,6,6,6,3,3,5,5,1,1,1,1,1,1,3,3,2,2,14,14,13,13,13,13,0,0,2,2,2,2,3,3,2,2,2,2,14,14,13,13,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,6,6,1,1,1,1,1,1,6,6,1,1,1,1,1,1,1,1,1,1,1,1,3,3,15,15,7,7,7,7,7,7,6,6,7,7,7,7,7,7,7,7,7,7,7,7,6,6,3,3,2,2,2,2,2,2,2,2,3,3,7,7,7,7,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,15,15,15,15,15,15,6,6,15,15,15,15,15,15,15,15,15,15,15,15,3,3,15,15,7,7,7,7,7,7,6,6,7,7,7,7,7,7,7,7,7,7,7,7,6,6,3,3,2,2,2,2,3,3,5,5,5,5,5,5,5,5,0,0,2,2,2,2,13,13,1,1,1,1,1,1,1,1,1,1,1,1,5,5,6,6,1,1,1,1,1,1,1,1,1,1,1,1,6,6,3,3,2,2,2,2,2,2,3,3,5,5,5,5,5,5,5,5,0,0,2,2,2,2,13,13,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0);--《牧羊曲》
constantmemory2:
yinyue2:
=(
12,12,13,13,1,1,1,1,1,1,1,1,1,1,1,1,13,13,12,12,1,1,1,1,1,1,2,2,1,1,1,1,13,13,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,13,13,2,2,2,2,2,2,3,3,2,2,2,2,3,3,5,5,6,6,5,5,5,5,5,5,6,6,6,6,5,5,3,3,2,2,3,3,2,2,1,1,13,13,13,13,12,12,13,13,12,12,13,13,1,1,1,1,1,1,1,1,1,1,1,1,13,13,12,12,1,1,1,1,1,1,2,2,1,1,1,1,13,13,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,13,13,2,2,2,2,2,2,3,3,2,2,2,2,3,3,5,5,6,6,5,5,5,5,5,5,6,6,6,6,5,5,3,3,2,2,3,3,2,2,1,1,13,13,13,13,12,12,13,13,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,5,5,6,6,6,6,6,6,6,6,6,6,6,6,15,15,6,6,5,5,5,5,5,5,6,6,5,5,5,5,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,15,15,6,6,5,5,5,5,5,5,6,6,5,5,5,5,3,3,5,5,6,6,6,6,6,6,15,15,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,5,5,6,6,6,6,6,6,6,6,6,6,6,6,15,15,6,6,5,5,5,5,5,5,6,6,5,5,5,5,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,5,5,5,5,5,5,3,3,5,5,5,5,3,3,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,13,13,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);--《大海》
constantmemory3:
yinyue3:
=(
3,5,5,5,6,15,6,5,5,5,5,5,5,5,5,5,3,5,5,5,6,15,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,5,6,5,5,5,5,5,5,9,9,9,9,9,9,15,15,15,15,8,8,8,8,8,8,8,8,8,8,8,8,9,8,15,6,6,6,6,6,6,6,9,8,15,6,8,15,15,3,5,6,5,5,5,5,5,5,8,8,8,8,8,8,9,8,15,6,6,6,6,6,6,6,9,8,9,8,9,6,9,9,9,9,10,15,8,9,9,10,10,10,10,11,11,9,9,10,10,10,10,10,10,11,11,11,11,11,11,11,9,9,9,10,10,10,10,15,8,9,9,10,10,10,10,11,11,9,9,10,10,10,10,10,10,10,15,8,9,8,15,6,8,15,6,5,5,6,15,8,9,910,10,10,10,11,11,15,15,15,15);--《欢乐颂》
constantmemory4:
yinyue4:
=(
3,3,3,3,1,1,1,1,3,3,3,3,1,1,1,1,3,3,3,3,5,5,6,6,5,5,5,5,0,0,0,0,6,6,6,6,6,6,5,5,4,4,4,4,4,4,4,4,2,2,3,3,2,2,1,1,2,2,2,2,0,0,0,0,3,3,3,3,1,1,0,0,3,3,3,3,1,1,0,0,3,3,3,3,5,5,6,6,6,6,6,6,0,0,0,0,15,15,15,15,5,5,5,5,6,6,6,6,3,3,3,3,2,2,1,1,2,2,3,3,5,5,5,5,5,5,5,5,15,15,15,15,5,5,5,5,6,6,6,6,3,3,3,3,2,2,1,1,2,2,3,3,1,1,1,1,1,1,1,1);--《数鸭子》
signalcounter1:
integerrange0to500;
signalcounter2:
integerrange0to500;
signalcounter3:
integerrange0to500;
signalcounter4:
integerrange0to50