论文乐曲硬件演奏电路设计.docx
- 文档编号:20733694
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:50
- 大小:795.65KB
论文乐曲硬件演奏电路设计.docx
《论文乐曲硬件演奏电路设计.docx》由会员分享,可在线阅读,更多相关《论文乐曲硬件演奏电路设计.docx(50页珍藏版)》请在冰豆网上搜索。
论文乐曲硬件演奏电路设计
电子技术课程设计
————乐谱演奏电路设计
学院:
电子工程与电气自动化学院
专业、班级:
电子科学与技术
(1)班
姓名:
王志愿
学号:
12021034
指导教师:
常红霞
2014年12月
一:
设计任务要求…………………………………………….2
1:
课程设计题目………………………………………………2
2:
设计分析……………………………………………………2
3:
工程设计总述………………………………………………5
二:
总体框图……………………………………………………8
三:
选择器件……………………………………………………9
四:
功能模块:
(①模块图形、②程序、③功能仿真图、
④功能仿真图分析)……………………………………………9
1:
分频器(div)………………………………………………9
2:
计数器(notetabs)………………………………………11
3:
选择模块(choice)………………………………………12
4:
数据翻译模块(tontaba)………………………………14
5:
译码器模块(deled)……………………………16
6:
数控分频器模块(speakera)……………………………17
7:
乐谱数据ROM(四个模块)…………………………………19
8:
地址线的选择………………………………………………27
9:
led数码管位选功能的解决方案…………………………28
五:
总体设计电路图…………………………………………28六:
六:
结束语…………………………………………………………29
乐谱演奏电路设计
摘要
设计了一种基于FPGA的乐谱演奏,该乐谱演奏由用Verilog硬件描述语言设计的核心部件和适当的外围电路构成,可从蜂鸣器上进行演奏也可自动行乐曲演奏。
基于FPGA(现场可编程门阵列)芯片,利用Verilog语言,介绍了一种通用乐曲演奏电路的设计,可实现多个八度音阶的乐曲演奏,与简谱的对应关系简单,编程方便,占用资源少,通用性好,可作为IPcore模块引用,构成复杂的SOPC系统.关键词:
乐谱演奏;现场可编程门阵列(FPGA);智力产权核(IPcore);超高速集成电路硬件描述语言(Verilog);乐曲
Abstract
AnelectronicpianoisdesignedbasedonFPGA,whichconsistsofcoreparisthatdesignedbyusingVeriloghardwaredescriptionlanguages,aswellassomeperipherycircuits.Themusicalperformancecanbedonenotonlybykeysbutalsowithautomatictypeintheelectronicpiano.BasedonFPGA,byVeriloglanguage,thispaperintroducesauniversalmusiccircuitdesign,itcanplayhigh,middleandlowmultipletonality,simplecorrespondingrelationwithsimplemusicalnotation,whichprogramseasilyusinglittleresource.ItcanbeuseduniversallyforIPcoreinmakingcomplicatedSOPCsystem.Keywords:
electronicpiano;FieldProgrammableGateArray(FPGA);IntelligencePropertycore(IPcore);Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage(Verilog);music
1、设计任务要求
1、课程设计题目
设计一个乐曲演奏电路,能够自动播放编写好的音乐。
要求将音乐通过实验箱上的喇叭播放出来,数码管显示播放至第几首音乐。
(附加功能:
本设计在题目所要求的功能全部实现的基础之上又添加了许多附加功能,所有的功能将在“工程设计总述”中阐明,特此声明。
)
2、设计分析
(1)音乐硬件演奏电路基本原理
硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。
乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。
乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。
而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。
(2)音符频率的获得
多个不同频率的信号可通过对某个基准频率进行分频器获得。
由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。
若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。
若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。
实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。
本设计中选取1MHz的基准频率。
数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。
根据分频系数,可计算数控分频器得到的初始值。
(语言已经无法描述其中的原理了,程序可以说明此问题,关于初始值的解释,请看下文给出的程序)
初始值的计算公式如下:
由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。
由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:
其中
为音阶对应的频率。
表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
表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
(3)乐曲节奏的控制
一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。
计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。
(4)乐谱的发生
本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。
当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。
(5)选择模块
选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述比较简单,不在此详述。
(6)译码器等其他模块
译码器等模块在以前做实验的时候做过,且原理比较简单易懂,不再这里阐述。
3、工程设计总述
当一个4Hz的时钟脉冲来到时,乐谱发生器模块输出一个音符数据给分频系数模块,分频系数模块输出此音符相应的分频系数所需的初始值,将初始值送给数控分频器模块,当12MHz的时钟脉冲来到时,数控分频器就根据分频系数输出相应的频率(即此音符所对应的发生频率)给扬声器,扬声器就可发出对应音符的声音来.连续的8Hz的时钟脉冲就将乐谱发生器里所存储的音符数据一个接一个的送给了分频系数模块,再经过数控分频模块,最后扬声器一个接一个的发出音符数据所对应的声音来。
曲子也就流畅的播放出来了。
同时led数码管会随着音乐显示相应的乐谱,当乐曲一遍演奏完成后,乐曲发生器能自动从头开始循环演奏,这时用拨码开关选择播放的乐曲,拨码开关给选择器一个选择信号,即可选择相应的歌曲莫开中的数据进入数据翻译模块,播放出相应的歌曲,本工程选取了四首乐曲,以格雷码的形式编码,每次只变一位拨码开关,比较方便选择。
分别为:
0001菊花台
0011世上只有妈妈好
0010一剪梅
0110隐形的翅膀
乐谱如下:
、
二、总体框图
该工程由是个模块构成,其中有四个为乐谱储存模块ROM,如图所示。
1、分频器的功能是将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。
2、计数器完成计数功能,183进制(最长的歌曲菊花台有183个字符)每个时钟沿加一。
3、四个音乐模块分别记录了4首歌的乐谱。
根据上一模块计数器所计的数读取相应地址里的数据传递给下一模块。
4、选择器完成选择歌曲的功能。
5、数据翻译模块将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。
6、分频驱动器也就是一个数控分频器,完成分频的功能,并驱动蜂鸣器。
7、译码器将乐谱数据在led数码管上显示。
三、选择器件
1.EP2C5T144C8N芯片
2.实验箱底板电路
(包括蜂鸣器
7段数码管
)
3.计算机
四、功能模块
1.分频器(div)
将芯片上提供的50MHz的时钟分频为12MHz和8Hz的时钟,分别供计数器与分频驱动器(数控分频器)使用。
(1)模块图形:
(2)程序如下:
reg[23:
0]counter8Hz;
reg[23:
0]counter12MHz;
always@(negedgereset_lorposedgeclk)begin//6MHz分频
if(!
reset_l)begin
counter6MHz<=24'b0;
clk_6m<=1'b0;
end
elsebegin
if(counter12MHz==24'd4)begin
Counter12MHz<=0;
clk_12m<=~clk_12m;
end
elsebegin
Counter12MHz<=Counter12MHz+1;
end
end
end
always@(negedgereset_lorposedgeclk)begin//4Hz分频
if(!
reset_l)begin
Counter8Hz<=24'b0;
clk_8hz<=1'b0;
end
elsebegin
if(Counter8Hz==24'd6519999)begin
counter4Hz<=0;
clk_8hz<=~clk_8hz;
end
elsebegin
Counter8Hz<=Counter8Hz+1;
end
end
end
(3)仿真波形:
(4)仿真波形分析
由波形可看出ckl为输入50MHz的时钟信号,ckl12输出为平12MHz的时钟信号,clk8为8Hz的时钟信号,由于纸张有限没有打印出其全部波形。
经分析该模块功能完全正确。
2计数器(notetabs)
计数器完成计数功能,183进制(最长的歌曲菊花台有183个字符)每个时钟沿加一。
用于选择rom模块中的地址。
(1)模块图像:
(2)程序如下:
reg[7:
0]counter1;
always@(posedgeclkornegedgereset_l)begin
if(!
reset_l)begin
counter1<=8'b0;
end
elseif(counter1==8'hff)begin
counter1<=8'b0;
end
elsecounter1<=counter1+1'b1;
end
(3)仿真波形:
(4)仿真波形分析
由波形可看出,CLK为输入时钟信号,八位输出二进制信号在每个时钟上升沿加一(这一点由counter[7]~counter[0]可以看出,而counter1由于某某原因未能显示出,并不影响对该模块功能的判断)
经分析,该模块功能完全正确。
3选择模块(choice)
选择器完成选择歌曲的功能。
当a的信号为0001时将Q1的信号输出
为0011时将Q2的信号输出
为0010时将Q3的信号输出
为0110时将Q4的信号输出
(1)模块图像:
(2)程序如下:
modulemusic_display(
inputclk,
inputreset_l,
inputa,
outputregq1,q2,q3
);
reg[3:
0]a;
reg[4:
0]q1,q2,q3;//5位宽度的信号输出
reg[13:
0]start;//start为预置数
reg[7:
0]cnt;//cnt为8位计数器用于循环演奏
reg[7:
0]cnt_music;//cnt为8位计数器用于循环演
always@(posedgeclkornegedgereset_l)begin
if(!
reset_l)begin
a<=4'b0;
end
elsebegin
caseais
WHEN"0001"=>
b<="0001";
INDEX<=Q1;
WHEN"0011"=>
b<="0010";
INDEX<=Q2;
WHEN"0010"=>
b<="0011";
INDEX<=Q3;
WHEN"0110"=>
b<="0100";
INDEX<=Q4;
WHENOTHERS=>
null;
endcase;
endmodule
(3)仿真波形:
(4)仿真波形分析
由波形可看出,当输入信号a为0010时输出信号b与q3信号相同(即播放q3的音乐),输出信号index与a相同(即音乐选取显示与音乐选取按键相同)
第二个波形图,当输入信号为0001时,同样可以看出这一点,因此该模块功能完全正确。
4数据翻译模块(tontaba):
将选择器所选择的歌曲rom里的地址的数据翻译成分频驱动器(数控分频器)分频所需的控制数据、3个led灯数据(高中低音)、以及译码器所需的数据。
(1)模块图像:
(2)程序如下:
/*--------------数码管扫描译码--------*/
`timescale1ns/100ps
modulesmg_display(
inputclk,
inputreset_l,
input[2:
0]data,
outputreg[3:
0]seg_s,
outputreg[7:
0]seg
);
wire[3:
0]data0;
wire[3:
0]data1;
wire[3:
0]data2;
wire[3:
0]data3;
assigndata0=data/1000;
assigndata1=data%1000/100;
assigndata2=data%100/10;
assigndata3=data%10;
reg[1:
0]case_cnt;
always@(posedgeclkornegedgereset_l)begin
if(!
reset_l)begin
case_cnt<=2'b0;
end
elsebegin
case_cnt<=case_cnt+1'b1;
end
end
/*----------------数码管位选扫描——----*/
always@(posedgeclkornegedgereset_l)begin
if(!
reset_l)begin
seg_s<=4'b0;
end
elsebegin
case(case_cnt[1:
0])
2'b00:
seg_s<=4'b0001;
2'b01:
seg_s<=4'b0010;
2'b10:
seg_s<=4'b0100;
2'b11:
seg_s<=4'b1000;
default:
;
endcase
end
end
/*------------------把计算出的值放入寄存器hex中准备译码-----------------*/
reg[3:
0]hex;
always@(*)begin
case(case_cnt[1:
0])
2'b00:
hex<=data3;
2'b01:
hex<=data2;
2'b10:
hex<=data1;
2'b11:
hex<=data0;
default:
hex<=4'b0;
endcase
end
always@(negedgereset_lorposedgeclk)begin
if(!
reset_l)begin
seg<=8'b0;
end
elsebegin
case(hex[3:
0])
4'h0:
seg<=8'b11000000;
4'h1:
seg<=8'b11111001;
4'h2:
seg<=8'b10100100;
4'h3:
seg<=8'b10110000;
4'h4:
seg<=8'b10011001;
4'h5:
seg<=8'b10010010;
4'h6:
seg<=8'b10000010;
4'h7:
seg<=8'b11111000;
4'h8:
seg<=8'b10000000;
4'h9:
seg<=8'b10010000;
4'hA:
seg<=8'b01110111;
4'hB:
seg<=8'b01111100;
4'hC:
seg<=8'b00111001;
4'hD:
seg<=8'b01011110;
4'hE:
seg<=8'b01111001;
4'hF:
seg<=8'b01110001;
default:
;
endcase
end
end
endmodule
(3)仿真波形:
(4)仿真波形分析
由波形可看出,当输入信号index为00110时high0显示1,code显示6(即中音6),预置初值为101010111000,查询上文所列的表,可发现功能完全正确。
第二个波形图,输入信号00010,输出为中音2,再查预置初值,同样可发现完全正确。
因此该模块功能完全正确。
5.数控分频器模块(speakera)
不多说其功能,直接看程序。
(1)模块图像:
regclk_12m;
regclk_8hz;
reg[23:
0]counter8Hz;
reg[23:
0]counter12MHz;
always@(negedgereset_lorposedgeclk)begin//12MHz分频
if(!
reset_l)begin
counter12MHz<=24'b0;
clk_6m<=1'b0;
end
elsebegin
if(counter12MHz==24'd4)begin
Counter12MHz<=0;
clk_12m<=~clk_12m;
end
elsebegin
Counter12MHz<=counter12MHz+1;
end
end
end
always@(negedgereset_lorposedgeclk)begin//4Hz分频
if(!
reset_l)begin
Counter8Hz<=24'b0;
clk_8hz<=1'b0;
end
elsebegin
if(counter8Hz==24'd6519999)begin
Counter8Hz<=0;
clk_4hz<=~clk_8hz;
end
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 论文 乐曲 硬件 演奏 电路设计
![提示](https://static.bdocx.com/images/bang_tan.gif)