设计题目:“梁祝乐曲发生器”
一、        设计任务及要求:
利用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
 
音符与频率的对应关系如下
the weepies
音名
频率(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
440
中音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;