资源描述
EDA课程设计
音乐播放器
一、前言
1、课程的目的与任务
《EDA课程设计》(注:EDA即电子设计自动化,Electronics Design Automation)是继《模拟电子技术基础》、《数字电子技术基础》、《电子技术基础实验》课程后,电气类、自控类和电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分,其目的和任务是通过一周的时间,让学生掌握EDA的基本方法,熟悉一种EDA软件(MAXPLUS2),并能利用EDA软件设计一个电子技术综合问题,并在实验板上成功下载,为以后进行工程实际问题的研究打下设计基础。
2、课程的基本要求
1、 通过课程设计使学生能熟练掌握一种EDA软件(MAXPLUS2)的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。
2、 通过课程设计使学生能利用EDA软件(MAXPLUS2)进行至少一个电子技术综合问题的设计(内容可由老师指定或自由选择),设计输入可采用图形输入法或AHDL硬件描述语言输入法。
3、 通过课程设计使学生初步具有分析寻找和排除电子电路中常见故障的能力。
4、 通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告。
3、与其他课程的联系与分工
《EDA课程设计》中应用了《模拟电子技术基础》、《数字电子技术基础》中的基础知识和基本理论,并且利用了《电子技术基础实验》中的基本实验方法,在时间上的安排上应该在这些课程之后。
《EDA课程设计》的后续课程是《微机原理》等其它专业课程,《EDA课程设计》中对学生综合设计能力的培养将为这些后续课程的学习打下良好基础。
二、 设计任务及要求
用VHDL语言设计乐音的节拍与音符产生电路;用VHDL语言设计分频系数、音符显示数据产生电路;用VHDL语言设计可控分频器电路;理解简易音乐播放器总体设计方案。
掌握基本的VHDL语言;理解音乐播放电路设计方案。掌握用VHDL语言设计节拍与音符产生电路;掌握用VHDL语言设计分频系数、音符显示数据产生电路;掌握用VHDL语言设计可控分频器电路。设计结果:原理图与原程序、电路仿真图、能在实训系统上播放悦耳动听的音乐。
三、设计原理及总体框图
产生音乐的两个因素是音乐频率和音乐的持续时间,以纯硬件完成演奏电路比利用微处理器(CPU)来实现乐曲演奏要复杂的多如果不借助于功能强大的EDA工具和硬件描述语言,凭借传统的数字逻辑技术,即使最简单的演奏电路也难以实现。根据6.4.1的设计要求,乐曲硬件演奏电路系统主要由数控分频器和乐曲存储模块组成。数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。
1、音名与频率的关系
音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍.在两个八度音之间,又可分为十二个半音,每两个半音的频率比为4。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间,E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音1之间每个音名的频率如表1所示.
表1 简谱中的音名与频率的关系
音名
频率/Hz
音名
频率/Hz
音名
频率/Hz
低音1
261.63
中音1
532.25
高音1
1046.50
低音2
293.67
中音2
587.33
高音2
1174.66
低音3
329.63
中音3
659.25
高音3
1318.51
低音4
349.23
中音4
698.46
高音4
1396.92
低音5
391.99
中音5
783.99
高音5
1567.98
低音6
440
中音6
880
高音6
1760
低音7
493.88
中音7
987.76
高音7
1975.52
由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大,若基准频率过高,虽然误码差变小,但分频结构将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取舍合适的基准频率。本例中选取4MHz的基准频率,若无4MHz的时钟频率,实际上,只要各个音名间的相对品频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。
各音阶频率及相应的分频系数如表2所示。为了减少输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表2中的分频系数就是从4MHZ频率二分频得到的2MHZ频率基础上计算得出的。
表2 各音阶频率对应的分频值
音名
分频系数
初始值
音名
分频系数
初始值
音名
分频系数
初始值
低音1
7644
547
中音1
3822
4369
高音1
1911
6280
低音2
6810
1381
中音2
3405
4786
高音2
1270
6921
低音3
6067
2124
中音3
3034
5157
高音3
1517
6674
低音4
5727
2464
中音4
2864
5327
高音4
1432
6759
低音5
5102
3089
中音5
2551
5640
高音5
1256
6935
低音6
4545
3646
中音6
2273
5918
高音6
1137
7054
低音7
4050
4141
中音7
2025
6166
高音7
1013
7178
由于最大的分频系数为7644,故采用13位二进制计数器已能满足分频要求。在表2,除给出了分频比以外,给出了对应于各个音阶频率时计数器不同的初始值,对于乐曲中的休止符,要将分频系数设为0,即初始值为8191即可,此时扬声器将不会发声。对于不同的分频系数,加载不同的初始值即可。用加载初始值而不是将分频输出译码反馈,可以有效地减少本设计占用可编程逻辑器件的资源,也是同步计数器的一个常用设计技巧。
2、控制音长的节拍发生器
该演奏电路演奏的乐曲是“梁祝”片段,其最小的节拍为1拍。将1拍的时长定为0.25秒,则只需要再提供一个4Hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。对于占用时间较长的节拍,如全音符为4拍(重复4),2/4音符为2拍(重复2),1/4音符为1拍(重复1)。
3、总体框图:(如图1)
图1
总体框图说明:NOTETABS相当于一个计数器,通过计数自动加1读MUSIC模块里的值,然后通过MUXA选择模块选择MUSIC模块中不同的输出,TONETABA模块根据MUXA模块不同的输出选择相应的值,SPEAKERA模块根据TONETABA的输出对12MHZ的时钟信号进行分频,从而得到相信的频率输出发出声音(音调),从而实现播放不同的歌曲。
四、程序设计:
1、NOTETABS模块:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY NOTETABS IS
PORT(CLK: IN STD_LOGIC;
COUNTER1 :inout STD_LOGIC_vector(7 downto 0));
END NOTETABS;
ARCHITECTURE a OF NOTeTABs IS
BEGIN
P1:PROCESS (CLK,COUNTER1)
BEGIN
IF COUNTER1=183 THEN
COUNTER1 <= "00000000";
ELSIF CLK'EVENT AND CLK='1' THEN
COUNTER1 <= COUNTER1+1;
END IF;
END PROCESS;
END a;
创建符号:(如图2)
图2
2、muxA模块:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY muxA IS
PORT(a: IN STD_LOGIC_vector(3 downto 0);
b:out STD_LOGIC_vector(3 downto 0);
INDEX :OUT STD_LOGIC_vector(3 downto 0);
Q1:IN STD_LOGIC_vector(3 downto 0);
Q2:IN STD_LOGIC_vector(3 downto 0);
Q3:IN STD_LOGIC_vector(3 downto 0);
Q4:IN STD_LOGIC_vector(3 downto 0));
END muxA;
ARCHITECTURE a OF muxA IS
BEGIN
PROCESS (a,Q1,Q2,Q3,Q4)
BEGIN
CASE a IS
WHEN "0001" =>
b<="0001";
INDEX<=Q1;
WHEN "0011" =>
b<="0010";
INDEX<=Q2;
WHEN "0010" =>
b<="0011";
INDEX<=Q3;
WHEN "0110" =>
b<="0100";
INDEX<=Q4;
WHEN OTHERS =>
null;
END CASE;
END PROCESS;
END a;
创建符号:(如图3)
图3
3、TONETABA模块:
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 TONETABA;
ARCHITECTURE a OF TONETABA IS
BEGIN
SEARCH:
PROCESS (INDEX)
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 "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 a;
创建符号:(如图4)
图4
4、SPEAKERA模块:
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 SPEAKERA;
ARCHITECTURE a OF SPEAKERA IS
SIGNAL PRECLK : STD_LOGIC;
SIGNAL FULLSPKS : STD_LOGIC;
BEGIN
DIVIDECLK:
PROCESS (CLK)
VARIABLE COUNT4 : STD_LOGIC_vector(3 downto 0);
BEGIN
PRECLK <= '0';
IF COUNT4>11 THEN
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
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
SPKS <= '1';
ELSE
SPKS <= '0';
END IF;
END IF;
END PROCESS;
END a;
创建符号:(如图5)
图5
5、MUSIC模块:
Music1:liangzhu_rom(歌曲名:梁祝)
WIDTH=4;
DEPTH=256;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
00: 3;
01: 3;
02: 3;
03: 3;
04: 5;
05: 5;
06: 5;
07: 6;
08: 8;
09: 8;
10: 8;
11: 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: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: 7;
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;
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;
创建符号:(如图6)
图6
Music2:shengri_rom(歌曲名:生日快乐)
WIDTH=4;
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;
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;
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: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;
END;
创建符号:(如图7)
图7
Music3:yydcb_rom(歌曲名:隐形的翅膀)
WIDTH=4;
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: 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:15;
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: 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;
139:12;
140:13;
141:13;
142:15;
143:15;
144:10;
145:10;
146:9;
147:9;
148:8;
149:8;
150:8;
151:8;
152:8;
153:8;
154:8;
155:8;
156:8;
157:8;
158:15;
159:15;
160:15;
161:15;
162:13;
163:13;
164:12;
165:12;
166:10;
167:10;
168:9;
169:9;
170:9;
171:9;
172:9;
173:9;
174:9;
175:9;
176:8;
177:8;
178:8;
179:8;
180:8;
181:8;
182:8;
183:8;
END;
创建符号:(如图8)
图8
Music4:yijianmei_rom(歌曲名:一剪梅)
WIDTH=4;
DEPTH=256;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
00: 6;
01: 6;
02: 6;
03: 6;
04:10;
05:10;
06:10;
07:10;
08:10;
09:10;
10: 9;
11: 8;
12: 7;
13: 7;
14: 8;
15: 8;
16: 7;
17: 7;
18: 5;
19: 5;
20: 6;
21: 6;
22: 6;
23: 6;
24: 6;
25: 6;
26: 6;
27: 6;
28: 6;
29: 6;
30: 6;
31: 6;
32: 6;
33: 9;
34: 6;
35: 6;
36: 6;
37: 7;
38: 7;
39: 7;
40: 7;
41: 7;
42: 7;
43: 6;
44: 8;
45: 9;
46: 9;
47: 9;
48: 9;
49:10;
50:12;
51:10;
52: 9;
53:10;
54:10;
55:10;
56:10;
57:10;
58:10;
59:10;
60:10;
61:10;
62:10;
63:10;
64:10;
65:10;
66:10;
67:10;
68:12;
69:13;
70:13;
71:13;
72:13;
73:13;
74:13;
75:12;
76:10;
77: 9;
78: 9;
79: 9;
80: 9;
81: 9;
82: 9;
83: 8;
84: 9;
85:10;
86:10;
87:10;
88:10;
89:10;
90:10;
91: 9;
92:10;
93: 6;
94: 6;
95: 6;
96: 6;
97: 6;
98: 6;
99: 6;
100: 6;
101: 7;
102: 7;
103: 7;
104: 6;
105: 5;
106: 5;
107: 7;
108: 7;
109: 0;
110: 0;
111: 5;
112: 3;
113: 7;
114: 7;
115: 8;
116: 7;
117: 6;
118: 6;
119: 6;
120: 6;
121: 6;
122: 6;
123: 6;
124: 6;
125: 6;
126: 6;
127: 6;
128: 6;
129: 0;
130: 0;
131: 0;
END;
创建符号:(如图9)
图9
五、编译及仿真
仿真软件使用的是MAX PLUS II,Max+plusⅡ是Altera公司提供的FPGA/CPLD开发集成环境,Altera是世界上最大可编程逻辑器件的供应商之一。Max+plusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件。在Max+plusⅡ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。
NOTETABS模块仿真图:(如图10)
图10
MUXA模块仿真图:(如图11)
图11
TONETABA模块仿真图:(如图12)
图12
SPEAKERA模块仿真图:(如图13)
图13
MUSIC模块仿真图:(如图14)
Music1:
图14
Music2:(如图15)
图15
Music3:(如图16)
图16
Music4:(如图17)
图17
顶层文件仿真图:(如图18)
图18
六、硬件调试与结果分析
顶层文件编译仿真好之后,通过电脑连接到硬件上,下载顶层文件到FPGA里,下载完毕之后通过选择按键选择播放的歌曲,当A="0001"时,播放“梁祝”;当A="0011"时,播放“生日快乐”;当A="0010"时,播放“隐形的翅膀”;当A="0100"时,播放“一剪梅”。
七、 参考文献
[1]曹昕燕. <<EDA技术实验与课程设计>>.北京清华大学出版社,2004年
[2]焦素敏. <<EDA 技术基础 >>. 北京: 清华大学出版社,2005年
[3]焦素敏. <<EDA 课程设计指导书 >>. 河南工业大学,2008年
[4]黄智伟. <<FPGA系统设计与实践>>. 电子工业出版社,2005年
[5]刘昌华. <<数字逻辑EDA设计与实践>>. 国防工业出版社,2005年
八、 心得体会
通过这次课程设计,使我对VHDL语言有了更加深刻的了解,在书本上学的理论知识运用到了实践中,而课程设计做成功,增加了我学习EDA的兴趣,不论在以后的学习中还是工作中,EDA肯定是我们必不可少的工具。
在这次课程设计中遇到了不少的麻烦,我根据书上给的例题,发现程序写的比较的复杂,通过跟同学讨论,可以使用ROM进行编程,能根据自己喜欢的歌曲更方便的修改程序,一开始写的程序只能实现一首歌的循环,但是我想肯定可以根据不同的按键实现不同的歌曲的播放,有了这个想法之后,就不停的修改程序,但是总是实现不了,然后我就开始参考一些EDA的实验书,终于在和同学的努力下,找到了一种方法,就是使用多路选择器,根据输入的不同选择不同的输出,从而实现播放不同的歌曲,在硬件仿真中,由于EDA实验做的比较多,所以对试验箱也比较的熟悉,在仿真中没有遇到什么问题。
总之,不管是哪门课的课程设计,都能大大提高我们的动手能力,在做成功的基础上,增加我们学习的兴趣,所以学校开设的课程设计是很有必要的,希望以后能有更多的机会去参加实践,提高我们各方面的能力。
展开阅读全文