1、课程设计摘 要乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种。现用可编程逻辑器件(PLD)来完成该设计。核心是一数控分频器,对输入的脉冲进行分频,得到每个音阶对应的频率,由此实现简易电子琴的发音功能。电子琴可演奏由键盘输入的音阶,同时在数码管上显示对应音节的频率。本设计基于超高速硬件描述语言VHDL在Altera公司的Cyclone系列的EP2C5T144C8芯片上编程实现;经仿真,调试基本能够达到技术指标,仿真结果基本正确。关键词 音乐译码电路模块,VHDL,数控分频,电子琴AbstractMusic performances are widely u
2、sed in automatic answering devices, cell phone ring tones, the Group phones, smart instrumentation and equipment。The design is accomplished using a programmable logic device (PLD). The core is a numerical control frequency divider, the input pulse frequency, the frequency of each scale corresponding
3、 to the frequency, thus achieving the function of simple electronic piano. The electronic piano can be played by the keyboard input of the scale, while in the digital tube display the corresponding syllable frequency. The design based on ultra high speed hardware description language VHDL on Alteras
4、 cyclone II Series ep2c5t144c8 chip programming; the simulation and debugging can basically meet the technical indicators, and the result of simulation is correct.Keywords Music decoder circuit module,VHDL,Numerical control pointing frequency modules,electronic organI沈阳工程学院课程设计目 录摘 要IAbstractII1 引言1
5、2 VHDL简述及应用22.1VHDL简述22.2 VHDL的应用23 FPGA的简述33.1 FPGA的介绍33.2 FPGA的整体结构33.3 Altera公司的FPGA34 电子琴演奏系统设计原理分析44.1电子琴演奏设计的基本要求44.2电子琴演奏原理44.3音名与频率的关系54.4控制音长的节拍发生器65 电子琴硬件演奏电路的层次化设计方案85.1按键控制模块85.2自动演奏模块85.3自动播放控制模块95.4数控分频模块设计95.5数码管译码显示105.6音频驱动模块10结论11致谢12参考文献13附录114附录215基于FPGA的电子琴设计1 引言我们生活在一个信息高速发达的时代
6、,各种各样电子产品层出不穷。对于广大老百姓来说,电子琴可以说已经不再是什么“新鲜玩意”了,它现在作为一种休闲和娱乐的产品早就推出市面,面向百姓,进入了我们的生活。作为一个电子信息科学与技术专业的学生,了解这些电子产品的基本的组成和设计原理是十分必要的,我们学习过了计算机组成的理论知识,而我所做的课程设计正是对我学习的理论进行实践和巩固。本设计主要介绍的是一个用超高速硬件描述语言VHDL设计的一个具有若干功能的简易电子琴;集科学性,先进性,创新性,实用性于一体,其理论基础源自于计算机组成原理的时钟分频器。2 VHDL简述及应用2.1VHDL简述VHDL的英文全名是Very-High-Speed
7、Integrated Circuit Hardware Description Language,诞生于1982年。于1983年由美国国防部(DOD)发起创建,由IEEE进一步发展并在1987年作为“IEEE标准1076”发布。从此,VHDL成为硬件描述语言的业界标准之一。2.2 VHDL的应用 VHDL是IEEE(Institute of Electrical and Electronics Engineers)标准的硬件描述语言,是现代电子系统设计的首选硬件设计计算机语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展了VHDL的内容,公布了新版本VHDL,
8、即IEEE 1076-1993。现在,VHDL与Verilog一样作为IEEE的工业标准硬件描述语言,得到公司的支持,在电子工程领域已成为事实上的通用硬件描述语言。3 FPGA的简述用EDA设计的音乐演奏电路主要用到了现场可编程门阵列(FPGA)。3.1 FPGA的介绍现场可编程门阵列(FPGA)在结构上由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,来实现一定的逻辑功能。3.2 FPGA的整体结构FPGA在结构上包含三部分:可编程逻辑块CLB、可编程输入输出模块IOB和可编程内部连线PI。(1) 可编程逻辑块CLB CLB是FPGA内的基本逻辑单元。3.3 Altera公司的FP
9、GAAltera公司的FPGA器件采用钢铝布线的先进CMOS技术,具有非常低的功耗和相当高的速度,而且采用连续式互连结构,提供快速的、连续的信号延迟。FPGA器件有两类配置下载方式:主动配置方式和被动配置方式。主动配置方式由FPGA期间引导配置操作过程,它控制着外部存储器和初始化过程,而被动配置方式则由外部计算机或控制器控制配置过程。 4 电子琴演奏系统设计原理分析4.1电子琴演奏设计的基本要求(1)设计一种以FPGA为控制核心的电子琴的设计方案,该方案通过编写有关程序和各种用户参数的设置,实现采用自顶向下的模块化设计方法,基于FPGA使用VHDL语言设计制作一个电子琴控制系统,自动演奏模块、
10、音阶发生器模块、数控分频模块。通过本设计,正确掌握数字系统的模块划分、并能自如应用硬件描述语言描述各模块功能,以实现系统设计。以VHDL语言和MAX+PLUSII为工具,在EDA实验系统主板上,实现了地铁自动售票系统。系统划分为几个功能模块,分模块进行分析和设计,系统给出相应的设计原理图和VHDL源程序,通过仿真实现预定的功能。(2)该控制电路设计部分主要包括自动演奏模块、音阶发生器模块、数控分频模块、显示功能模块,通过自主研发程序实现各电路模块功能,在实际运用中可以及时对钱币处理延时时间及数量进行监控与调整从而提高质量和速度,实用性强。4.2电子琴演奏原理声音的频谱范围一般在几十到几千赫兹,
11、利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲演奏电路的结构框图如图4.1所示:自动演奏模块喇叭驱动模块数控分频输出模块按键输入显示模块手动播放控制模块图4.1 电子琴演奏电路结构方框图4.3音名与频率的关系根据乐曲的12平均率规定计算出简谱中从低音l至高音1之间每个音符的频率。如表4.1所示:表4.1简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.63中音1523.25高音11046.50低音2293.67中音2587.33高音21174.66低音3329.63中音3659.25高音31318.51低音4349.
12、23中音4698.46高音41396.92低音5391.99中音5783.99高音51567.98低音6440中音6880高音61760低音7493.88中音7987.76高音71975.52由乐理知识可知,对电子琴声音的操作即对音乐频率以及音乐持续时间的操作。整体采用一个基准频率,基准频率经各个分频器产生的频率不应与简谱中各个音调的频率差别太大,基频太低则误差太大,基频太高则分频器过于复杂,因此因综合各方面考虑。由于简谱中最高音不超过2k,取所有音的最小公倍数便可。但人耳的精度,故只要保证各音名的相对频率不变即可。由可得各个音色的分频系数。采用N位的分频器的话,则初始化时计数器的值应为:本实
13、验采用12M时钟频率,预先进过16分频,为减少偶次谐波,展宽脉冲,在扬声器之前要进过一个2分频电路,故可得下表:表4.2谱中的音名与计数初值的关系音名初始值音名初始值音名初始值低音1612中音11342高音11689低音2770中音21409高音21728低音3909中音31478高音31763低音4973中音41510高音41779低音51090中音51569高音51808低音61195中音61621高音61834低音71288中音71667高音71857注:对于音乐中的休止符,其分频系数设为0,初始值设为2N-1即可(此处为2047)。4.4控制音长的节拍发生器该演奏电路演奏的乐曲是“梁祝
14、”片段,其最小的节拍为1拍。在音乐中,时间被分成均等的基本单位,每个单位叫做一个“拍子”或 称一拍。拍子的时值是以音符的时值来表示的,一拍的时值可以是四分音符(即以四分音符为一拍),也可以是二分音符(以二分音符为一拍)或八分音符(以八分音符为一拍)。故设置一个4Hz的时钟,每一次计数停留的时间为0.25s,即最小节拍。并经一个二进制计数器进行计数,将计数器的值作为ROM的地址进行寻址,这样便可以读出储存在ROM中的乐谱了。表4.1“梁祝“音阶图4.2 Rom模块5 电子琴硬件演奏电路的层次化设计方案根据层次化的设计思路,可把乐曲硬件演奏电路分为3块,自动演奏模块,手动播放控制模块,数控分频模块
15、。5.1按键控制模块此模块实际为一个查表模块,对于不同的按键输入,从表中读取相应的分频值及计数器初始化值,由节拍发生器决定其停留时间,改变节拍可改变演奏音符延时长短,将其输出给数控分频器,即可得到相应的声音。其VHDL程序见附录2仿真波形:图5.1 按键波形图5.2 AUTO键按下波形5.2自动演奏模块此模块有4个控制输入信号。Auto键,手动/自动模式切换按键。Back,倒退播放按键。Song,歌曲选择按键。Pause,暂停按键,与控制播放速度的d1,d0连接,通过一与门接入此模块,当d1,d0为11时,pause输入为1,此时此模块无输入脉冲(DVF模块阻止了脉冲),若不加处理,此时将一直
16、输出暂停之前的一个音符,所以利用pause信号,当暂停时,输出休止符。此模块的程序分为三部分:第一部分为内部rom的连接,利用MigaWizard Plug-in Manager生成ROM的软核嵌入到此模块中,counter与rom的地址线相连接,rom的输入端与器件的tone管脚相连接,便可在tone上获取rom的信息。第二部分为地址控制部分,但接收到脉冲上升沿时,根据外部输入(auto和back),决定rom的首地址(counter的初值)和counter的变化方式(递增或递减或暂停)以及切换歌曲时的地址切换。第三部分为decoder译码部分,从rom中取得数据后需要经过译码成为分频器的初
17、始值后作为下一级的输入信号。该模块将利用FPGA的片内ROM存放乐曲简谱真值表,有一个二进制计数器为乐曲数据存储器ROM的地址发生器。其VHDL程序见附录2仿真波形:图5.3 存储调用5.3自动播放控制模块音符译码电路即音调发生器实际上是一个查表电路,放置21个音乐简谱对应的频率表。手动播放控制是由一个2位预置数的分频模块和一个D触发器的组合,起到控制播放速度的作用,当d=”11”时,无分频信号输出,起到暂停的作用。由于正常播放音乐时频率为4hz,所以此模块的输入时钟为32hz。其VHDL源程序见附录2。仿真波形:图5.4 播放控制5.4数控分频模块设计这是一个可预置数的分频器,其预置数决定了
18、其发音的音调。其分频进过三个步骤,第一步根据预置数进行分频,产生PreClk信号,第二步,根据PreCLK信号,进行16分频,产生FULLSPKS信号。第三步,对FULLSPKS信号2分频拓展脉宽,形成最终的音频信号(262Hz1976Hz共21个音符)。其顶层设计的VHDL程序见附录2。仿真波形:图5.5 分频波形5.5数码管译码显示此模块由VHDL设计和芯片CD4511组合驱动数码管显示音阶、音名。为实现动态显示,就必须给予一个足够高的时钟节拍,轮流选通数码管,让不同的数码管在不同的时间片段内分别亮起,在选通某一个数码管时,要输出相应的码字。其顶层设计的VHDL程序见附录2。仿真波形:图5
19、.6 数码管译码图5.7 数码管选通5.6音频驱动模块本模块主要是提高数控分频出的音调频率的功率,然后驱动后面的喇叭发出音乐。其顶层设计的VHDL程序见附录2仿真波形:图5.8功放仿真结论这一周的课程设计,加强了我独立编程和解决问题的能力,让我自己对所学的知识更加的巩固了,运用自己EDA所学到的知识和同学们一起探讨在quarters中VHDL编程功能过程,在此期间与同学讨论设计方法和方案,和同学们相互探讨,相互学习。同时培养了自己的思考问题能力,遇到个别的难点去咨询老师。经过自己的努力终于把乐曲硬件演奏电路参透清楚,让我感到通过自己努力所到的知识是如此宝贵。通过这次的设计,综合运用本专业所学课
20、程的VHDL语言和仿真软件设计出各种模块电路,巩固与扩充了EDA课程所学的内容,掌握了电子琴的组成模块,各模块的作用,及编程中错误处理工作过程。经过查阅各种资料,对上课所学的知识,有了一个更好的形象的理解。通过课程设计,我才真正领略到quaters仿真软件功能强大,通过仿真节省了大量硬件软件资源。我想说,设计确实有些辛苦,但苦中有乐。孟老师和包老师循循善诱的教导和不拘一格的思路给予我无尽的启迪,老师认真工作态度带动了同学们的积极性,帮助我能够很顺利完成了这次课程设计。致谢课程设计的过程中,老师多次帮助我分析思路,开阔视角,在我们困惑不解时,及时的帮我们处理问题,使我们能坚持不懈努力到最后。在此
21、,谨向孟祥斌、包妍老师致以真挚的谢意和崇高的敬意。EDA课程设计中,我遇到了一群热心的好同学,我们互相帮助,共同进步,相互探讨。在学习和进步的过程中,难免会遇到各种突如其来的问题,我会向老师咨询探讨,老师也毫不保留的全数教予给我们,真正做到了老师的“传道,授业,解惑”。真的很感谢孟祥斌、包妍老师为我们的付出与奉献,才能使我的设计能顺利进行。在老师的指导下,我在各方面的能力都有所提高,老师以严谨求实,一丝不苟的教学态度和勤勉的工作态度,深深的感染到我,给了我巨大的启迪,鼓舞,成为我人生路上学习的榜样,使我的知识层次又有所提高。通过本次课程设计,不仅提高了我独立思考解决问题的能力,而且培养了认真严
22、谨,一丝不苟的学习态度,由于缺乏经验,设计中难免有不足的地方,希望老师多加指教。参考文献1 谭会生. EDA技术综合应用实例与分析. 西安电子科技大学出版社.20042 潘松. 王国栋VHDL实用教程M四川:电子科学大学出版社. 20013 江国强. EDA技术与应用M. 北京:电子工业出版社. 20054 杨国庆. 基于FPGA的乐曲演奏器片系统的分析J.现代电子技术.2006. 19期5 褚振勇. 翁木云FPGA设计及应用M. 西安:西安电子科技大学出版社. 20026 曹昕燕. 周凤臣.聂春燕. EDA技术与课程设计. 北京:清华大学出版社. 20067王松武. 于鑫. 武思军. 电子创
23、新设计与实践. 北京:国防工业出版社.20058 Alera公司.Data Book.1999dd9Synopsys Company. Power Compiler Quick Reference version 2004.0610At renta Company. SpyGlass L P2Designing RTL for Low Power.11 ALTERA DigitalLibrary 2002附录1总电路图如下:显示电路如下:存储电路如下:附录2 -键盘输入模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_U
24、NSIGNED.all;USE IEEE.STD_LOGIC_ARITH.ALL;-为增加易读性,用到了conv_std_logic_vector函数ENTITY ToneData IS PORT( key_in: IN STD_LOGIC_VECTOR(7 downto 0); code : OUT STD_LOGIC_VECTOR(3 downto 0); auto : STD_LOGIC; Tone : OUT STD_LOGIC_VECTOR(10 downto 0);END ENTITY;ARCHITECTURE ONE OF ToneData IS -tone音调 beginpro
25、cess(key_in) begin if auto = 0 then-模式判断 case key_in is-键盘判断when00000000|10000000=Tone=conv_std_logic_vector(2047,11);codeTone=conv_std_logic_vector(1342,11);codeTone=conv_std_logic_vector(1409,11);codeTone=conv_std_logic_vector(1478,11);codeTone=conv_std_logic_vector(1510,11);codeTone=conv_std_logi
26、c_vector(1569,11);codeTone=conv_std_logic_vector(1621,11);codeTone=conv_std_logic_vector(1667,11);codeTone=conv_std_logic_vector(1090,11);codeTone=conv_std_logic_vector(1195,11);codeTone=conv_std_logic_vector(1288,11);codeTone=conv_std_logic_vector(1689,11);codeTone=conv_std_logic_vector(1728,11);co
27、deTone=conv_std_logic_vector(1763,11);codeTone=conv_std_logic_vector(1779,11);code Tone=11111111111; -左边的1代表shift end case; else Tone = ZZZZZZZZZZZ;-高阻态输出 end if;end process; end ONE;-播放控制模块library ieee; -实际即是一个2位的数控分频器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity DVF is port (
28、clk : in std_logic; d : in std_logic_vector(1 downto 0); -输入控制端 fout : out std_logic ); -D触发器输出脉冲end entity;architecture one of DVF is signal full : std_logic; begin P1: process (clk) variable cnt2 : std_logic_vector(1 downto 0); begin if clkevent and clk = 1 then if cnt2 = 11 then cnt2 := d; - D被同步
29、预置给计数器cnt8 full = 1; -同时是使溢出标志信号full输出为高电平 else cnt2 := cnt2 + 1; -否则继续作加1计数 full = 0; - 且益处信号为低电平 end if ; end if ; end process P1; P2: process(full) variable cnt : std_logic; begin if fullevent and full = 1 then cnt := not cnt; -如果益处标志信号full为高电平,D触发器输出取反 if cnt = 1 then fout = 1 ; else fout = 0; e
30、nd if; end if ; end process P2;end one;-自动演奏模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;USE IEEE.STD_LOGIC_ARITH.ALL;entity notetabs isport( clk,auto,back,song,pause: in std_logic; Toneindex : out std_logic_vector(10 downto 0);end entity;architecture one of notetabs is
31、 component romport(address : in std_logic_vector(8 downto 0); inclock : in std_logic; q : out std_logic_vector(4 downto 0);end component; -声明ROM模块signal counter: std_logic_vector(8 downto 0);-地址发生器,512位signal tone :std_logic_vector(4 downto 0); -输出音符signal temp :std_logic_vector(1 downto 0);begincnt
32、8 : process(clk)begin temp counter = counter+1;if counter(8)= 1 then counter counter = counter-1;if counter(8)= 1 then counter counter = counter+1;if counter(8)= 0 then counter counter = counter-1;if counter(8)= 0 then counternull;-判断最高位,决定切换歌曲以及歌曲的循环 end case; end if; end process;decoder:process(to
33、ne)-从rom取出数据进行译码,作为下一级的输入 begin if auto = 1 then-判断自动/手动模式 if pause =1 then Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex ToneindexTonei
34、ndex=conv_std_logic_vector(2047,11); end case; end if;-译码,Toneindex为分频器的初值 else Toneindex counter,q=tone,inclock=clk);end;-数控分频模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;USE IEEE.STD_LOGIC_ARITH.ALL;entity notetabs isport( clk,auto,back,song,pause: in std_logic; Tonei
35、ndex : out std_logic_vector(10 downto 0);end entity;architecture one of notetabs is component romport(address : in std_logic_vector(8 downto 0); inclock : in std_logic; q : out std_logic_vector(4 downto 0);end component; -声明ROM模块signal counter: std_logic_vector(8 downto 0);-地址发生器,512位signal tone :st
36、d_logic_vector(4 downto 0); -输出音符signal temp :std_logic_vector(1 downto 0);begincnt8 : process(clk)begin temp counter = counter+1;if counter(8)= 1 then counter counter = counter-1;if counter(8)= 1 then counter counter = counter+1;if counter(8)= 0 then counter counter = counter-1;if counter(8)= 0 then counternull;-判断最高位,决定切换歌曲以及歌曲的循环 end case; end if;end process;