乐曲硬件演奏电路.docx
《乐曲硬件演奏电路.docx》由会员分享,可在线阅读,更多相关《乐曲硬件演奏电路.docx(25页珍藏版)》请在冰点文库上搜索。
乐曲硬件演奏电路
目录
一、设计任务与要求……………………………3
二、总框体图 ……………………………3
三、选择器件 ……………………………4
四、功能模块 ……………………………4
1、音乐数据模块……………………………4
2、音符控制输出模块 ……………………………7
3、音符译码模块 ……………………………8
4、数控分频器模块……………………………11
5、分频器模块……………………………12
6、译码模块…………………………14
五、总体设计电路图 ……………………………15
1、总体电路原理图……………………………15
2、管脚分配图……………………………15
3、电路仿真结果……………………………16
4、硬件验证……………………………16
六、设计心得 ……………………………17
七、附录 ……………………………20
乐曲硬件演奏电路设计
一、设计任务与要求:
1、实验内容
利用可编程逻辑器件FPGA,设计乐曲硬件演奏电路,可自动演奏乐曲。
2、实验要求
(1)利用数控分频器设计硬件乐曲演奏电路。
(2)利用给定的音符数据定制ROM“music”。
(3)设计乘法器逻辑框图,并在QuartusII上完成全部设计。
(4)将音乐通过实验箱上的喇叭播放出来。
(5)与演奏发音相对应的简谱码输出在数码管上显示。
二、总体框图
设计思路:
C调音阶频率表:
音阶
频率Hz
音阶
频率Hz
音阶
频率Hz
1661.22
7
830.61
7
415.31
1479.98
6
739.99
6
370
1318.52
5
659.33
5
329.63
1174.66
4
587.33
4
293.67
1108.73
3
554.37
3
277.19
987.76
2
493.88
2
246.94
880
1
440
1
220
在《EDA技术实用教程》课程中,已经学习过数控分频器设计,即输入不同的预置数即可发出不同频率的声音。
由此,可以以此为设计基础。
设计一功能模块,能够将乐曲中的音符逐一以对应的频率以预置数的形式置入数控分频计中,即可利用该数控分频计产生不同的声音,演奏出设定好的音乐。
ROM中的音乐数据文件刚可由编辑好的音符填入MIF文件中再定制LPM_ROM将音符数据加载入ROM中,并设计程序在运行时自动读取ROM中的文件并置入数控分频器中。
当采用四四拍曲子时,每节拍持续时间为0.5秒。
置入数控分频器的速度也应与此同步或一致,避免音乐过快或过快慢而失真。
由已知的C调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发出声音的频率对应。
在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,以及驱动蜂鸣器发声的频率。
为了显示高音音调,可在音符预置数的译码过程中,同时译出高音音阶的信号,并利用LED灯输出信号。
同时,也可利用该译码模块,将当前演奏的音符简谱表达出来。
总体框图
三、选择器件
1.EP1C12Q240C8芯片及相应的连接设备
EP1C12Q240C8开发板是基于FPGA的硬件描述语言EDA和软内核嵌入式系统的SOPC开发平台。
系统采用多层PCB板设计,完善的电源和时钟设计,性能稳定可靠、结构紧凑美观。
系统采用主流FPGA构建平台,片内资源丰富,板载器件多、周边接口多、可扩展性强。
优化设计使系统调试方便,配置容易。
配备丰富的例程有利于FPGA和SOPC的学习、快速入门与提高。
FPGA/SOPC开发平台是电子、信息类专业学生学习FPGA和SOPC的理想良师益友,是各大专院校教学科研的良好工具,也可用于科研机构研发特色新产品。
2.外置扬声器
3.7段数码管
4.LED灯一个
5.计算机
四、功能模块
1、音乐数据ROM模块:
该模块为音乐曲谱的存放文件。
其利用LPM_ROM宏模块将共设定512个音符,每个音符宽度为5位,可存放高、中、低三阶21个音符的数据。
文件名为music.mif.
其中[0..127]存放第一首歌《挥着翅膀的女孩》,
[127..255]存放第二首歌《菊花台》,
[256..383]存放第三首歌《两只老虎》,
[384..512]存放第四首歌《世上只有妈妈好》,
在该数据中,每个字符持续时间为0.25秒(由音符控制输出模块的时钟源4HZ信号确定),故在根据乐谱中音符的实际持续时间进行编写。
如四四拍的则每拍时间为0.5秒,则此处对应数据应该持续两个字符。
MIF文件内容如下:
WIDTH=5;DEPTH=512;
音乐数据ROM模块不生成模块,通过定制LPM_ROM,以备下一个模块的使用。
2、音符控制输出模块NOTETABS:
该模块利用已定制完成的music.mif文件,通过给出LPM_ROM的数据地址,使LPM_ROM输出对应的音符,再送入音符译码电路,最终演奏出编好的音乐。
VHDL语句描述如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitynotetabsis
port(clk1:
instd_logic;
toneindex:
outstd_logic_vector(4downto0));
end;
architectureoneofnotetabsis
componentmusic
port(address:
instd_logic_vector(8downto0);
clock:
instd_logic;
q:
outstd_logic_vector(4downto0));
endcomponent;
signalcounter:
std_logic_vector(8downto0);
begin
cnt8:
process(clk1,counter)
begin
ifcounter=512thencounter<="000000000";
elsif(clk1'eventandclk1='1')then
counter<=counter+1;
endif;
endprocess;
u1:
music
portmap(address=>counter,q=>toneindex,clock=>clk1);
end;
◆其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:
根据时序图可看出,当输入clock1时,toneindex也相应的改变,即完成在同一ROM内存放多首歌曲。
3、音符译码电路TONETABS模块:
该模块将NOTETABS模块输出的音符译成输出电路的数控分频所需要预置数,并将对应的简谱数字用数码管显示出来,同时根据输出的音符,判断其高、中、低特性,并通过一个LED灯将高音显示出来。
其所输出的预置数由最后一级的数控频器所决定,参考值如下表:
音阶
频率
频率设定数
预置数
分频数
低7
415
2891
101101001011
00111
低6
370
2745
101010111000
00110
低5
329
2576
101000010000
00101
低4
293
2390
100101010101
00100
低3
277
2291
100011110010
00011
低2
246
2063
100000001111
00010
低1
220
1823
011100011111
00001
中7
830
3494
110110100101
01110
中6
740
3420
110101011100
01101
中5
659
3337
110100001001
01100
中4
587
3244
110010101100
01011
中3
554
3193
110001111001
01010
中2
493
3082
110000001001
01001
中1
440
2960
101110001111
01000
高7
1661
3795
111011010010
10101
高6
1479
3758
111010101101
10100
高5
1318
3717
111010000100
10011
高4
1174
3670
111001010110
10010
高3
1108
3645
111000111100
10001
高2
987
3589
111000000101
10000
高1
880
3528
110111000111
01111
0音
0
4095
111111111111
00000
其计算公式如下:
由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。
由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:
其中
为音阶对应的频率。
模块VHDL语句描述如下:
libraryieee;
useieee.std_logic_1164.all;
entityToneTabais
port(Index:
instd_logic_vector(4downto0);
CODE:
outstd_logic_vector(3downto0);
HIGH:
outstd_logic;
Tone:
outstd_logic_vector(11downto0));
end;
architectureoneofToneTabais
begin
Search:
process(Index)
begin
caseIndexis
When"00000"=>tone<="111111111111";code<="0000";high<='0';--4095
When"00001"=>tone<="011000001000";code<="0001";high<='0';--1544
When"00010"=>tone<="011100011110";code<="0010";high<='0';--1822
When"00011"=>tone<="100000010110";code<="0011";high<='0';--2070
When"00100"=>tone<="100010001000";code<="0100";high<='0';--2184
When"00101"=>tone<="100101011001";code<="0101";high<='0';--2393
When"00110"=>tone<="101000010010";code<="0110";high<='0';--2578
When"00111"=>tone<="101001100111";code<="0111";high<='0';--2663
When"01000"=>tone<="101100000100";code<="0001";high<='1';--2820
When"01001"=>tone<="101110001111";code<="0010";high<='1';--2959
When"01010"=>tone<="110000001001";code<="0011";high<='1';--3081
When"01011"=>tone<="110001000100";code<="0100";high<='1';--3140
When"01100"=>tone<="110010101100";code<="0101";high<='1';--3244
When"01101"=>tone<="110100001001";code<="0110";high<='1';--3337
When"01110"=>tone<="110100110011";code<="0001";high<='1';--3379
When"01111"=>tone<="110110000001";code<="0010";high<='1';--3457
When"10000"=>tone<="110111000111";code<="0010";high<='1';--3527
When"10001"=>tone<="111000000101";code<="0010";high<='1';--3589
When"10010"=>tone<="111000100001";code<="0010";high<='1';--3617
When"10011"=>tone<="111001010101";code<="0010";high<='1';--3669
When"10100"=>tone<="111010000100";code<="0010";high<='1';--3716
When"10101"=>tone<="111010011001";code<="0010";high<='1';--3737
When"10110"=>tone<="111011000000";code<="0010";high<='1';--3776
When"10111"=>tone<="111011100011";code<="0010";high<='1';--3811
When"11000"=>tone<="111100000010";code<="0010";high<='1';--3842
When"11001"=>tone<="111100010000";code<="0010";high<='1';--3856
When"11010"=>tone<="111100101010";code<="0010";high<='1';--3882
When"11011"=>tone<="111101000001";code<="0010";high<='1';--3905
When"11100"=>tone<="111101001100";code<="0010";high<='1';--3916
Whenothers=>null;
endcase;
endprocess;
end;
◆其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:
将NOTETABS模块输出的音符译成输出电路的数控分频所需要预置数,并将高音输出。
4、数控分频器计输出模块SPEAKERA:
该模块主体为一个12位的可预置数计数器。
其通过NOTETABS得到预置数,并对些进行计数。
当计满时便给出一个溢出信号。
再对此溢出信号进行二分频得到能驱动蜂鸣器且频率符合C大调的21个音阶的频率。
由此发出不同信号。
其VHDL语言描述如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityspeakerais
port(clk:
instd_logic;
tone:
instd_logic_vector(11downto0);
spks:
outstd_logic);
end;
architectureoneofspeakerais
signalpreclk,fullspks:
std_logic;
begin
divideclk:
process(clk)--对12MHZ时钟源进行12分频,输出1MHZ的脉冲信号。
variablecount4:
std_logic_vector(3downto0);
begin
preclk<='0';
ifcount4>11thenpreclk<='1';count4:
="0000";
elsifclk'eventandclk='1'thencount4:
=count4+1;
endif;
endprocess;
genspks:
process(preclk,tone)--12位预置数数控分频器
variablecount11:
std_logic_vector(11downto0);
begin
ifpreclk'eventandpreclk='1'then
ifcount11="111111111111"thencount11:
=tone;fullspks<='1';
elsecount11:
=count11+1;fullspks<='0';endif;
endif;
endprocess;
delayspks:
process(fullspks)--2分频,蜂鸣器推动电路。
variablecount2:
std_logic;
begin
iffullspks'eventandfullspks='1'thencount2:
=notcount2;
ifcount2='1'thenspks<='1';
elsespks<='0';endif;
endif;
endprocess;
end;
◆其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:
根据预置数的不同,其输出的频率也有规律性的变化。
5、分频器模块div_clk:
该模块主要是把从实验箱接入的50MHZ的频率进行分频,得到12MHZ的脉冲,以备后面的模块使用
模块VHDL语句描述如下:
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdiv_clkIS
PORT(clk_in:
INstd_logic;
div_out:
OUTstd_logic);
ENDdiv_clk;
ARCHITECTUREaOFdiv_clkIS
SIGNALfre_N:
integerrange0to2;
SIGNALclk_tmp:
std_logic;
BEGIN
div_out<=clk_tmp;
process(clk_in)
begin
iffalling_edge(clk_in)then
iffre_N>=1then
fre_N<=0;
clk_tmp<=notclk_tmp;
else
fre_N<=fre_N+1;
endif;
endif;
endprocess;
ENDa;
◆其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:
将50MHZ分成12MHZ的脉冲
6、译码模块deled
该模块将歌曲对应的简谱通过七段数码管显示。
模块VHDL语句描述如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitydeledis
port(num:
instd_logic_vector(3downto0);
led:
outstd_logic_vector(6downto0));
enddeled;
architecturefunofdeledis
--signalcount:
std_logic_vector(2downto0);
begin
led<="1111110"whennum="0000"else
"0110000"whennum="0001"else
"1101101"whennum="0010"else
"1111001"whennum="0011"else
"0110011"whennum="0100"else
"1011011"whennum="0101"else
"1011111"whennum="0110"else
"1110000"whennum="0111"else
"1111111"whennum="1000"else
"1111011"whennum="1001"else
"1110111"whennum="1010"else
"0011111"whennum="1011"else
"1001110"whennum="1100"else
"0111101"whennum="1101"else
"1001111"whennum="1110"else
"1000111"whennum="1111";
endfun;
◆其生成项目符号为:
该模块时序仿真图如下:
时序仿真说明:
对应的简谱变化时,数码管显示相应的发生变化,显示相应的简谱。
五、总体设计电路图:
1、总体电路原理图
2、管脚分配图
3、电路仿真结果
时序仿真说明:
当输入clk信号后,程序运行,数码管显示相应的简谱,扬声器播放歌曲,当输出为高音时,LED灯亮。
4、硬件验证
【1】IO3接in_clock
【2】IO5接扬声器
【3】IO9接LED灯
下载完成后,扬声器即发出声音,演奏出乐曲,同时数码管显示相应的简谱,当输出为高音是,IO9连接的LED灯亮。
六、设计心得
通过两周的努力,终于完成了此次课程设计。
此次课程设计主要参考了教材中基于FPGA的硬件演奏电路的设计,并根据课题要求,对其进行加工与改进,并最达到课题的要求,使其在QUARTUSП上选用目标芯片仿真实现了音乐硬件演奏电路的功能。
实践证明:
采用FPGA设计实现音乐硬件演奏电路的可行性和可靠性,而且更改乐曲容易,可根据需要修改ROM中的音符数据文件,从而使电路实现任一曲子的播放。
这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性。
在课程设计开始之前,我就广泛查找关于此类的文档或者其他相关的资料,一