1一、题目分析1、分析要求,确定总体方框图本设计基本部分是用VHDL语言设计一个简易的八音符电子琴,在QuartusII平台下下载到Cyclone系列的EP1C12Q240C8芯片中,该电路设计能够实现DO、RE、MI、FA等八个音调的电子琴,发挥部分是设计一乐曲自动演奏器,用户自己编制乐曲存入电子琴,电子琴可以完成自动演奏。电子琴音乐产生原理及硬件设计由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了。根据系统设计要求,系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图1所示,它由乐曲自动演奏模块AUTO、音调发生模块TONE和数控分频模块FENPIN三部分组成。图1系统的整体组装设计原理图2、最终完成的技能指标(1)设计一个简易的八音符电子琴,它可通过按键输入来控制音响。(2)演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存入的乐曲。二、选择方案通过可编程逻辑器件(PLD)和VHDL硬件描述引言来实现电子琴的基本部分和发挥部分的设计。对于基本部分,设计的主体是数控分频器,对输入的频2率进行分频,得到各个音阶对应的频率最为输出。当按下不同的键时发出不同的声音。对于发挥部分,则在原设计的基础上,增加一个乐曲存储模块,代替了键盘输入,产生节拍控制(index数据存留时间)和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。方案一:由单片机来完成设计。可用单片机控制键盘的输入,以及产生相应的频率信号作为输出。目前,单片机的功能已比较强大,集成度日益增高且其设计和控制比较容易。但是由于在传统的单片机设计系统中必须使用许多分立元件组成单片机的外围电路,如锁存器,译码器等都需要单独的电路,因此整个系统显得十分复杂,抗干扰性差,在运行过程中容易死机或进入死循环,可靠性降低,而功耗费用增高。方案二:利用PLC来完成设计。目前利用PLC的技术已经比较成熟。PLC有其优点,其性能优异,体积小,可靠性和精度都比较好,在电子琴的设计中可采用PLC来完成硬件的控制,但是用PLC实现编程相对比较复杂,对于电子琴这种小型设计来说成本过高。方案三:利用可编程逻辑器件PLD来完成该设计。利用PLD可以很好的解决上述的问题。它的成品体积小,适合电子琴这种小型设计。其性能稳定,控制精度高(Xilinx公司的高密度,高速可预测延时,高性能系列芯片),易于管理和屏蔽,抗干扰能力强,可靠性高。综上,在本设计中选择第三种方案最优。三、各模块原理及其程序1、乐曲自动演奏模块乐曲自动演奏模块(AUTO.VHD)的作用是产生8位发声控制输入信号/当进行自动演奏时,由存储在此模块中的8位二进制数作为发声控制输入,从而自动演奏乐曲。为了实现扩展部分的设计,便需要多加上一个音乐存储模块,该模块的作用是产生8位发声控制输入index,auto为0或1时可以选择自动演奏或者键盘输入,如果auto为0,则而由存储在此模块中的8位二进制数来作为发声控制输入,由此便可自动演奏乐曲。此模块的VHDL语言中包括两个进程,首先是对基准脉冲进行分频得到4Hz的脉冲,作为第二个进程的时钟信号,它的目的是控制每个音阶之间的停顿时间,此处便是1/4=0.25s,第二个进程是音乐的存储,可根据需要编写不同的乐曲。这段模块的原理图如图2所示:3图2乐曲自动演奏模块原理图乐曲自动演奏模块可以由VHDL语言来实现,下面是一段主要代码: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;--8WHEN9=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;--2CLKAUTOINDEX0[7.0]INDEX2[7.0]4WHENOTHERS=NULL;ENDCASE;ELSEINDEX0=INDEX2;ENDIF;ENDPROCESS;ENDBEHAVIORAL;2、音调发生模块音调发生模块(TONE.VDL)的作用是产生获得音阶的分频预置值。当8位发声控制输入index中的某一位为高电平时,则对应某一音阶的数值将以端口tone输出,作为获得该音阶的分频预置值,该值作为数控分频器的输入,来对4MHz的脉冲进行分频,由此得到每个音阶相应的频率,例如输入index=00000010,即对应的按键是2,产生的分频系数便是6809;由code输出对应该音阶简谱的显示数码;由high输出指示音阶高8度的显示,低电平有效。这段模块的原理图如图3所示:图3音调发生模块原理图音调发生模块可以由VHDL语言来实现,下面是一段主要代码:BEGINCASEINDEXISWHEN00000001=TONE0=773;CODE=1001111;HIGH='1';WHEN00000010=TONE0=912;CODE=0010010;HIGH='1';WHEN00000100=TONE0=1036;CODE=0000110;HIGH='1';WHEN00001000=TONE0=1116;CODE=1001100;HIGH='1';WHEN00010000=TONE0=1197;CODE=0100100;HIGH='1';WHEN00100000=TONE0=1290;CODE=0100000;HIGH='0';WHEN01000000=TONE0=1372;CODE=0001111;HIGH='0';WHEN10000000=TONE0=1410;CODE=0000000;HIGH='0';WHENOTHERS=TONE0=2047;CODE=0000001;HIGH='0';ENDCASE;ENDPROCESS;TONE[10.0]INDEX[7.0]HIGHCODE[6.0]53、数控分频模块在对EDA的学习中,我们知道数控分频器的功能是在输入端输入不同数据时,对输入时钟产生不同的分频比,输出不同频率的时钟,以改变输出信号的频率。本设计中数控分频模块是利用并行预置数的减法计数器对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符相对应的频率。该模块的VHDL描述中包含了三个进程。首先对32MHz的基准脉冲进行分频得到8MHz的脉冲,然后按照tone1输入的分频系数对4MHz的脉冲再次分频,得到的便是所需要的频率。而第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,以使扬声器有足够功率发音。这段模块的原理图如图4所示:图4数控分频模块原理图数控分频模块可以由VHDL语言来实现,下面是一段主要代码:BEGINPROCESS(CLK1)VARIABLECOUNT:INTEGERRANGE0TO8;BEGINIF(CLK1'EVENTANDCLK1='1')THENCOUNT:=COUNT+1;IFCOUNT=2THENPRECLK='1';ELSIFCOUNT=4THENPRECLK='0';COUNT:=0;ENDIF;ENDIF;ENDPROCESS;PROCESS(PRECLK,TONE1)VARIABLECOUNT11:INTEGERRANGE0TO2047;BEGINIF(PRECLK'EVENTANDPRECLK='1')THENIFCOUNT11TONE1THENCOUNT11:=COUNT11+1;FULLSPKS='1';ELSECOUNT11:=0;FULLSPKS='0';ENDIF;ENDIF;CLK1SPKSTONE1[10.0]6ENDPROCESS;PROCESS(FULLSPKS)VARIABLECOUNT2:STD_LOGIC:='0';BEGINIF(FULLSPKS'EVENTANDFULLSPKS='1')THENCOUNT2:=NOTCOUNT2;IFCOUNT2='1'THENSPKS='1';ELSESPKS='0';ENDIF;ENDIF;ENDPROCESS;4、顶层设计该DIANZIQIN模块是整个电子琴设计的核心,也是VHDL程序的主程序,前面3个源程序都是作为子程序分别实现电子琴的某一功能,而DIANZIQIN模块则通过调用子程序最终实现乐曲演奏的目的,奏出美妙的乐曲。利用VHDL语言COMPONENT将三个模块组合起来,其中3个模块和DIANZIQIN模块的输入输出是一一对应的,该模块的符号编辑图如图5。图5顶层设计模块符号编辑图四、编程下载测试1、功能仿真功能仿真用于综合前检查设计的逻辑功能是否符合设计要求。仿真过程中可7以通过观察检测设计的输入信号,输出信号以及内部信号以检测设计的逻辑功能。如果仿真都通过的话就可以进行引脚锁定,然后下载程序,在实验箱上可以直观的看到结果。(1)乐曲自动演奏模块的仿真(如图6所示)图6乐曲自动演奏模块的仿真该图输入系统时钟信号CLK初值设为0,自动演奏AUTO设为1,键盘输入信号INDEX2为00,INDEX0为音符信号输出,是8位的二进制代码它根据COUNT0的值改变而改变。(2)音调发生模块的仿真(如图7)图7音调发生模块的仿真该图输入音符信号INDEX初值为00,输出是音符显示信号CODE为01,高低音显示信号为0,音符的分频系数为11111111即2047Hz。8(3)数控分频模块的仿真(如图8)图8数控分频模块的仿真该图输入系统时钟信号CLK1初值为0(各输出值都是在时钟信号的下降沿有效),音符分频系数TONE1为00100000即1290Hz,驱动扬声器的音频信号SPKS输出为1。(4)简易电子琴整个系统的仿真(如图9)图9简易电子琴整个系统的仿真该图输入系统时钟信号CLK初值为0,自动演奏信号HANDTOAUTO初值为0,键盘输入信号INDEX1为00000000;输出音符信号CODE1则为0110000,高低音节信号HIGH1