一、 设计任务及要求:
利用EDA/SOPC实验开发平台提供的16*16点阵LED以及EP2C35核心板,实现“梁祝”乐曲发生器。
1、查阅相关资料,明确设计步骤;
2、采用Verilog HDL编程语言设计程序;
3、能够按照设定节拍(每拍持续1s)顺畅的播放“梁祝"乐曲并且听着基本无错;
4、 扩张要求:自主设计(如快放、倒放、换歌等)。
二、 设计原理及方案
乐曲播放器的基本原理是,一个音符对应一个频率信号.频率的高低决定了音调的高低.音乐的十二个平均率规定:每两个八度音之间的频率相差一倍.在两个八度音之间又可以分为十二
个半音,每两个半音的频率比为2。另外,音名A(简谱中的低音6)的频率为440HZ,音名B到C之间、E到F之间为半音,其余为全音.由此可以计算出简谱中从低音1至高音1之间每个音名对应的频率,;利用高低音如下关系可得下表:
低8度音:基本音频率/2 , 例如低音1的频率为523/2=261。5;
高8度音:基本音频率×2,例如高音1的频率为523×2=1046
音符与频率的对应关系如下
音名 | 频率(Hz) | 音名 | 频率(Hz) | 音名 | 频率(Hz) |
低音1 | 261。5 | 中音1 | 523 | 高音1 | 1046 |
低音2 | 293。5 | 中音2 | 587 | 高音2 | 1174 |
低音3 | 329.5 | 中音3 | 659 | 高音3 | 1318 |
低音4 | 349 | 中音4 | 698 | 高音4 | 1396 |
低音5 | 392 | 中音5 | 784 | 高音5 | 1568 |
低音6 | the weepies440 | 中音6 | 880 | 高音6 | 1760 |
听妈妈讲那过去的事低音7 | 499 | 中音7 | 998 | 高音7 | 1996 |
各音阶频率对应的分频比及预置数
音名 | 分频比 | 预置数 | 音名 | 分频比 | 预置数 | 音名 | 分频比 | 预置数 |
低音1 | 1912 | 135 | 中音1 | 956 | 1091 | 高音1 | 478 | 1569 |
低音2 | 1704 | 343 | 中音2 | 852 | 1195 | 高音2 | 426 | 1621 |
低音3 | 1517 | 530 | 中音3 | 759 | 1288 | 高音3 | 379 | 1668 |
低音4 | 1433 | 614 | 中音4 | 716 | 1331 | 高音4 | 358 | 1689 |
低音5 | 1276 | 771 | 中音5 | 638 | 1409 | 高音5 | 319关之琳与高尔夫球 | 1728 |
低音6 | 1136 | 911 | 中音6 | 568 | 1479 | 高音6 | 284 | 1763 |
低音7 | 1002 | 1045 | 中音7 | 501 | 中国好声音盲人歌手张玉霞1546 | 高音7 | 250 | 1797 |
对于乐曲中的休止符,只要将分频系数设为0,即初始值为1047,此时扬声器不发音。
从上表中可以看出,最大分频系数为1912,所以采用11位二进制计数器分频可满足需要。对于不同的分频系数,只要加载不同的预置数即可.采用加载预置数实现分频的方法比采用
反馈复零法节约资源,实现起来也容易一些。
音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定.本设计中将全音的持续时间设为1s,提供的4Hz的时钟频率即可产生四分音符的时长。控制音长通过控制计数器预置数的停留时间来实现的,预置数停留的时间越长,则该音符演奏的时间也就越长.每个音符的演奏时间都是0.25s的整数倍,对于节拍较长的音符,如二分音符,在记谱时将该音名联系记录两次即可。对照以上规则可编制乐谱的程序.
为了减小输出的偶次谐波分量,最后输出到扬声器上的波形应为对称方波,因此在扬声器之前有一个二分频的分频器.
为了使演奏能循环进行,需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏!
综上所述编制“梁祝”乐曲发生器需要编制分频器、11为计数器、乐谱等部分,综合以上各功能即可实现乐曲发生器.
三、 电路设计与实现
电路原理图如下:
1、外部输入脉冲信号时钟源(50Mhz)经分频器输出4Hz、1Mhz的脉冲信号,分别供控制器和受控器使用。
2、控制器根据乐曲的节拍产生受控器所需要的预置值,乐曲的一拍持续1s。
3、受控器在1MHz时钟信号的控制下从11位预置值开始做加1计数。输出并进行二分频将输出信号分频。
4、管脚对应表
信号名称 | 对应FPGA管脚名 | 说明 |
50MHz | L1 | 基准时钟 |
OU | H14 | 扩张接口 JP3-80 |
程序实现如下:
module song (clk,speaker);
input clk;
output speaker;
reg[3:0] high,med,low;
reg[10:0] divider,origin;
reg[7:0] counter;
reg speaker;
reg[5:0] count1;
reg[23:0] count2;
reg clk_1mhz,clk_4hz;
wire carry;
always@(posedge clk)//分频器设计1
begin
if(count1<=49)
begin
count1<=count1+1;
clk_1mhz〈=0;
end
else
begin
count1<=0;
clk_1mhz〈=1;
end
end
陈小霞作曲的歌always@(posedge clk)//分频器设计2
begin
if(count2〈=12499999)
begin
count2〈=count2+1;
clk_4hz〈=0;
end
else
begin
count2<=0;
clk_4hz〈=1;
end
end
assign carry=(divider==2047);
always@(posedge clk_1mhz)
begin if(carry) divider=origin;
else divider=divider+1;
end
always@(posedge carry)
begin
speaker=~speaker;//2分频产生方波信号
end
always@(posedge clk_4hz)
begin
case({high,med,low})//分频比预置
过新年儿歌
'b000000000000:origin=2047;
’b000000000001:origin=135;
’b000000000010:origin=343;
'b000000000011:origin=530;
'b000000000100:origin=614;
'b000000000101:origin=771;
’b000000000110:origin=911;
’b000000000111:origin=1045;
'b000000010000:origin=1091;
’b000000100000:origin=1195;
’b000000110000:origin=1288;
’b000001000000:origin=1331;
’b000001010000:origin=1409;
'b000001100000:origin=1479;
’b000001110000:origin=1546;
’b000100000000:origin=1569;
’b001000000000:origin=1621;
’b001100000000:origin=1668;
b010*********:origin=1689;
b010*********:origin=1728;
'b011000000000:origin=1763;
’b011100000000:origin=1797;
endcase
end
always @(posedge clk_4hz)
begin
if(counter==214) counter〈=0; //计时,以实现循环演奏
else counter〈=counter+1;
case(counter) //记谱
0: {high,med,low}〈='b000000000000;//休止符
1: {high,med,low}〈='b000000000000;
2: {high,med,low}<='b000001110000;//中音7
3: {high,med,low}〈=’b000001110000;
4: {high,med,low}〈=’b000001100000;//中音6
5: {high,med,low}〈='b000001100000;
6: {high,med,low}<='b000001110000;//中音7
7: {high,med,low}〈=’b000001110000;
8: {high,med,low}<=’b000001010000;//中音5,持续3个时钟节拍
9 : {high,med,low}〈=’b000001010000;
10: {high,med,low}〈=’b000001010000;
11: {high,med,low}<=’b000001100000;//中音6
12: {high,med,low}〈=’b000001000000;//中音4
13: {high,med,low}<=’b000001000000;
14: {high,med,low}<='b000000110000;//中音3
15: {high,med,low}〈=’b000000110000;
16: {high,med,low}〈=’b000000100000;//中音2
17: {high,med,low}〈=’b000000110000;//中音3
18: {high,med,low}<=’b000001000000;//中音4
19: {high,med,low}〈='b000000110000;//中音3
20: {high,med,low}<=’b000001010000;//中音5
21: {high,med,low}<=’b000001010000;
22: {high,med,low}〈='b000001010000;
23: {high,med,low}〈=’b000000110000;//中音3
24: {high,med,low}〈='b000000100000;
25: {high,med,low}〈=’b000000110000;
26: {high,med,low}〈=’b000001010000;
27: {high,med,low}<='b000000100000;
发布评论