硬件电子琴及硬件乐曲演奏电路.docx
《硬件电子琴及硬件乐曲演奏电路.docx》由会员分享,可在线阅读,更多相关《硬件电子琴及硬件乐曲演奏电路.docx(13页珍藏版)》请在冰豆网上搜索。
硬件电子琴及硬件乐曲演奏电路
FPGA嵌入式系统设计专题实践
结课论文
题目:
硬件电子琴及硬件乐曲演奏电路
专业:
电子信息科学与技术
一、设计题目
硬件电子琴及硬件乐曲演奏电路
二、设计目标
1.学习利用蜂鸣器和按键设计硬件电子琴
2.利用硬件电子琴原理设计硬件演奏电路
3.掌握VHDL编程语言,了解实际设计中的优化方案
三、设计原理
音乐演奏的原理是:
由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的两个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。
四、设计内容
1、硬件电子琴
(1)原理图
(2).分频器程序
--filenameclk_div3.vhd
--description:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYClk_Div3IS
PORT(clk_in:
INSTD_LOGIC;
clk_out:
OUTSTD_LOGIC);
END;
ARCHITECTUREmyArchitectureOFClk_Div3is
SIGNALcnt1,cnt2:
integerrange0to2;
SIGNALclk1,clk2:
STD_LOGIC;
BEGIN
PROCESS(clk_in)
BEGIN
IFrising_edge(clk_in)THEN
IFcnt1<2THEN
cnt1<=cnt1+1;
ELSE
cnt1<=0;
ENDIF;
IFcnt1<1THEN
clk1<='1';
ELSE
clk1<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clk_in)
BEGIN
IFfalling_edge(clk_in)THEN
IFcnt2<2THEN
cnt2<=cnt2+1;
ELSE
cnt2<=0;
ENDIF;
IFcnt2<1then
clk2<='1';
ELSE
clk2<='0';
ENDIF;
ENDIF;
ENDPROCESS;
clk_out<=clk1ORclk2;
END;
(3).七个中音主程序
modulebeepx(clk,key,beep,led,ledbt);//模块名称beep
inputclk;//系统时钟12MHz
input[7:
0]key;//按键输入
outputbeep;//蜂鸣器输出端
output[7:
0]led;
output[7:
0]ledbt;//LED输出
regbeep_r;//寄存器
reg[15:
0]count,count_end;
reg[7:
0]key_r;
reg[7:
0]led_bt;
always@(posedgeclk)
begin
count<=count+1'b1;//计数器加1
if((count==count_end)&(!
(count_end==16'hffff)))
begin
count<=16'h0;//计数器清零
beep_r<=!
beep_r;//取反输出信号
end
end
always@(key)
begin
key_r=key;//取键值
case(key_r)
8'b11111110:
begincount_end=16'h2CCA;key_r=8'b11111001;led_bt=8'b11111110;end//中音1的分频系数值
8'b11111101:
begincount_end=16'h27E8;key_r=8'b10100100;led_bt=8'b11111110;end//中音2的分频系数值
8'b11111011:
begincount_end=16'h238D;key_r=8'b10110000;led_bt=8'b11111110;end//中音3的分频系数值
8'b11110111:
begincount_end=16'h218E;key_r=8'b10011001;led_bt=8'b11111110;end//中音4的分频系数值
8'b11101111:
begincount_end=16'h1DE5;key_r=8'b10010010;led_bt=8'b11111110;end//中音5的分频系数值
8'b11011111:
begincount_end=16'h1AA2;key_r=8'b10000010;led_bt=8'b11111110;end//中音6的分频系数值
8'b10111111:
begincount_end=16'h17BA;key_r=8'b11111000;led_bt=8'b11111110;end//中音7的分频系数值
8'b01111110:
begincount_end=16'h166B;key_r=8'b11111001;led_bt=8'b11111110;end//高音1的分频系数值
8'b01111101:
begincount_end=16'h13F4;key_r=8'b10100100;led_bt=8'b11111110;end//高音2的分频系数值
8'b01111011:
begincount_end=16'h11C7;key_r=8'b10110000;led_bt=8'b11111110;end//高音3的分频系数值
8'b01110111:
begincount_end=16'h10C7;key_r=8'b10011001;led_bt=8'b11111110;end//高音4的分频系数值
8'b01101111:
begincount_end=16'h0EF3;key_r=8'b10010010;led_bt=8'b11111110;end//高音5的分频系数值
8'b01011111:
begincount_end=16'h0D51;key_r=8'b10000010;led_bt=8'b11111110;end//高音6的分频系数值
8'b00111111:
begincount_end=16'h0BDD;key_r=8'b11111000;led_bt=8'b11111110;end//高音7的分频系数值
default:
count_end=16'hffff;
endcase
end
assignbeep=beep_r;//输出音乐
assignled=key_r;//输出按键状态
assignledbt=led_bt;
endmodule
2.硬件乐曲演奏电路。
(1)内存分配图
(2)主程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbuzzerIS
PORT(
ch:
INstd_logic;--键盘与歌曲播放选择
cho:
INstd_logic;--歌曲切换
key_data:
INstd_logic_vector(2DOWNTO0);--电子琴组合键盘输入
clk:
INstd_logic;--系统时钟
out_bit:
OUTstd_logic);--输出给蜂鸣器
ENDbuzzer;
ARCHITECTUREarchOFbuzzerIS
COMPONENTliangzhu
PORT(address:
instd_logic_vector(7downto0);
clock:
instd_logic;
q:
outstd_logic_vector(15downto0));
ENDCOMPONENT;
signalsta1:
std_logic_vector(7downto0);
signalsta:
integerrange0to147;
signalcount:
std_logic_vector(15DOWNTO0);
signalcount_end:
std_logic_vector(15DOWNTO0);
signalcount1:
std_logic_vector(23DOWNTO0);
signalout_bit_temp:
std_logic;
signalkey_temp:
std_logic_vector(2DOWNTO0);
signalcount_end_temp:
std_logic_vector(15DOWNTO0);
signalchoice:
std_logic;
--音调分频数
CONSTANTsuo0:
std_logic_vector(15DOWNTO0):
="1110111100101000";--61224
CONSTANTla0:
std_logic_vector(15DOWNTO0):
="1101010100010001";--54545
CONSTANTxi0:
std_logic_vector(15DOWNTO0):
="1011110111010001";--48593
CONSTANTduo:
std_logic_vector(15DOWNTO0):
="1011001100100111";--45863
CONSTANTlai:
std_logic_vector(15DOWNTO0):
="1001111110100000";--40864
CONSTANTme:
std_logic_vector(15DOWNTO0):
="1000111000110010";--36402
CONSTANTfa:
std_logic_vector(15DOWNTO0):
="1000011000110111";--34359
CONSTANTsuo:
std_logic_vector(15DOWNTO0):
="0111011110010100";--30612
CONSTANTla:
std_logic_vector(15DOWNTO0):
="0110101010001001";--27273
"010*********
"010*********
"010*********
"010*********
"010*********
CONSTANTsuo1:
std_logic_vector(15DOWNTO0):
="0011101111001010";--15306
CONSTANTla1:
std_logic_vector(15DOWNTO0):
="0011010101000100";--13636
CONSTANTxi1:
std_logic_vector(15DOWNTO0):
="0010111101110111";--12151
CONSTANTduo2:
std_logic_vector(15DOWNTO0):
="0010101001100011";--10851
CONSTANTt:
std_logic_vector(23DOWNTO0):
="101101110001101100000000";
BEGIN
out_bit<=out_bit_temp;
key_temp<=key_data;
PROCESS(cho)--歌曲间切换
BEGIN
IF(cho'EVENTANDcho='1')THEN
choice<=NOTchoice;
ENDIF;
ENDPROCESS;
PROCESS(clk)--分频后的音调输出控制
BEGIN
IF(clk'EVENTANDclk='1')THEN
count<=count+1;
IF(count=count_end)THEN
count<=x"0000";
out_bit_temp<=NOTout_bit_temp;
ENDIF;
ENDIF;
ENDPROCESS;
U:
liangzhuPORTMAP(address=>sta1,q=>count_end_temp,clock=>clk);
--与liangzhu.vhd的接口
PROCESS(clk,ch,choice,cho)--音调单位时长和曲谱依次播放(sta自加)控制
BEGIN
IF(ch='1')THEN--键盘与歌曲播放切换
IF(clk'EVENTANDclk='1')THEN
IF(count1count1<=count1+1;
ELSE
count1<=x"000000";
IF(choice='1')THEN
sta<=0;
IF(sta1=10001010)THEN
sta1<="00000000";
ELSE
sta1<=sta1+1;
count_end<=count_end_temp;--《梁祝》曲谱信息赋给count_end
ENDIF;
ELSE
sta1<="00000000";
IF(sta=147)THEN
sta<=0;
ELSE
sta<=sta+1;
CASEstaIS--《友谊天长地久》曲谱信息
WHEN0|1=>count_end<=suo0;
WHEN2TO8=>count_end<=duo;
WHEN9|10=>count_end<=me;
WHEN11TO14=>count_end<=lai;
WHEN15=>count_end<=duo;
WHEN16|17=>count_end<=lai;
WHEN18|19=>count_end<=me;
WHEN20TO24=>count_end<=duo;
WHEN25|26=>count_end<=me;
WHEN27|28=>count_end<=suo;
WHEN29TO33=>count_end<=la;
WHEN34TO38=>count_end<=la;
WHEN39TO42=>count_end<=suo;
WHEN43TO45=>count_end<=me;
WHEN46|47=>count_end<=duo;
WHEN48TO51=>count_end<=lai;
WHEN52=>count_end<=duo;
WHEN53|54=>count_end<=lai;
WHEN55|56=>count_end<=me;
WHEN57TO60=>count_end<=duo;
WHEN61TO63=>count_end<=la0;
WHEN64TO65=>count_end<=suo0;
WHEN66TO69=>count_end<=duo;
WHEN70TO73=>count_end<=duo;
WHEN74|75=>count_end<=la;
WHEN76TO79=>count_end<=suo;
WHEN80TO82=>count_end<=me;
WHEN83|84=>count_end<=duo;
WHEN85TO88=>count_end<=lai;
WHEN89=>count_end<=duo;
WHEN90|91=>count_end<=lai;
WHEN92|93=>count_end<=la;
WHEN94TO97=>count_end<=suo;
WHEN98TO100=>count_end<=me;
WHEN101|102=>count_end<=suo;
WHEN103TO106=>count_end<=la;
WHEN107TO110=>count_end<=la;
WHEN111|112=>count_end<=duo1;
WHEN113TO116=>count_end<=suo;
WHEN117TO119=>count_end<=me;
WHEN120|121=>count_end<=duo;
WHEN122TO125=>count_end<=lai;
WHEN126=>count_end<=duo;
WHEN127|128=>count_end<=lai;
WHEN129|130=>count_end<=me;
WHEN131TO134=>count_end<=duo;
WHEN135TO137=>count_end<=la0;
WHEN138|139=>count_end<=suo0;
WHEN140TO143=>count_end<=duo;
WHEN144TO147=>count_end<=duo;
WHENOTHERS=>count_end<=(others=>'0');
ENDCASE;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ELSE
CASEkey_tempIS--组合琴键设置
WHEN"011"=>count_end<=duo;
WHEN"101"=>count_end<=lai;
WHEN"110"=>count_end<=me;
WHEN"001"=>count_end<=fa;
WHEN"100"=>count_end<=suo;
WHEN"010"=>count_end<=la;
WHEN"000"=>count_end<=xi;
WHENOTHERS=>count_end<=(others=>'0');
ENDCASE;
ENDIF;
ENDPROCESS;
ENDarch;
五、实验现象:
按键1到7表示七个音符,当按下一个按键时发出对应的音符声音,并且在第一位数码管上显示对应的数字。
让程序运行后使蜂鸣器播放一段音乐,并且通过按键可对其进行暂停、播放、切换等操作。
六、实验感想:
通过这次试验让我更加认识到EDA在多方面的应用,以及了解一些相关的编程,提高了我对实验箱的操作能力。
为即将进行的毕业设计做了良好的基础。