当前位置:文档之家› 基于FPGA的简易电子琴实现

基于FPGA的简易电子琴实现

基于FPGA的简易电子琴实现李全摘要本系统是采用EDA技术设计的一个简易的八音符电子琴,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,它可以通过按键输入来控制音响。

多功能电子琴的设计是在原有普通电子琴的基础上进行扩充的一个设计。

该电子琴的设计大体可以由三个模块构成,分别是电子琴音调发生器模块、数控分频模块和自动演奏模块。

用超高速硬件描述语言VHDL编程可以实现各个模块的功能。

能够实现弹琴和自动演奏的功能。

系统实现是用硬件描述语言VHDL按照模块化方式进行设计,然后进行编程、时序仿真、总体整合。

本系统的功能比较齐全,有一定的现实使用的价值。

本文中介绍了电子琴系统的整体的设计,并基于超高速硬件描述语言VHDL在相关的芯片上编程实现的。

关键字电子琴;EDA;现场可编程逻辑器件FPGA;超高速硬件描述语言VHDL;音调发生;数控分频;1引言我们生活在一个信息高速发达的时代,各种各样电子产品层出不穷。

对于广大老百姓来说,电子琴可以说已经不再是什么“新鲜玩意”了,它现在作为一种休闲和娱乐的产品早就推出市面,面向百姓,进入了我们的生活。

作为一个电子信息科学与技术专业的学生,了解这些电子产品的基本的组成和设计原理是十分必要的,我们学习过了计算机组成的理论知识,而我所做的课程设计正是对我学习的理论进行实践和巩固。

本设计主要介绍的是一个用超高速硬件描述语言VHDL设计的一个具有若干功能的简易电子琴;集科学性,先进性,创新性,实用性于一体,其理论基础源自于计算机组成原理的时钟分频器。

1.1 设计的目的本次设计的目的就是在掌握计算机组成原理理论相关的基础上,了解EDA技术,掌握VHDL硬件描述语言的设计方法和思想,通过学习的VHDL 语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,例如本课程设计就是基于所学的计算机原理中的时钟分频器和定时器的基础之上的,通过本课程设计,达到巩固和综合运用计算机原理中的知识,理论联系实际,巩固所学理论知识,并且提高自己通过所学理论分析、解决计算机相关的实际问题的能力。

1.2 设计的基本内容基于Quartus Ⅱ平台,运用VHDL语言对简易电子琴的各个模块进行设计,并使用EDA 工具对各模块进行仿真验证。

本设计包含如下三个模块:音调发生模块、数控分频模块、乐曲自动演奏模块,最后把各个模块整合后,通过电路的输入输出对应关系连接起来。

1.3 设计方案为了实现这种有“弹奏”和“自动播放歌曲”功能的多功能简易电子琴,以下提供两种方案以供参考:方案一:采用单个的逻辑器件组合实现。

这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然,但是因为元器件种类、个数非常多,而且过于复杂的硬件电路也容易引起系统的精度不高、体积过大等一系列的不利因素。

例如八个不同的音符是由八个不同的频率来控制输出发声的,而采用这个方案需要运用不同的分频器来对信号进行不同程度的分频。

所用仪器之多显而易见。

方案二:采用VHDL语言编程来实现电子琴的各项功能。

我这个系统主要由音调发生器模块、数控分频模块、乐曲自动演奏模块组成的。

和方案一相比较,方案二就显得比较笼统,只是把整个系统分为了若干个小模块,却不牵涉到具体的硬件电路。

但是我们必须看到使用超高速硬件描述语言VHDL的优势,它不仅具有良好的电路行为描述和系统描述的能力并且通俗易懂。

2 简易电子琴设计2.1 系统设计的总体思路实现这个多功能电子琴,我们要考虑的主要是以下三个方面的内容:一、每个音符都有自己的固有频率,由频率的不同就决定了发出什么音调。

二、一首乐曲的组成不仅仅是音调,还包括每个音调持续时间的长短,也就是我们通常所说的音长。

本设计就是以这两个部分为核心内容展开。

经过对引言两种方案的分析、比较和总结,我们选用方案二来进行电子琴的设计。

采用现场可编程逻辑器件(FPGA)制作,利用EDA软件中的VHDL硬件描述语言编程进行控制,下载至试验箱中的FPGA模块中,再利用其上资源连接电路从而实现预定功能。

采用FPGA来设计的原理图如图2.1所示.它由控制输入电路、FPGA、显示电路和扬声器电路组成。

控制输入电路FPGA显示电路扬声电路图2.1 采用FPGA设计的电子琴原理方框图控制输入电路主要是为用户设计的,起到一个输入控制的作用通过8个按钮对应8个音符,外加一个键盘输入/自动演奏切换按钮。

FPGA是现场可编程逻辑器件,也是本设计方案的核心内容,它是实现电子琴运作的主要控制模块。

编好的VHDL程序下载到现场可编程逻辑器件FPGA中,然后通过控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱,同时也把发出的乐谱符号通过七段数码管输出。

2.2 程序设计的流程图程序设计的流程图如图2.2所示。

图2.2 程序设计流程图根据系统的两大功能:手动弹奏与自动演奏,可将其分成音调发生器模块、数控分频模块和自动演奏模块三部分。

音调发生器模块由分频模块获得其产生的8个频率(还可扩展),对应8个音符(中央C,D,E,F,G,A,B和高音C分别在七段数码管上显示数字1-8),为了实现自动播放的《友谊地久天长》,我们还编辑了低音G和A两个音。

这些频率经放大后驱动蜂鸣器,即可发出声音。

键盘选择手动弹奏模式时,按下音符键后就选通相应的频率输出,驱动蜂鸣器产生相应的乐音;选择自动演奏模式时,存储器里事先编写好的音符信息被依次取出,去选通各个频率输出,实现自动奏乐。

2.3简易电子琴的顶层设计图50mhz系统时钟player tonemaker图2.3 简易电子琴的顶层设计图2.4简易电子琴中各模块的设计FPGA的设计是整个系统的中心环节,具有举足轻重的作用.它的实现主要是由小组成员利用VHDL硬件描述语言编程实现电子琴的功能,仿真调试成功之后,再下载到试验箱上的FPGA器件中去,外部连接完成后的成品在带电情况下即可运行实现预定功能。

而FPGA模块的设计又重在VHDL 语言的编程实现,用VHDL语言编写的程序总的顶层模块映射原理图如图2.3所示,它是由音调发生器模块(tonemaker)、数控分频模块(Speaker)、自动演奏模块(player)组成。

系统pin_28输入50MHz时钟频率经6分频得到一个近似8HZ的基准频率,经过二次分频后得到对应音符的频率。

从自动演奏模块输出的是乐谱信号,该乐谱信号作为音调发生器模块的敏感信号输入并对其进行控制。

音调发生模块有两个输出,分别是code和high,两个都接外部的显示部分,code接七段数码管显示乐谱,high显示的是该乐谱是高音还是低音。

由于本系统结构较为简单,程序编译无错后我们小组直接在试验箱上连接好各类外部资源后利用实物验证,经过调试,我们实现了预定功能。

在本系统中我负责的是主要是数控分频模块的元件例华以及顶层设计部分的修改,以下对模块进行说明。

2.4.1数控分频模块在对计算机组成原理的学习中,我们知道数控分频器的功能是在输入端输入不同数据时,对输入时钟产生不同的分频比,输出不同频率的时钟,以改变输出信号的频率。

本设计中数控分频模块是利用并行预置数的减法计数器对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。

该模块的VHDL程序中包含了三个进程。

首先对FPGA的50MHz的时基脉冲进行6分频得到近似8MHz的脉冲,然后按照tone1输入的分频系数对8MHz的脉冲再次分频,得到所需要的音符频率。

第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,使扬声器有足够发声功率。

数控分频模块元件图:CLK1 SPKSTONE1[10..0]数控分频模块原理图数控分频模块程序:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity speaker isPort ( clk1 : in std_logic; --系统时钟tone1 : in integer range 0 to 2047; --音符分频系数spks : out std_logic); --驱动扬声器的音频信号end speaker;architecture Behavioral of speaker issignal preclk,fullspks:std_logic;beginpulse1:process(clk1) --此进程对系统时钟进行4分频variable count:integer range 0 to 12;beginif clk1'event and clk1='1' then count:=count+1;if count=3 then preclk<='1';elsif count=6 then preclk<='0';count:=0;end if;end if;end process pulse1;genspks:process(preclk,tone1)--此进程按照tone1输入的分频系数对8MHz的脉冲再次分频,得到所需要的音符频率variable count11:integer range 0 to 2047;beginif preclk'event and preclk='1' thenif count11<tone1 then count11:=count11+1;fullspks<='1';else count11:=0;fullspks<='0';end if;end if;end process;delaysps:process(fullspks)--此进程对fullspks进行2分频将脉冲展宽,使扬声器有足够发声功率variable count2 :std_logic:='0';beginif fullspks'event and fullspks='1' then count2:=not count2;if count2='1' then spks<='1';else spks<='0';end if;end if;end process;end Behavioral;3 结束语通过对测试结果的分析,我们发现采用FPGA所设计的电子琴系统设计趋于简单、开发时间短;外围器件少,体积小;系统维护起来更方便、快捷。

尤其对于设计者来说,不需要考虑太多的硬件设计,只需要有自己的设计思路,编程实现再下载到FPGA器件中进行测试就可以了。

相关主题