2022年音乐发生器及简单电子琴eda设计方案.docx
精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用音乐发生器及简洁电子琴的 eda 设计摘 要 本系统是采纳 EDA 技术设计的一个简易的八音符电子琴和音乐发生器,该系统基于运算机中时钟分频器的原理,采纳自顶向下的设计方法来实现,它可以通过按键输入来掌握音响;系统由乐曲自动演奏模块、乐器演示模块琴/乐功能挑选模块、音调发生模块和数控分频模块五个部分组成;系统实现是用硬件描述语言比VHDL按模块化方式进行设计,然后进行编程、时序仿真、整;合;本系统功能较齐全,有一定的使用价值关键字 电子琴; EDA ;VHDL ;音调发生; QuartusII ;1 引言:1.1 设计目的 1)利用数控分频器设计一个电子琴硬件电路和音乐发生器2)演奏时可以挑选是手演奏 1.2 设计的基本内容<键盘输入)或自动演奏已存入的乐曲,并且能自动重复演奏运用 VHDL语言对简易电子琴的各个模块进行设计,并使用 EDA 工具对各模块进行仿真验 证;本设计包含如下三个模块:乐曲自动演奏模块,音调发生模块,数控分频模块,最终把各个模块整合后,通过电路的输入输出对应关系连接起来 2.1 EDA 技术 EDA技术是在电子 CAD技术基础上进展起来的运算机软件系统,是指以运算机为工作平台,融合了应用电子技术、运算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动 设计;利用 EDA工具,电子设计师可以从概念、算法、协议等开头设计电子系统,大量工作可 以通过运算机完成,并可以将电子产品从电路设计、性能分析到设计出 IC 版图或 PCB版图的整个过程的运算机上自动处理完成;现在对EDA的概念或范畴用得很宽;包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有 EDA的应用;目前 EDA技术已 在各大公司、企事业单位和科研教案部门广泛使用;例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术;本文所指的EDA技术,主要针对电子电路设计、 PCB设计和 IC设计;2.2 硬件描述语言 VHDL 2.2.1 VHDL 的简介VHDL的 英 文 全 名 是 Very-High-Speed Integrated Circuit HardwareDescription Language, 产生于 1982 年; 1987 年底, VHDL被 IEEE和美国国防部确认为标准硬件描述语言;VHDL 语言是一种用于电路设计的高级语言,主要用于描述数字系统的结构,行为,功能和接口;除了含有很多具有硬件特点的语句外,VHDL 的语言形式和描述风格与句法是特别类似于一般的运算机高级语言;VHDL 的程序结构特点是将一项工程设计,或称设计实体 <可以是一个元件,一个电路模块或一个系统)分成外部 <或称可是部分 ,及端口 >和内部 <或称不行视部分),既涉及实体的内部功能和算法完成部分;在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体;2.2.2 VHDL 语言的特点功能强大、设计敏捷;支持广泛、易于修改;强大的系统硬件描述才能;独立于器件的设 计、与工艺无关;很强的移植才能;2.2.3 VHDL 的设计流程 用 VHDL语言设计电路的流程:在用 VHDL语言来设计电路时 , 主要的过程是这样的:<1)使用文本编辑器输入设计源文件;<2)使用编译工具编译源文件;VHDL 的编译器有很多,ACTIVE 公司, MODELSIM公司,SYNPLICITY 公司, SYNOPSYS公司, VERIBEST公司等都有自己的编译器;<3)功能仿真;对于某些人而言,仿真这一步似乎是可有可无的;但是对于一个牢靠的设计 而言,任何设计最好都进行仿真,以保证设计的牢靠性;另外,对于作为一个独立的设计工名师归纳总结 - - - - - - -第 1 页,共 10 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用程而言,仿真文件的供应足可以证明你设计的完整性;<4)综合;综合的目的是在于将设计的源文件由语言转换为实际的电路;这一部分的最终目 的是生成门电路级的网表 <Netlist);<5)布局、布线;这一步的目的是生成用于烧写的编程文件;在这一步,将用到第 <4)步生 CPLD/FPG厂商的器件容量,结构等进行布局、布线;这就似乎在设计 PCB 成的网表并依据 时的布局布线一样;先将各个设计中的门依据网表的内容和器件的结构放在器件的特定部位;然后,在依据网表中供应的各门的连接,把各个门的输入输出连接起来;<6)后仿真;这一步主要是为了确定你的设计在经过布局布线之后,是不是仍满意你的设计要 求;3 简易电子琴设计过程3.1简易电子琴的工作原理 音乐产生原理及硬件设计由于一首音乐是很多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率特别便利,我们可以利用单片机的定时 因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可;/ 计数器来产生这样方波频率信号,该电子琴可以实现两个功能,用按键 CS来挑选不同功能,第一种功能是用手动即通过按键的形式输入不同音名,其次种功能是 音乐发生器,可以自动重复播放“ 梁祝” 音乐;当 CS为高电平 1时,挑选功能二,当 CS为低电 平0时,挑选功能一,由于本设计是利用的 GW48EDA_PK3 试验系统,挑选的是 NO.3方案,所以要 长按试验箱上的八键,才会挑选功能二;其硬件原理图如图一CLK1 2MHZ VCCD.VCCCLK8HZ3.3V2.5V1144143142141140 139138 137T CIN136135134133IO132131130129128127126125 124123IO122121120 1191181172 O CI116D N1156 6114113112111110109A11VCCR.4R.NPNC.1LS.VCCR.IOIOIOIO2 IOCIIO DNGD NIOIOIOIOIOIOIOIOIOIOIOIOIO CINIO DNIOIOIOIOIOIORES2VCC108IO1 IO1*GGGIO2C VCCC VIO107RES2RES23VV1064IO1 IO1IO IO105Q.R.5104U.RES26IO1IO103IO1IO7IO1VCCIO31028VCCIO1GND10191001 0GNDCYCLONEIO99IO1IO1 1981 2IO1IO97RES2NOTIO1IO1 3DATA0IO961 4nCONFIGTD1951 594U21 6VCCA_PLL1IO93DS1DP Y1.5V1 7CLK0CLK292aCLK1CLK31 8GNDA_PLL1IO911 990GNDG_PLL1TDO2 0nCEOEP1 C3 T1 4 4C8TM S891 32 188RES22 2nCETCK872 3MSEL0n STATUS86MSEL1CONF_DONE2 4DCLKIO852 5 2 6IO1IO84 83Q9 LEDIO1IOBI/RBOa2 78251 22baIO1IORBIb2 88131 13cf gbIO1VCCIO3LTcNPN2 9VCCIO1GND807Ad1 04dR13 0GND4 O I C C IOD IO N GNT I C C V4 4D6 47 4IOIOIOIOIOIOIOIOIOIOIOIOIOIO16NT I C C IOD4 O I C C V4 6D7 6IOIOIOIO791Be95eec3 1IO1IO782Cf1 56f gd LEDgn3 27761 473 3IO1IO76DgR503 4IO1IO757 4LS2 48DPY_ 7-SEGIO1IO3 5IO1IO743 673IO1 IOIOIOION GIO NGN GIOIOIOIOCOMPONENT_7 3839 30 41 42 43 45 48 49 40 51 52 53 54 55 56 57 58 59 50 62 63 65 68 69 60 71 72 7CLKS1RESTVCCN1R32N2R33N3R34N4R35N5R36N6R37N7R38N8R39VCC+5VO C9 Q8 Q7 Q6 QH IN3 14 12 Q5 10 QU1RK L CST R4 0175 0K C90132K9 0132 K9 0132 K9 0132 K90132K90132 K9 0132 K9 0132K4 Q3 Q1 Q5 QD9D10D11D12D13D14D15D1612 119651 107423S2LEDLEDLEDLEDLEDLEDLEDLED11621531441351261171089SW-DIP8<图一)3.2简易电子琴的工作流程图 如图二所示名师归纳总结 - - - - - - -第 2 页,共 10 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用开头TO 初始化并开中断允放 TO 中断按键按下是否胜利识别按键功能依据按键功能,装入音符 T 到 TO 中启动 TO 工作按键释放是否胜利?停止 TO 工作<图二)3.3简易电子琴中各模块的设计系统内部结构图如下图图三所示key6.0key6.0tone:u1toneindex 13.0csbmux:u3toneindex 3.0Index 3.0tonetaba:u4HIGHspeakera:u5SpkSspkoutnotetabs:u2index 13.0CODE3.0clkTone10.0index 23.0Tone10.0code13.0high1clk8hzCLKtoneindex 23.0clk12mhz cs<图三)3.3.1 琴/乐功能挑选器 BMUX 模块程序:library ieee;use ieee.std_logic_1164.all;entity bmux is port index1:in std_logic_vector3 downto 0>;index2:in std_logic_vector3 downto 0>;cs :in std_logic;toneindex:out std_logic_vector3 downto 0>>;end;architecture arc_bmux of bmux is begin 名师归纳总结 - - - - - - -第 3 页,共 10 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用processcs> begin case cs is when '0'=>toneindex<=index1;when '1'=>toneindex<=index2;when others=>toneindex<=null;end case;end process;end arc_bmux;3.3.2 乐曲自动演奏 notetabs模块程序:library ieee;use ieee.std_logic_1164.all;entity notetabs is port CLK:in std_logic ; toneindex2:out std_logic_vector3 downto 0>>;end notetabs;architecture one of notetabs is signal counter:integer range 0 to 138;begin cnt8:processclk> begin if counter=138 then counter<=0;elsif clk'event and clk='1'then counter<=counter+1;end if;end process;search:processcounter> begin case counter is when 00=>toneindex2<="0011";when 01=>toneindex2<="0011";when 02=>toneindex2<="0011";when 03=>toneindex2<="0011";when 04=>toneindex2<="0101";when 05=>toneindex2<="0101";when 06=>toneindex2<="0101";when 07=>toneindex2<="0110";when 08=>toneindex2<="1000";when 09=>toneindex2<="1000";when 10=>toneindex2<="1000";when 11=>toneindex2<="1001";when 12=>toneindex2<="0110";when 13=>toneindex2<="1000";when 14=>toneindex2<="0101";when 15=>toneindex2<="0101";when 16=>toneindex2<="1100";when 17=>toneindex2<="1100";when 18=>toneindex2<="1100";when 19=>toneindex2<="1111";when 20=>toneindex2<="1101";when 21=>toneindex2<="1100";when 22=>toneindex2<="1010";when 23=>toneindex2<="1100";when 24=>toneindex2<="1001";when 25=>toneindex2<="1001";when 26=>toneindex2<="1001";when 27=>toneindex2<="1001";when 28=>toneindex2<="1001";when 29=>toneindex2<="1001";名师归纳总结 - - - - - - -第 4 页,共 10 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用when 30=>toneindex2<="1001";when 31=>toneindex2<="0000";when 32=>toneindex2<="1001";when 33=>toneindex2<="1001";when 34=>toneindex2<="1001";when 35=>toneindex2<="1010";when 36=>toneindex2<="0111";when 37=>toneindex2<="0111";when 38=>toneindex2<="0110";when 39=>toneindex2<="0110";when 40=>toneindex2<="0101";when 41=>toneindex2<="0101";when 42=>toneindex2<="0101";when 43=>toneindex2<="0110";when 44=>toneindex2<="1000";when 45=>toneindex2<="1000";when 46=>toneindex2<="1001";when 47=>toneindex2<="1001";when 48=>toneindex2<="0011";when 49=>toneindex2<="0011";when 50=>toneindex2<="1000";when 51=>toneindex2<="1000";when 52=>toneindex2<="0110";when 53=>toneindex2<="0101";when 54=>toneindex2<="0110";when 55=>toneindex2<="1000";when 56=>toneindex2<="0101";when 57=>toneindex2<="0101";when 58=>toneindex2<="0101";when 59=>toneindex2<="0101";when 60=>toneindex2<="0101";when 61=>toneindex2<="0101";when 62=>toneindex2<="0101";when 63=>toneindex2<="0101";when 64=>toneindex2<="1010";when 65=>toneindex2<="1010";when 66=>toneindex2<="1010";when 67=>toneindex2<="1100";when 68=>toneindex2<="0111";when 69=>toneindex2<="0111";when 70=>toneindex2<="1001";when 71=>toneindex2<="1001";when 72=>toneindex2<="0110";when 73=>toneindex2<="1000";when 74=>toneindex2<="0101";when 75=>toneindex2<="0101";when 76=>toneindex2<="0101";when 77=>toneindex2<="0101";when 78=>toneindex2<="0101";when 79=>toneindex2<="0101";when 80=>toneindex2<="0011";when 81=>toneindex2<="0101";when 82=>toneindex2<="0011";when 83=>toneindex2<="0011";when 84=>toneindex2<="0101";when 85=>toneindex2<="0110";when 86=>toneindex2<="0111";when 87=>toneindex2<="1001";when 88=>toneindex2<="0110";when 89=>toneindex2<="0110";when 90=>toneindex2<="0110";when 91=>toneindex2<="0110";when 92=>toneindex2<="0110";when 93=>toneindex2<="0110";when 94=>toneindex2<="0101";when 95=>toneindex2<="0110";when 96=>toneindex2<="1000";when 97=>toneindex2<="1000";when 98=>toneindex2<="1000";when 99=>toneindex2<="1001";when 100=>toneindex2<="1100";when 101=>toneindex2<="1100";when 102=>toneindex2<="1100";when 103=>toneindex2<="1010";when 104=>toneindex2<="1001";when 105=>toneindex2<="1001";when 106=>toneindex2<="1010";when 107=>toneindex2<="1001";when 108=>toneindex2<="1000";when 109=>toneindex2<="1000";when 110=>toneindex2<="0110";when 111=>toneindex2<="0101";when 112=>toneindex2<="0011";when 113=>toneindex2<="0011";when 114=>toneindex2<="0011";when 115=>toneindex2<="0011";when 116=>toneindex2<="1000";when 117=>toneindex2<="1000";when 118=>toneindex2<="1000";when 119=>toneindex2<="1000";when 120=>toneindex2<="0110";when 121=>toneindex2<="1000";名师归纳总结 - - - - - - -第 5 页,共 10 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用when 122=>toneindex2<="0110";when 123=>toneindex2<="0101";when 124=>toneindex2<="0011";when 125=>toneindex2<="0101";when 126=>toneindex2<="0110";when 127=>toneindex2<="1000";when 128=>toneindex2<="0101";when 129=>toneindex2<="0101";when 130=>toneindex2<="0101";when 131=>toneindex2<="0101";when 132=>toneindex2<="0101";when 133=>toneindex2<="0101";when 134=>toneindex2<="0101";when 135=>toneindex2<="0101";when 136=>toneindex2<="0000";when 137=>toneindex2<="0000";when 138=>toneindex2<="0000";when others=>null;end case;end process;end one;3.3.3 按键 tone 模块程序:library ieee;use ieee.std_logic_1164.all;entity tone is portkey:in std_logic_vector6 downto 0>;toneindex1:out std_logic_vector3 downto 0>>;end;architecture one of tone is begin search:processkey> begin case key is when"0000001"=>toneindex1<="0001";when"0000010"=>toneindex1<="0010";when"0000100"=>toneindex1<="0011";when"0001000"=>toneindex1<="0100";when"0010000"=>toneindex1<="0101";when"0100000"=>toneindex1<="0110";when"1000000"=>toneindex1<="0111";when others=>toneindex1<="0000";end case;end process;end;3.3.4ToneTaba模块程序:LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;ENTITY ToneTaba IS PORT Index : IN STD_LOGIC_VECTOR 3 DOWNTO 0> ; CODE : OUT STD_LOGIC_VECTOR 3 DOWNTO 0> ; HIGH : OUT STD_LOGIC ; Tone : OUT STD_LOGIC_VECTOR 10 DOWNTO 0>> ;END;ARCHITECTURE one OF ToneTaba IS BEGIN PROCESSIndex> 名师归纳总结 - - - - - - -第 6 页,共 10 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用 BEGIN CASE Index IS - 译码电路,查表方式,掌握音调的预置数 WHEN "0000" => Tone<="11111111111" ; CODE<="0000" ; HIGH <='0' ;- 2047 WHEN "0001" => Tone<="01100000101" ; CODE<="0001" ; HIGH <='0' ; - 773; WHEN "0010" => Tone<="01110010000" ; CODE<="0010" ; HIGH <='0' ; - 912; WHEN "0011" => Tone<="10000001100" ; CODE<="0011" ; HIGH <='0' ; -1036; when "0100" => tone<="10001011100" ; code<="0100"; high <='0';-1116; WHEN "0101" => Tone<="10010101101" ; CODE<="0101" ; HIGH <='0' ; -1197; WHEN "0110" => Tone<="10100001010" ; CODE<="0110" ; HIGH <='0'; -1290; WHEN "0111" => Tone<="10101011100" ; CODE<="0111" ; HIGH <='0' ; -1372; WHEN "1000" => Tone<="10110000010" ; CODE<="0001" ; HIGH <='1' ; -1410; WHEN "1001" => Tone<="10111001000" ; CODE<="0010" ; HIGH <='1' ; -1480; WHEN "1010" => Tone<="11000000110" ; CODE<="0011" ; HIGH <='1' ; -1542; WHEN "1100" => Tone<="11001010110" ; CODE<="0101" ; HIGH <='1' ; -1622; WHEN "1101" => Tone<="11010000100" ; CODE<="0110" ; HIGH <='1' ; -1668; WHEN "1111" => Tone<="11011000000" ; CODE<="0001" ; HIGH <='1' ; -1728; WHEN OTHERS => NULL ; END CASE; END PROCESS;END;3.3.5Speakera模块程序:LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;USE IEEE.STD_LOGIC_UNSIGNED.ALL ;ENTITY Speakera IS PORT clk : IN STD_LOGIC ; Tone : IN STD_LOGIC_VECTOR 10 DOWNTO 0> ; SpkS : OUT STD_LOGIC >;END;ARCHITECTURE one OF Speakera IS SIGNAL PreCLK, FullSpkS : STD_LOGIC ;BEGIN DivideCLK : PROCESSclk> VARIABLE Count4 : STD_LOGIC_VECTOR 3 DOWNTO 0> ; BEGIN 名师归纳总结 - - - - - - -第 7 页,共 10 页精选学习资料 - - - - - - - - - 个人资料整理 仅限学习使用 PreCLK <= '0'; - 将 CLK 进行 16分频, PreCLK 为 CLK 的 16 分频 IF Count4>11 THEN PreCLK <= '1'; Count4 := "0000"; ELSIF clk'EVENT AND clk = '1' THEN Count4 := Count4 + 1 ; END IF; END PROCESS; GenSpkS : PROCESSPreCLK, Tone>- 11位可预置计数器 VARIABLE Count11 : STD_LOGIC_VECTOR 10 DOWNTO 0> ;BEGIN IF PreCLK'EVENT AND PreCLK = '1' THEN IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1'; ELSE Count11 := Count11 + 1; FullSpkS <= '0'; END IF; END IF; END PROCESS; DelaySpkS : PROCESSFullSpkS>-将输出再 功率发音 VARIABLE Count2 : STD_LOGIC ;BEGIN 2 分频,展宽脉冲,使扬声器有足够 IF 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;3.3.6 顶层设计顶层 top 模块程序 library ieee;use ieee.std_logic_1164.all;entity top is portclk12mhz:in std_logic;clk8hz:in std_logic;key:in std_logic_vector6 downto 0>;cs:in std_logic;code1:out std_logic_vector3 downto 0>;high1:out std_logic;spkout:out std_logic>;end;architecture one of top is component tone portkey:in std_logic_vector6 downto 0>;toneindex1:out std_logic_vector3 downto 0>>;end component;component notetabs PORT clk : IN STD_LOGIC ; ToneIndex2 : OUT STD_LOGIC_VECTOR 3 DOWNTO 0> > ;END component;component bmux portindex1:in std_logic_vector3 downto 0>;名师归纳总结 - - - - -