电子琴设计设计要求设计一个八音电子琴。由键盘输入控制音响,同时可自动演奏乐曲。用户可以将自己编制的乐曲存入电子琴,演奏时可选择键盘输入乐曲或者已存入的乐曲。系统组成系统由数控分频器和乐曲存储模块组成。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。模块设计1.顶层模块的设计2.自动演奏模块(automusic)的设计3.音调发生器(tone)模块的设计4.数控分频模块(speaker)的设计1.顶层模块的设计顶层模块由乐曲自动演奏(automusic),音调发生器(tone)和数控分频器(speaker)三个模块组成。其中乐曲演奏部分又包括了键盘编码。设置一个自动演奏/键盘输入切换auto,即当auto=“0”时,选择自动演奏音乐存储器里面的乐曲,auto=“1”时,选择键盘输入的信号。顶层设计原理图2.自动演奏模块(automusic)的设计音乐存储模块的作用是产生8位发声控制输入index。当auto为“0”时,由存储在此模块中的8位二进制数作为发声控制输入,可自动演奏乐曲。此模块的VHDL程序中包括两个进程,首先是对时基脉冲进行分频得到4Hz的脉冲,作为第二个进程的时钟信号,它用来控制每个音阶之间的停顿时间,1/4=0.25s;第二个进程是音乐的存储,可根据需要编写不同的乐曲。3.音调发生器(tone)模块的设计音调发生器的作用是产生获得音阶的分频预置值。当8位发声控制输入index中的某一位为高电平时,则对应某一音阶的数值将在端口tone输出,该数值即为该音阶的分频预置值,分频预置值控制数控分频器来对4MHz的脉冲进行分频,由此可得到每个音阶对应的频率。例如输入index=“00000010”,即对应的按键是2,产生的分频系数便是6809;code输出对应该音阶简谱的显示数码;high输出指示音阶高8度,低电平有效。4.数控分频模块(speaker)的设计数控分频模块对时基脉冲进行分频,得到与1、2、3、4、5、6、7七个音符对应频率。该模块的VHDL程序中包含了三个进程。首先对FPGA的32MHz的时基脉冲进行分频得到8MHz的脉冲,然后按照tone1输入的分频系数对8MHz的脉冲再次分频,得到所需要的音符频率。第三个进程的作用是在音调输出时再进行二分频,将脉冲展宽,使扬声器有足够发声功率。电子琴程序设计与仿真电子琴程序设计与仿真1.顶层程序与仿真2.音阶发生器程序与仿真3.数控分频模块程序与仿真4.自动演奏模块程序与仿真1.顶层程序与仿真--文件名:top.vhd--功能:顶层文件--最后修改日期:2004.3.20libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytopisPort(clk32MHz:instd_logic;--32MHz系统时钟handTOauto:instd_logic;--键盘输入/自动演奏code1:outstd_logic_vector(6downto0);--音符显示信号index1:instd_logic_vector(7downto0);--键盘输入信号high1:outstd_logic;--高低音节信号spkout:outstd_logic);--音频信号endtop;architectureBehavioraloftopiscomponentautomusicPort(clk:instd_logic;Auto:instd_logic;index2:instd_logic_vector(7downto0);index0:outstd_logic_vector(7downto0));endcomponent;componenttonePort(index:instd_logic_vector(7downto0);code:outstd_logic_vector(6downto0);high:outstd_logic;tone0:outintegerrange0to2047);endcomponent;componentspeakerPort(clk1:instd_logic;tone1:inintegerrange0to2047;spks:outstd_logic);endcomponent;signaltone2:integerrange0to2047;signalindx:std_logic_vector(7downto0);beginu0:automusicportmap(clk=clk32MHZ,index2=index1,index0=indx,Auto=handtoAuto);u1:toneportmap(index=indx,tone0=tone2,code=code1,high=high1);u2:speakerportmap(clk1=clk32MHZ,tone1=tone2,spks=spkout);endBehavioral;(顶层文件仿真图)2.音阶发生器程序与仿真--文件名:tone.vhd。--功能:音阶发生器程序。--最后修改日期:2004.4.13。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);--音符显示信号high:outstd_logic;--高低音显示信号tone0:outintegerrange0to2047);--音符的分频系数endtone;architectureBehavioraloftoneisbeginsearch:process(index)--此进程完成音符到音符的分频系数译码,音符的显示,高低音阶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;endBehavioral;(音阶发生器仿真图)3.数控分频模块程序与仿真--文件名:speaker.vhd。--功能:实现数控分频。--最后修改日期:20004.3.19。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityspeakerisPort(clk1:instd_logic;--系统时钟tone1:inintegerrange0to2047;--音符分频系数spks:outstd_logic);--驱动扬声器的音频信号endspeaker;architectureBehavioralofspeakerissignalpreclk,fullspks:std_logic;beginpulse1:process(clk1)--此进程对系统时钟进行4分频variablecount:integerrange0to8;beginifclk1'eventandclk1='1'thencount:=count+1;ifcount=2thenpreclk='1';elsifcount=4thenpreclk='0';count:=0;endif;endif;endprocesspulse1;genspks:process(preclk,tone1)--此进程按照tone1输入的--分频系数对8MHz的脉冲再次分频,得到所需要的音符频率variablecount11:integerrange0to2047;Beginifpreclk'eventandpreclk='1'thenifcount11tone1thencount11:=count11+1;fullspks='1';elsecount11:=0;fullspks='0';endif;endif;endprocess;delaysps:process(fullspks)--此进程对fullspks进行2分频variablecount2:std_logic:='0';beginiffullspks'eventandfullspks='1'thencount2:=notcount2;ifcount2='1'thenspks='1';elsespks='0';endif;endif;endprocess;endBehavioral;(数控分频模块仿真图)4.自动演奏模块程序与仿真--文件名:automusic.vhd--功能:实现自动演奏功能。--最后修改日期:2004.3.19。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityautomusicisPort(clk,Auto:instd_logic;--系统时钟;键盘输入/自动演奏index2:instd_logic_vector(7downto0);--键盘输入信号index0:outstd_logic_vector(7downto0));--音符信号输出endautomusic;architectureBehavioralofautomusicissignalcount0:integerrange0to31;--changesignalclk2:std_logic;beginpulse0:process(clk,Auto)--此进程完成对系统时钟8M的分频,得到4Hz的信号clk2variablecount:integerrange0to8000000;beginifAuto='1'thencount:=0;clk2='0';elsifclk'eventandclk='1'thencount:=count+1;ifcount=4000000(4)thenclk2='1';elsifcount=8000000(8)thenclk2='