基于FPGA硬件电子琴设计Word文档格式.docx
《基于FPGA硬件电子琴设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于FPGA硬件电子琴设计Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
1.1设计要求
利用数控分频器设计硬件电子琴,当按下琴键时,扬声器发出该琴键相对应的音阶,同时数码管显示音阶数字,若为高音时,二极管点亮。
1.2整体设计原理
本设计可以通过多种方案来实现,下面就主要的三种方案进行阐述和比较。
方案一:
采用数字逻辑电路制作,用IC拼凑焊接实现,这种电路很直观,简单方便。
但应用数字逻辑电路制作的话,使用的器件较多,连接复杂,体积大,功耗大。
电路中焊点和线路较多会,使成品的稳定度和精度大大降低。
方案二:
采用现场可编程逻辑器件(FPGA)制作,利用EDA软件中的VHDL硬件描述语言编程进行控制,然后烧制实现.采用FPGA来设计的原理图如图1.1所示.它由控制输入电路、FPGA、显示电路和扬声器电路组成。
控制输入电路
显示电路
FPGA
扬声电路
图1.1采用FPGA设计的电子琴原理方框图
控制输入电路主要是为用户设计的,起到一个输入控制的作用.FPGA是现场可编程逻辑器件,也是本设计方案的核心内容,它是实现电子琴运作的主要控制模块.由设计者把编好的VHDL程序烧制到现场可编程逻辑器件FPGA中,然后通过控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱.同时也把发出的乐谱符号通过显示器输出.
方案三:
单片机现在已经达到很成熟的阶段了,它的应用也十分广泛.采用单片机来实现电子琴,它的原理方框图与用FPGA来实现的原理方框图类似,如图1.2所示。
MCU(单片机)
扬声器电路
图1.2采用单片机实现电子琴的原理方框图
图1.1和图1.2的基本原理都相同,唯一不同的是一个是用FPGA来制作,一个是用单片机来实现。
采用单片机来实现电子琴,主要的核心是单片机的设计。
1.3方案比较
对于电子琴的设计,三个方案均可以实现,但是第一个方案中采用的是数字逻辑电路来制作,该电路硬件所需的器材多,体积庞大,比较复杂,而且精度和稳定度都不是很高。
第二个方案采用的是现场可编程逻辑器件来实现,它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度。
还可以用软件QuartusⅡ进行仿真和调试等。
设计人员可以充分利用VHDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;
而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易.方案三也有它的优点,但同时也存在缺点。
它对设计者的要求比较高,设计者对软硬件必须十分熟悉。
和方案二来比它的实验仿真没有方案二简单直观,调试也有一定的难度。
在外界环境相同的条件下,方案三设计出来的产品精度和稳定度要比方案二稍微差一些。
因此,电子琴的设计我们选择方案二来实现。
二、单元电路设计
2.1实验原理
主系统由3个模块组成,程序-3(见附录)是顶层设计文件,其内部有两个功能模块(如图2-1所示):
TONE.VHD(程序-2(见附录))和SPEAKER.VHD(程序-1(见附录))。
模块TONE是音阶发生器,当8位发声控制输入INDEX中某一位为高电平时,则对应某一音阶的数值将从端口TONE输出,作为获得该音阶的分频预置值;
同时由CODE输出对应该音阶简谱的显示数码,如‘5’,并由HIGH输出指示音阶高8度显示。
由程序-2可见,其语句结构只是类似与真值表的纯组合电路描述,其中的音阶分频预置值,如Tone<
=1290是根据产生该音阶频率所对应的分频比获得的。
图2-1硬件电子琴电路结构
模块SPEAKER中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块SPEAKER由端口TONE获得一个2进制数后,将以此值为计数器的预置数,对端口CLK20MHZ输入的频率进行分频,之后由SPKOUT向扬声器输出发声。
2.2顶层模块的设计
VHDL采用的是自顶向下的设计方式,顶层模块由音调发生器(tone)和数控分频器(speaker)两个模块组成。
图2-1即是顶层设计原理图。
其中音调发生器部分又包括了键盘编码。
设置八个按键(Index1)输入信号,再对其进行编码,输出的Tone都是11位二进制数,对应数控分频模块的输入。
数控分频模块根据输入的预置数Tone1,对基准脉冲进行相关分频后,输出对应音阶的频率,驱动蜂鸣器发音。
2.3音调发生器(tone)模块的设计
音调发生器的作用是产生获得音阶的分频预置值。
当8位发声控制输入index中的某一位为低电平时,则对应某一音阶的数值将以端口tone输出,作为获得该音阶的分频预置值,该值作为数控分频器的输入,来对20MHz的脉冲进行分频,由此得到每个音阶相应的频率,例如输入index="
11111101"
,即对应的按键是2,产生的分频系数便是912;
由code输出对应该音阶简谱的显示数码;
由high输出指示音阶高8度的显示,低电平有效。
对于tone的计算很重要,tone是根据产生该音阶频率所对应的分频比获得的。
此值是通过查表和计算所到,查表我们可以知道每个乐谱符号的频率,然后计算出要得到该乐谱的频率所需的分频系数。
例如音符’1’的发音,通过查表得它的频率是785HZ左右,我们要计算tone的值可由公式:
音符频率=振荡频率/(16#7FF#-tone的值)
振荡频率是经过分频之后得到的,在此是1MHZ,由公式可计算出tone的值为:
773。
2.4数控分频模块(speaker)的设计
数控分频模块的目的是对基准脉冲分频,得到1,2,3,4,5,6,7七个音符对应频率。
该模块的VHDL描述中包含了三个进程。
首先对20MHz的基准脉冲进行分频得到1MHz的脉冲,然后按照tone1输入的分频系数对1MHz的脉冲再次分频,得到的便是所需要的频率。
而第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,同时使其占空比为50%,以使扬声器有足够功率发音。
三、软件设计
3.1VHDL硬件描述语言简介
PLD的软件已发展得相当完善,利用VHDL硬件描述语言来实现程序的编制,这样硬件的功能描述可以完全在软件上实现。
VHDL是用于逻辑设计的硬件描述语言,成为IEEE标准。
它作为描述硬件电路的语言,有以下特点:
(1)VHDL的宽范围描述能力使它成为高层次设计的核心,将设计人员的工作重心提高到了系统功能的实现与调试,而花较少的精力于物理实现。
(2)VHDL可以用简洁明确的代码描述来进行复杂控制逻辑的设计,灵活且方便,而且也便于设计结果的交流、保存和重用。
(3)VHDL的设计不依赖于特定的器件,同一个HDL原码可以综合成FPGA或ASIC,方便了工艺的转换。
(4)VHDL是一个标准语言,为众多的EDA厂商支持,而且设计出来的电路大多数并行运行,因此移植性好且速度快。
采用VHDL语言设计复杂数字电路的方法具有很多优点,其语言的设计技术齐全、方法灵活、支持广泛。
它可以支持自顶向下(TopDown)和基于库(Library_Based)的设计方法,而且还支持同步电路、异步电路、FPGA以及其他随机电路的设计,其范围很广,语言的语法比较严格,给阅读和使用都带来了极大的好处。
3.2软件设计
本设计采用ALTERA公司的EDA软件系统QuartusⅡ来完成。
采用自顶向下的设计方法。
程序设计的流程图如图3-1所示:
开始
等待用户按下琴键
显示音阶和高低音标志
根据按下的键进行音阶频率的预置
根据频率的预置数输出相应的音阶的频率
扬声器发音
图3-1程序设计流程图
软件设计采用结构化程序设计方法,功能模块各自独立,实际上在设计中将键盘输入存储放在了音调发生器(tone)模块中,显示部分存放在数控分频器模块中。
软件设计的核心部分是数控分频器,键盘输入是提供给它相应的分频比。
对输入的基准时钟进行多次分频,最终输出的就是想得到的音阶的频率。
VHDL描述语言程序清单见附录。
四、系统测试
4.1测试使用的仪器
ALTERA公司的EDA软件系统QuartusⅡ
ALTERA公司MAXⅡ系列的EMP240T100C5N板子
4.2测试方法
首先用ALTERA公司的QuartusⅡ软件的仿真工具进行对系统的仿真。
功能仿真用于综合前检查设计的逻辑功能是否符合设计要求。
仿真过程中可以通过观察检测设计的输入信号,输出信号以及内部信号以检测设计的逻辑功能。
如果仿真都通过的话就可以进行引脚锁定,然后下载程序,烧制出功能芯片,在实验板上可以直观的操作,从而看到结果。
4.3指标测试和测试结果
每个音阶对应着不同的频率。
频率的大小直接影响着音调的高低以及失真度。
表4-1频率测试
音阶
1
2
3
4
5
6
7
1(H)
频率(Hz)
785
880
988
1046
1175
1318
1400
1568
测试结果可以看出,得到的频率和分频结果基本一致,发音情况良好,音调准确,键盘输入可行,能按照按键所对应的音阶发音。
图4-1电子琴系统顶层映射仿真图
五、心得
经过对测试结果的分析,发现采用FPGA所设计的电子琴,系统设计趋于简单、开发时间缩短;
外围器件少,体积小,抗干扰能力强,可靠性高;
系统维护更方便、快捷。
尤其对于设计者来说,不需要考虑太多的硬件设计,只需要有自己的设计思路,编程实现再用烧到FPGA器件中进行测试即可。
电子琴作为一种乐器,成本也不高,因此有一定的生产价值。
本设计利用超高速硬件描述语言VHDL实现了电子琴的键盘输入发音的简易功能,经过编程,综合,仿真,下载,芯片烧制,最终做出成品,测试情况良好,能够准确实现音阶的发音功能。
附录
【硬件电子琴程序清单】:
【程序-1】
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSpeakerIS
PORT(clk1:
INSTD_LOGIC;
Tone1:
ININTEGERRANGE0TO16#7FF#;
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakerIS
SIGNALCLK2,Full:
STD_LOGIC;
BEGIN
PROCESS(clk1)
VARIABLECnt1:
INTEGERRANGE0TO16#31#:
=0;
CLK2<
='
0'
;
--将CLK1进20分频,CLK2为CLK120分频
IFCnt1>
19THENCLK2<
1'
Cnt1:
ELSIFclk1'
EVENTANDclk1='
THENCnt1:
=Cnt1+1;
ENDIF;
ENDPROCESS;
PROCESS(CLK2,Tone1)
VARIABLECount11:
INTEGERRANGE0TO16#7FF#:
BEGIN--11位可预置计数器
IFCLK2'
EVENTANDCLK2='
THEN
IFCount11=16#7FF#THENCount11:
=Tone1;
Full<
ELSECount11:
=Count11+1;
PROCESS(Full)
VARIABLECnt2:
STD_LOGIC:
='
BEGIN
IFFull'
EVENTANDFull='
THENCnt2:
=NOTCnt2;
IFCnt2='
THENSpkS<
ELSESpkS<
【程序-2】
ENTITYToneIS
PORT(Index:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
OUTINTEGERRANGE0TO16#7FF#);
ARCHITECTUREoneOFToneIS
BEGIN
PROCESS(Index)
CASEIndexIS--译码电路,查表方式,控制音调的预置数
WHEN"
11111110"
=>
Tone<
=773;
CODE<
="
11111001"
HIGH<
=912;
10100100"
11111011"
=1036;
10110000"
11110111"
=1116;
10011001"
11101111"
=1197;
10010010"
11011111"
=1290;
10000010"
10111111"
=1372;
11111000"
01111111"
=1410;
WHENOTHERS=>
=2047;
11000000"
HIGH<
ENDCASE;
【程序-3】
ENTITYTOPIS--顶层设计
PORT(CLK20MHZ:
INDEX1:
CODE1:
HIGH1,SPKOUT:
END;
ARCHITECTUREoneOFTOPIS
COMPONENTTone
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--11位2进制预置数
ENDCOMPONENT;
COMPONENTSpeaker
SIGNALTone0:
INTEGERRANGE0TO16#7FF#;
u1:
TonePORTMAP(Index=>
Index1,
Tone=>
Tone0,CODE=>
CODE1,HIGH=>
HIGH1);
u2:
SpeakerPORTMAP(clk1=>
CLK20MHZ,Tone1=>
Tone0,SpkS=>
SPKOUT);
参考文献
[1]潘松黄继业编著《EDA技术与VHDL》(第2版)清华大学出版社2007年
[2]贾立新王拥等编著《电子系统设计与实践》清华大学出版社2007年4月
[3]高仁璟、孙鹏,数字电子基础与设计及[M]大连理工大学出版社2004年
[4]赵俊超《集成电路设计VHDL教程》[M]北京希望电子出版社2002年
[5]王金明,周顺.数字系统设计与VHDL.北京:
电子工业出版社,2010