EDA乐曲播放电路课程设计报告_第1页
EDA乐曲播放电路课程设计报告_第2页
EDA乐曲播放电路课程设计报告_第3页
EDA乐曲播放电路课程设计报告_第4页
EDA乐曲播放电路课程设计报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一.课程设计概述11.设计的题目2 2.设计要求2 3.设计构思2二.总体框图4三.具体各功能模块(模块图像,程序,波形图像,波形分析)21.计数器模块2 2.选择器模块4 3.数据翻译模块6 4.数控分频模块7 5.乐曲ROM的三个模块10 6.顶层文件的设计12 四.总体电路图(RLT电路图)14 五.课程设计总结15一.课程设计概述1.设计的题目乐曲播放电路2.设计要求:学习利用数控分频器设计硬件乐曲演奏电路,在实验四的基础上,改建电路的设计,增加功能自动选择曲目,可选的歌曲不少于3首。3.设计构思(1)音乐硬件演奏电路基本原理 硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,

2、若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。(2) 音符频率的获得多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为

3、小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。本设计中选取1MHz的基准频率。数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。根据分频系数,可计算数控分频器得到的初始值。(语言已经无法描述其中的原理了,程序可以说明此问题,关于初始值的解释,请看下文给出的程序)初始值的计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通

4、过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声(3) 乐曲节奏的控制 一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一

5、个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。(4) 乐谱的发生本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。(5) 选择模块 选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性。梁祝二.总体框图时钟计数器数控分频器选择器生日快乐隐形的翅膀时钟三.具体各功能模块1.计数器模块在notetabs中设置了一个8位二进制计数器(计数最大值为138),作为音符数据ROM的地址发生器。这个计数器的计数频率

6、为4HZ,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续的时间。例如,notetabs在以下的VHDL逻辑描述中,梁祝乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时间,相应的,所对应的“3”音符分频预制值为1036,在speakera中的输入端停留1秒。随着notetabs中计数器按4HZ的时钟频率作加法计数时,即随地址值递增时,音符数据ROM中的音符从ROM中通过tonelndex端口输向tonetaba模块,梁祝乐曲开始连续自然地演奏起来。(1)模块图像:(2)模块程序library ieee;use ieee.std_logic_1

7、164.all;use ieee.std_logic_unsigned.all;entity notetabs is port (clk:in std_logic; counter:inout std_logic_vector(7 downto 0);end;architecture one of notetabs is begin cnt8:process(clk,counter) begin if counter =138 then counter <="00000000" elsif (clk'event and clk='1') the

8、n counter <=counter+1; end if; end process; end;(3)仿真波形(4)波形分析由波形可看出来,CLK为输入时钟信号,八位输出二进制信号在时钟上升沿加一,经分析,该模块的功能正确。2.选择模块选择器完成歌曲的选择功能,当a输入为0001时,将Q1信号输出,对应歌曲为梁祝;当a为0010时,将Q2的信号输出,对应的歌曲为隐形的翅膀;当a为0011时,将Q3的信号输出,对应的歌曲为生日快乐。(1)模块图像(2)程序;LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIG

9、NED.ALL; ENTITY choice IS PORT(a: IN STD_LOGIC_vector(3 downto 0); b:out STD_LOGIC_vector(3 downto 0); INDEX :OUT STD_LOGIC_vector(4 downto 0); Q1:IN STD_LOGIC_vector(4 downto 0); Q2:IN STD_LOGIC_vector(4 downto 0);Q3:IN STD_LOGIC_vector(4 downto 0); END choice; ARCHITECTURE a OF choice IS BEGIN PRO

10、CESS (a,Q1,Q2,Q3) BEGIN CASE a IS WHEN "0001" => b<="0001" INDEX<=Q1; WHEN "0011" => b<="0010" INDEX<=Q2; WHEN "0010" => b<="0011" INDEX<=Q3; WHEN OTHERS => null; END CASE; END PROCESS; END a;(3)波形图(4)波形分析由波形分析

11、可知,当a输入为0001时,输出信号b与Q1信号相同,即播放第一首乐曲,此时b的信号输出为0001,因此该模块的功能符合要求。3.数据翻译模块音符的持续时间需根据乐曲的速度及每个音符的节拍数来决定。Tonetaba模块的功能首先是为speakera提供决定所发音符的分频预置数,而此数在speakera输入口停留的时间即为此音符的节拍值。模块tonetaba是乐曲简谱码对应的分频预置数查表电路,其中设置了三首乐曲全部音符所对应的分频预置数,每一音符的停留时间有音乐节拍和音调发生器模块notetabs的CLK的输入决定,在此为4HZ。(1)模块图像(2)程序library ieee;use iee

12、e.std_logic_1164.all;entity tonetaba is port (index:in std_logic_vector(4 downto 0); code: out std_logic_vector (4 downto 0); high: out std_logic; tone:out std_logic_vector(10 downto 0); end; architecture one of tonetaba isbegin search:process(index) begin case index is When "00001"=>to

13、ne<="01100000101"code<="00001"high<='0' When "00010"=>tone<="01110010000"code<="00010"high<='0' When "00011"=>tone<="10000001100"code<="00011"high<='0' When "

14、00100"=>tone<="10000110101"code<="00100"high<='0' When "00101"=>tone<="10010101101"code<="00101"high<='0' When "00110"=>tone<="10100001010"code<="00110"high<='

15、0' When "00111"=>tone<="10101011100"code<="00111"high<='0' When "01000"=>tone<="10110000010"code<="01000"high<='1' When "01001"=>tone<="10111001000"code<="01001&q

16、uot;high<='1' When "01010"=>tone<="11000000110"code<="01010"high<='1' When "01011"=>tone<="11000101000"code<="01011"high<='1' When "01100"=>tone<="11001010110"code

17、<="01100"high<='1' When "01101"=>tone<="11010000100"code<="01101"high<='1' When "01110"=>tone<="11010110101"code<="01110"high<='1' When "01111"=>tone<="110

18、11000000"code<="10001"high<='1' When "10000"=>tone<="11011101010"code<="10010"high<='1' When "10001"=>tone<="11100000111"code<="10011"high<='1' When "10010"=>

19、tone<="11100010110"code<="10100"high<='1' When "10011"=>tone<="11100101111"code<="10101"high<='1' When "10100"=>tone<="11101000110"code<="10110"high<='1' When &quo

20、t;10101"=>tone<="11101011010"code<="10111"high<='1'when others =>null;end case;end process;end;(3)波形图(4)波形分析从波形图可看出,当输入信号为00010,输出为中音2,查预置初值,发现完全正确,因此该模块功能正确。4.数控分频器模块音符的频率由speakera模块获得,这是一个数控分频器。由其CLK端输入一具有较高频率(这里是12HZ)的信号,通过speakera分频后由spkout输出,由于直接从

21、数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的一半。Speakera对CLK输入信号的分频比由11位预置数tone决定。Spkout的输出频率将决定每一音符的音调,这样,分频计数器的预制值tone与spkout的输出频率,就有了对应关系。例如在tonetaba模块中若取tone=1036,将发音符为“3”音的信号频率。(1)模块图像(2)程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speake

22、ra 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 : process(clk) variable count4 : std_logic_vector (3 downto 0); begin preclk <= '0' if count4>11 then

23、preclk <= '1' count4 := "0000" elsif clk'event and clk = '1' then count4 :=count4+1; end if; end process; genspks : process(preclk, tone) variable count11 : std_logic_vector(10 downto 0);begin if preclk'event and preclk = '1' then if count11 =16#7ff# then

24、 count11 := tone ; fullspks <= '1' else count11 := count11+1; fullspks <= '0' end if; end if; end process; delayspks : process(fullspks) variable count2 : std_logic;begin if fullspks'event and fullspks = '1' then count2 := not count2; if count2 ='1' then spk

25、s <='1' else spks <='0' end if; end if; end process;end;(3)波形图(4)波形分析由波形图分析,当tone给出不同的分频预置数,观察到分频效果是正确的,因此该模块的功能符合设计要求。 5.乐曲ROM的三个模块:(1)梁祝 width = 5;depth = 256;address_radix = dec;data_radix = dec;content begin00: 3;01: 3;02: 3;03: 3;04: 5;05: 5;06: 5;07: 6;08: 8;09: 8;10: 8;1

26、1: 9;12: 6;13: 8;14: 5;15: 5;16: 12;17: 12;18: 12;19: 15;20: 13;21: 12;22: 10;23:12;24:9;25:9;26:9;27:9;28:9;29:9;30:9;31:0;32:9;33:9;34:9;35:10;36:7;37:7;38:6;39:6;40:5;41:5;42:5;43:6;44:8;45:8;46:9;47:9;48:3;49:3;50:8;51:8;52:6;53:5;54:6;55:8;56:5;57:5;58:5;59:5;60:5;61:5;62:5;63:5;64:10;65:10;66:

27、10;67:12;68:7;69:7;70:9;71:9;72:6;73:8;74:5;75:5;76:5;77:5;78:5;79:5;80:3;81:5;82:3;83:3;84:5;85:6;86:7;87:9;88:6;89:6;90:6;91:6;92:6;93:6;94:5;95:6;96:8;97:8;98:8;99:9;100:12;101:12;102:12;103:10;104:9;105:9;106:10;107:9;108:8;109:8;110:6;111:5;112:3;113:3;114:3;115:3;116:8;117:8;118:8;119:8;120:6;

28、121:8;122:6;123:5;124:3;125:5;126:6;127:8;128:5;129:5;130:5;131:5;132:5;133:5;134:5;135:5;136:0;137:0;138:0;end;(2)生日快乐WIDTH=5; DEPTH=256; ADDRESS_RADIX=DEC; DATA_RADIX=DEC; CONTENT BEGIN 00:13; 01:13; 02:13; 03:13; 04:13; 05:13; 06:13; 07:12; 08:12; 09:10; 10:10; 11:10; 12:10; 13:12; 14:12; 15:12;

29、16:12; 17:15; 18:15; 19:15; 20:15; 21:13; 22:13; 23:12; 24:12; 25:13; 26:13; 27:13; 28:13; 29:13; 30:13; 31:13; 32:13; 33:10; 34:10; 35:10; 36:10; 37:12; 38:12; 39:13; 40:13; 41:12; 42:12; 43:12; 44:12; 45:10; 46:10; 47:10; 48:10; 49: 8; 50: 8; 51: 6; 52: 6; 53:12; 54:12; 55:10; 56:10; 57: 9; 58: 9;

30、 59: 9; 60: 9; 61: 9; 62: 9; 63: 9; 64: 9; 65: 9; 66: 9; 67: 9; 68: 9; 69: 9; 70: 9; 71:10; 72:10; 73:12; 74:12; 75:12; 76:12; 77:12; 78:12; 79:13; 80:13; 81:10; 82:10; 83:10; 84:10; 85: 9; 86: 9; 87: 9; 88: 9; 89: 8; 90: 8; 91: 8; 92: 8; 93: 8; 94: 8; 95: 8; 96: 8; 97:12; 98:12; 99:12; 100:12; 101:

31、12; 102:12; 103:10; 104:10; 105: 9; 106: 9; 107: 8; 108: 8; 109: 6; 110: 6; 111: 8; 112: 8; 113: 5; 114: 5; 115: 5; 116: 5; 117: 5; 118: 5; 119: 5; 120: 5; 121: 5; 122: 5; 123: 5; 124: 5; 125: 0; 126: 0; 127: 0;128: 0;129: 0;130: 0;131: 0;131: 0;132: 0;133: 0;134: 0;135: 0;136: 0;137: 0;138: 0; END;

32、(3)隐形的翅膀WIDTH=5; DEPTH=256; ADDRESS_RADIX=DEC; DATA_RADIX=DEC; CONTENT BEGIN 00: 10; 01: 10; 02: 12; 03:12; 04:15; 05:15; 06:15; 07:15; 08:15; 09:15; 10:15; 11:15; 12:15; 13:15; 14:15; 15:15; 16:13; 17:13; 18:12; 19:12; 20:13; 21:13; 22:15; 23:15; 24:10; 25:10; 26: 9; 27: 9; 28: 8; 29: 8; 30: 8; 31:

33、 8; 32: 8; 33: 8; 34: 8; 35:8; 36: 8; 37: 8; 38:15; 39:15; 40:15; 41:15; 42:13; 43:13; 44:12; 45:12; 46:10; 47:10; 48:9; 49:9; 50: 8; 51: 9; 52: 9; 53: 9; 54: 9; 55: 9; 56: 9; 57: 9; 58: 9; 59: 9; 60: 10; 61:10; 62:12; 63:12; 64:15; 65:15; 66:15; 67:15; 68:15; 69:15; 70:15; 71:15; 72:15; 73:15; 74:1

34、5; 75:15; 76:13; 77:13; 78:12; 79:12; 80:13; 81:13; 82:15; 83:15; 84:10; 85:10; 86:9; 87:9; 88: 8; 89: 8; 90: 8; 91: 8; 92: 8; 93: 8; 94: 8; 95: 8; 96: 8; 97: 8; 98:15; 99:15; 100:15; 101:15; 102:13; 103:13; 104:12; 105:12; 106:10; 107:10; 108: 9; 109: 9; 110: 8; 111: 8; 112: 8; 113: 8; 114: 8; 115:

35、 8; 116: 8; 117: 8; 118: 8; 119: 8; 120: 10; 121:10; 122:12; 123:12; 124:15; 125:15; 126:15; 127:15; 128:15; 129:15; 130:15; 131:15; 132:14; 133:14; 134:14; 135:14; 136:13; 137:13; 138:12; end; 6. 顶层文件的设计: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yinyuehe ispor

36、t (clk12MHZ:in std_logic; clk8HZ:in std_logic; code1:out std_logic_vector (4 downto 0); high1:out std_logic; a1:in std_logic_vector(3 downto 0); b1:OUT std_logic_vector(3 downto 0); spkout:out std_logic);end;architecture one of yinyuehe is component notetabs is port (clk:in std_logic; counter:inout

37、std_logic_vector(7 downto 0); end component; component yinxingdechiban ISPORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (4 DOWNTO 0) ); END component; component shengrikuaile ISPORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock: IN STD_LOGIC ;q: OUT STD

38、_LOGIC_VECTOR (4 DOWNTO 0); END component ; component lianzu ISPORT(address: IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (4 DOWNTO 0); END component; component choice IS PORT(a: IN STD_LOGIC_vector(3 downto 0); b:out STD_LOGIC_vector(3 downto 0); INDEX :OUT STD_LOGIC_vector(4 downto 0); Q1:IN STD_LOGIC_vector(4 downto 0); Q2:IN STD_LOGIC_vector(4 downto 0); Q3:IN STD_LOGIC_vector(4 downto 0); END component; component tonetaba is port (index:in std_logic_vector(4 downto 0); code: o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论