EDA乐曲播放电路课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

3.设计构思
(1)音乐硬件演奏电路大体原理
硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,假设能利用程序来操纵FPGA芯片某个引脚输出必然频率的矩形波,接上扬声器就能够发出相应频率的声音。

乐曲中的每一音符对应着一个确信的频率,要想FPGA发出不同音符的音调,事实上只要操纵它输出相应音符的频率即可。

乐曲都是由连续串的音符组成,因此依照乐曲的乐谱依次输出这些音符所对应的频,就能够够在扬声器上持续地发出各个音符的音调。

而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必需准确地操纵乐曲的节拍,即乐曲中每一个音符的发生频率及其持续时刻是乐曲能够持续演奏的两个关键因素。

(2)音符频率的取得
多个不同频率的信号可通过对某个基准频率进行分频器取得。

由于各个音符的频率多为非整数,而分频系数又不能为小数,故必需将运算机取得的分频系数四舍五入取整。

假设基准频率太低,那么分频系数过小,四舍五入取整后的误差较大。

假设基准频率太高,尽管能够减少频率的相对误差,但分频结构将变大。

事实上应该综合考虑这两个方面的因素,在尽可能减少误差的前提下,选取适合的基准频率。

本设计当选取1MHz的基准频率。

数控分频器采纳12位二进制计数器,乐曲中的停止符,只要将分频系数设为0,即初始值=4095,现在扬声器可不能发声。

依照分频系数,可计算数控分频器取得的初始值。

(语言已经无法描述其中的原理了,程序能够说明此问题,关于初始值的说明,请看下文给出的程序)初始值的计算公式如下:由于所设计的数控分频计采纳12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数转变的脉冲信号。

由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声
(3)乐曲节拍的操纵
一样乐曲最小的节拍为1/4拍,假设将1拍的时刻定为1秒,那么只需要输出4Hz的1/4拍的时长(秒),关于其它占历时刻较长的节拍(必为1/4拍的整数倍)那么只需要将该音符持续输出相应的次数即可。

计数时钟信号作为输出音符快慢的操纵信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。

(4)乐谱的发生
本设计将乐谱中的音符数据存储在LPM-ROM中,假设某音在逻辑中停留了4个时钟节拍,即1秒的时刻,相应地,该音符就要在LPM-ROM中持续的四个
地址上都存储。

当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。

(5)选择模块
选择模块将用一个4位数的操纵信号操纵乐谱模块数据的选择性。

二.整体框图
三.具体各功能模块
1.计数器模块
在notetabs中设置了一个8位二进制计数器(计数最大值为138),作为音符数据ROM的地址发生器。

那个计数器的计数频率为4HZ,即每一计数值的停留时刻为秒,恰为当全音符设为1秒时,四四拍的4分音符持续的时刻。

例如,notetabs在以下的VHDL逻辑描述中,《梁祝》乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒的时刻,相应的,所对应的“3”音符分频预制值为1036,在speakera中的输入端停留1秒。

随着notetabs中计数器按4HZ的时钟频率作加法计数时,即随地址值递增时,音符数据ROM 中的音符从ROM中通过tonelndex端口输向tonetaba模块,《梁祝》乐曲
开始持续自然地演奏起来。

(1)模块图像:
(2)模块程序
library ieee;
use 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') then 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
USE
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 PROCESS (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)波形分析
由波形分析可知,当a输入为0001时,输出信号b与Q1信号相同,即播放第一首乐曲,现在b的信号输出为0001,因此该模块的功能符合要求。

3.数据翻译模块
音符的持续时刻需依照乐曲的速度及每一个音符的节拍数来决定。

Tonetaba模块的功能第一是为speakera提供决定所发音符的分频预置数,而此数在speakera输入口停留的时刻即为此音符的节拍值。

模块tonetaba是乐曲简谱码对应的分频预置数查表电路,其中设置了三首乐曲全数音符所对应的分频预置数,每一音符的停留时刻有音乐节拍和音调发生器模块notetabs的CLK的输入决定,在此为4HZ。

(1)模块图像
(2)程序
library ieee;
use 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 is
begin
search:process(index)
begin
case index is
When "00001"=>tone<="001";code<="00001";high<='0'; When "00010"=>tone<="000";code<="00010";high<='0'; When "00011"=>tone<="";code<="00011";high<='0'; When "00100"=>tone<="";code<="00100";high<='0'; When "00101"=>tone<="";code<="00101";high<='0'; When "00110"=>tone<="";code<="00110";high<='0';
When "00111"=>tone<="";code<="00111";high<='0'; When "01000"=>tone<="";code<="01000";high<='1'; When "01001"=>tone<="";code<="01001";high<='1'; When "01010"=>tone<="";code<="01010";high<='1'; When "01011"=>tone<="";code<="01011";high<='1'; When "01100"=>tone<="";code<="01100";high<='1'; When "01101"=>tone<="";code<="01101";high<='1'; When "01110"=>tone<="";code<="01110";high<='1'; When "01111"=>tone<="";code<="10001";high<='1'; When "10000"=>tone<="";code<="10010";high<='1'; When "10001"=>tone<="";code<="10011";high<='1'; When "10010"=>tone<="";code<="10100";high<='1'; When "10011"=>tone<="";code<="10101";high<='1'; When "10100"=>tone<="";code<="10110";high<='1'; When "10101"=>tone<="";code<="10111";high<='1'; when others =>null;
end case;
end process;
end;
(3)波形图
(4)波形分析
从波形图可看出,当输入信号为00010,输出为中音2,查预置初值,发觉完全正确,因此该模块功能正确。

4.数控分频器模块
音符的频率由speakera模块取得,这是一个数控分频器。

由其CLK端输入一具有较高频率(那个地址是12HZ)的信号,通过speakera分频后由spkout输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原先的一半。

Speakera对CLK输入信号的分频比由11位预置数tone 决定。

Spkout的输出频率将决定每一音符的音调,如此,分频计数器的预制值tone与spkout的输出频率,就有了对应关系。

例如在tonetaba模块中假设取tone=1036,将发音符为“3”音的信号频率。

(1)模块图像
(2)程序:
library ieee;
use 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 : 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;
(3)波形图
(4)波形分析
由波形图分析,当tone给出不同的分频预置数,观看到分频成效是正确的,因此该模块的功能符合设计要求。

5.乐曲ROM的三个模块:
(1)《梁祝》
width = 5;
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: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;
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;
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;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;
(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: 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;
end;
6. 顶层文件的设计:
library ieee;
use yinyuehe is
port (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 std_logic_vector(7 downto 0));
end component;
component yinxingdechiban IS
PORT
(
address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
clock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (4 DOWNTO 0) ); END component;
component shengrikuaile IS
PORT
(
address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
clock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (4 DOWNTO 0)); END component ;
component lianzu IS
PORT
(
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: out std_logic_vector (4 downto 0);
high: out std_logic;
tone:out std_logic_vector(10 downto 0)); end component;
component speakera is
port ( clk : in std_logic;
tone : in std_logic_vector(10 downto 0);
spks : out std_logic);
end component;
signal B,C,D:std_logic;
signal E,F,G,H: std_logic_vector(4 downto 0); signal J:std_logic_vector (10 downto 0);
signal A:std_logic_vector (7 downto 0);
begin
u1:notetabs port map(clk=>clk8HZ,counter=>A);
u2:yinxingdechiban port map (address=>A,clock=>clk8HZ,q=>E);
u3:shengrikuaile port map (address=>A,clock=>clk8HZ,q=>F);
u4:lianzu port map (address=>A,clock=>clk8HZ,q=>G);
u5:choice port map (a=>a1,Q1=>E,Q2=>F,Q3=>G,b=>b1,INDEX=>H); u6:tonetaba port map (index=>H,code=>code1,high=>high1,tone=>J); u7:speakera port map(clk=>clk12MHZ,tone=>J,spks=>spkout);
end;
四. 整体电路图(RTL电路图)
五 .课程设计总结
通过一个礼拜的尽力,终于把EDA的课程设计完成了。

尽管音乐播放电路的设计,之前实验有做过,可是对其中的工作原理一窍不通。

由于这次的课程设计选择了这一题目,因此花了专门大的时刻去明白得演奏电路的发音原理,音符的频率,不仅对把握了电路原理,也学习到了相关的乐理知识。

另外,对mif 文件的制定,也有了进一步的明白得。

在这次设计中,通过各模块程序的设计,对EDA的语言的设计利用,语法的把握,有了进一步的提高。

在实验进程中,发觉语法的错误,通过系统的提示,及书本知识的查阅,从而去更正错误,这一进程,对书本中提到的知识点有了更深的印象。

顶层文件的设计,真正地明白得了元件例化,端口映射,例化语句的应用,和信号作为各个元件间的连线的作用,信号与变量的区别。

尽管课程设计只是实验的综合,可是却让我体会到,从书本取得的知识很浅显,只有通过实际的应用,才能将知识转化为自己的东西,也只有通过自己的明白得,才能领会到其中所说的含义。

相关文档
最新文档