赣南师院物理与电子信息学院课程设计报告书姓名:涂丽平班级:06电子科学与技术学号:060803050时间:2008年12月20日八音电子琴的设计2论文题目八音电子琴的设计课程论文要求(1)设计一个简易的八音符电子琴,可通过按键输入来控制输出八个音。(2)演奏时可以选择是手演奏(由键盘输入)或自动演奏已存入的乐曲。(3)能显示所演奏的音谱和高低音的区别。设计过程一)设计目的:通过课程设计,加强自己的动手能力和运用所学知识解决问题的能力。EDA技术是电子设计的发展趋势,利用EDA工具可以代替设计者完成电子系统设计中的大部分工作。EDA工具从数字系统设计的单一领域,发展到今天,应用范围已涉及模拟、微波等多个领域,可以实现各个领域电子系统设计的测试、设计方针和布局布线等。设计者只要完成对电子系统的功能描述,就可以利用计算机和工具,进行设计处理,最终得到设计结果。当我们完成自己的设计课程时,不仅使我们提高了理论与实践的能力,还能使我们的心理素质得到提高,增强我们的自信心,让我们更好的发展自己。二)方案论证:方案一:采用单个的逻辑器件组合实现。八音电子琴可由三个模块组成。1.模块一:时钟分频器。作用是将高频时钟信号转化为低频音调信号。它由4个16进制计数器74161构成。分频出八个不同的音调频率。2.模块二:选频器。作用是选出所需要的频率,即选出八个调中的一个,它先用74148把八个信号编码成三位二进制数,再用八选一数据选择器74151把我们要用的信号选出来。3.整形输出器。作用是把选出来的波形转化为声音频率波形。用555定时器先把波形整形再用扬声器放出来。这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然,但是由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、八音电子琴的设计3体积过大等不利因素。例如八个不同的音符是由八个不同的频率来控制发出的,而采用方案一就可以运用不同的分频器来对信号进行不同程度的分频。方框图如下::方案二:采用VHDL语言编程来实现电子琴的各项功能。系统主要由乐曲自动演奏模块、音调发生模块和数控分频模块组成。和方案一相比较,方案二更加简洁,不需要去考虑电路内部具体是如何组成的只需要把它们的行为描述清楚,再把整个系统分为了若干个模块,而不用牵涉到具体的硬件电路。这是用用超高速硬件描述语言VHDL的优势,它不仅具有良好的电路行为描述和系统描述的能力而且通俗易懂,容易学习。用大规模的集成芯片,VHDL语言来设计实现,源程序经美国Altera公司的MAX+PLUSⅡ软件调试优化,下载到特定芯片(MAX系列的EPM7128SLC8415)后,可应用于实际的出租车计费系统中通过编程来实现。这种方法能够很好的硬件和软件结合起来,VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。从本文描述的出租车计费系统可以看出,通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;这样,使用语言描述的形式,大大缩短了开发周期,减少了开发难度,并使得系统更加灵活、稳健。经过对以上两种方案的分析、比较和总结,选用方案二来进行电子琴的设计。三)设计方案:分频器选频器整形输出器八音电子琴的设计4根据系统设计要求,系统设计采用自顶向下的设计方法,系统的整体组装设计总原理图如图下示,它由乐曲自动演奏模块、音调发生模块和数控分频模块组成。(1)乐曲自动演奏模块乐曲自动演奏模块的作用是产生8位发声控制输入信号。当进行自动演奏时,由存储在此模块的8位二进制数作为发声控制输入,从而自动演奏乐曲。模块设计如图下所示。(2)音调发生模块音调发生模块的作用时产生音阶的分频预置值。当8位发声控制输入信号中的某一位为高电平时,则对应某一音阶的数值将输出,该数值即为该音八音电子琴的设计5阶的分频预置值,分频预置值控制数控分频模块进行分频,由此可得到每个音阶对应的频率。模块设计如图下所示。3)数控分频模块数控分频模块是对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。模块设计如图下所示。四)VHDL源程序(1)乐曲自动演奏模块的VHDL源程序(AUTO.VHD)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYAUTOISPORT(CLK:INSTD_LOGIC;--系统时钟信号AUTO:INSTD_LOGIC;--键盘输入/自动演奏八音电子琴的设计6CLK2:BUFFERSTD_LOGIC;INDEX2:INSTD_LOGIC_VECTOR(7DOWNTO0);--键盘输入信号INDEX0:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--音符信号输出ENDAUTO;ARCHITECTUREBEHAVIORALOFAUTOISSIGNALCOUNT0:INTEGERRANGE0TO31;BEGINPULSE0:PROCESS(CLK,AUTO)VARIABLECOUNT:INTEGERRANGE0TO8;BEGINIFAUTO='1'THENCOUNT:=0;CLK2='0';ELSIF(CLK'EVENTANDCLK='1')THENCOUNT:=COUNT+1;IFCOUNT=4THENCLK2='1';ELSIFCOUNT=8THENCLK2='0';COUNT:=0;ENDIF;ENDIF;ENDPROCESS;MUSIC:PROCESS(CLK2)BEGINIF(CLK2'EVENTANDCLK2='1')THENIF(COUNT0=31)THENCOUNT0=0;ELSECOUNT0=COUNT0+1;ENDIF;ENDIF;ENDPROCESS;COM1:PROCESS(COUNT0,AUTO,INDEX2)BEGINIFAUTO='0'THENCASECOUNT0ISWHEN0=INDEX0=00000100;--3WHEN1=INDEX0=00000100;--3WHEN2=INDEX0=00000100;--3WHEN3=INDEX0=00000100;--3WHEN4=INDEX0=00010000;--5WHEN5=INDEX0=00010000;--5WHEN6=INDEX0=00010000;--5WHEN7=INDEX0=00100000;--6WHEN8=INDEX0=10000000;--8八音电子琴的设计7WHEN9=INDEX0=10000000;--8WHEN10=INDEX0=10000000;--8WHEN11=INDEX0=00000100;--3WHEN12=INDEX0=00000010;--2WHEN13=INDEX0=00000010;--2WHEN14=INDEX0=00000001;--1WHEN15=INDEX0=00000001;--1WHEN16=INDEX0=00010000;--5WHEN17=INDEX0=00010000;--5WHEN18=INDEX0=00001000;--4WHEN19=INDEX0=00001000;--4WHEN20=INDEX0=00001000;--4WHEN21=INDEX0=00000100;--3WHEN22=INDEX0=00000010;--2WHEN23=INDEX0=00000010;--2WHEN24=INDEX0=00010000;--5WHEN25=INDEX0=00010000;--5WHEN26=INDEX0=00001000;--4WHEN27=INDEX0=00001000;--4WHEN28=INDEX0=00000100;--3WHEN29=INDEX0=00000100;--3WHEN30=INDEX0=00000010;--2WHEN31=INDEX0=00000010;--2WHENOTHERS=NULL;ENDCASE;ELSEINDEX0=INDEX2;ENDIF;ENDPROCESS;ENDBEHAVIORAL;(2)音调发生模块的VHDL源程序(TONE.VHD)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTONEISPORT(INDEX:INSTD_LOGIC_VECTOR(7DOWNTO0);--音符输入信号CODE:OUTSTD_LOGIC_VECTOR(6DOWNTO0);--音符显示信号HIGN:OUTSTD_LOGIC;--高低音显示信号TONE0:OUTINTEGERRANGE0TO2047);--音符的分频系数ENDTONE;ARCHITECTUREARTOFTONEISBEGIN八音电子琴的设计8SEARCH:PROCESS(INDEX)BEGINCASEINDEXIS--分别按八个键得到的八个不同的输出声音的分频系数,再输出给分频器,得到八个音对应的频率。WHEN00000001=TONE0=773;CODE=1001111;HIGN='1';WHEN00000010=TONE0=912;CODE=0010010;HIGN='1';WHEN00000100=TONE0=1036;CODE=0000110;HIGN='1';WHEN00001000=TONE0=1116;CODE=1001100;HIGN='1';WHEN00010000=TONE0=1197;CODE=0100100;HIGN='1';WHEN00100000=TONE0=1290;CODE=0100000;HIGN='0';WHEN01000000=TONE0=1372;CODE=0001111;HIGN='0';WHEN10000000=TONE0=1410;CODE=0000000;HIGN='0';WHENOTHERS=TONE0=2047;CODE=0000001;HIGN='0';ENDCASE;ENDPROCESS;ENDART;(3)数控分频模块的VHDL源程序(FENPIN.VHD)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYFENPINISPORT(CLK1:INSTD_LOGIC;--系统时钟信号TONE1:ININTEGERRANGE0TO2047;--音频分频系数SPKS:OUTSTD_LOGIC);--驱动扬声器的音频信号ENDENTITYFENPIN;ARCHITECTUREARTOFFENPINISSIGNALPRECLK:STD_LOGIC;SIGNALFULLSPKS:STD_LOGIC;BEGINPROCESS(CLK1)VARIABLECOUNT:INTEGERRANGE0TO8;BEGINIF(CLK1'EVENTANDCLK1='1')THENCOUNT:=COUNT+1;八音电子琴的设计9IFCOUNT=2THENPRECLK='1';ELSIFCOUNT=4THENPRECLK='0';COUNT:=0;ENDIF;ENDIF;ENDPROCESS;PROCESS(PRECLK,TONE1)VARIABLECOUNT11:INTEGERRANGE0TO2047;BEGINIF(PRECLK'EVENTANDP