编曲部分
clk_out是周期为0.5s的时钟信号
M是使能段,当M为1时演奏歌曲
m表示不同音调,1-7对应中音do、ri、mi、fa、so、la、xi ,8-14对应高音 ,14-21对应低音
state表示状态,一共157个状态,每个状态为0.5s,全歌时长78.5s
module state(
input clk_out, //周期0.5s的时钟信号
input M,
output reg [4:0] m=0,
output reg [7:0] state=0
);
always@(posedge clk_out)
if(~M|state>=157)
state=0;
else
state=state+1;
always@(M,state) //国际歌乐谱
if(M)
begin
case(state)
0: m=5;
1: m=8;
2: m=7;
3: m=9;
4: m=8;
5: m=5;
6: m=3;
7: m=6;
8: m=6;
9: m=4;
10: m=0;
11: m=6;
12: m=9;
13: m=8;
14: m=7;
15: m=6;
16: m=5;
17: m=4;
18: m=3;
19: m=3;
20: m=3;
21: m=5;
22: m=8;
23: m=7;
24: m=9;
25: m=8;
26: m=5;
27: m=3;
28: m=6;
29: m=6;
30: m=4;
31: m=6;
32: m=9;
33: m=8;
34: m=7;
35: m=8;
36: m=11;
37: m=7;
38: m=8;
39: m=8;
40: m=8;
41: m=0;
42: m=10;
43: m=9;
44: m=7;
45: m=7;
46: m=6;
47: m=7;
48: m=8;
49: m=6;
50: m=7;
51: m=7;
52: m=5;
53: m=5;
54: m=4;
55: m=5;
56: m=6;
57: m=6;
58: m=9;
59: m=8;
50: m=7;
51: m=7;
52: m=5;
53: m=6;
54: m=4;
55: m=5;
56: m=6;
57: m=6;
58: m=9;
59: m=8;
60: m=7;
61: m=7;
62: m=7;
63: m=0;
64: m=9;
65: m=9;
66: m=7;
67: m=5;
68: m=5;
69: m=4;
70: m=5;
71: m=10;
72: m=10;
73: m=8;
74: m=6;
75: m=7;
76: m=8;
77: m=7;
78: m=9;
79: m=8;
80: m=6;
81: m=5;
82: m=5;
83: m=5;
84: m=0;
85: m=10;
86: m=9;
87: m=8;
88: m=8;
89: m=5;
90: m=3;
91: m=6;
92: m=6;
93: m=4;
94: m=0;
95: m=9;
96: m=8;
97: m=7;
98: m=7;
99: m=6;
100: m=5;
101: m=5;
102: m=5;
103: m=5;
104: m=0;
105: m=5;
106: m=10;
107: m=10;
108: m=9;
109: m=5;
110: m=8; //61
111: m=8;
112: m=7;
113: m=7;
114: m=6;
115: m=5;
116: m=6;
117: m=9;
118: m=9;
119: m=9;
120: m=9;
121: m=0;
122: m=10;
123: m=9;
124: m=8;
125: m=8;
126: m=5;
127: m=3;
128: m=6;
129: m=6;
130: m=4;
131: m=0;
132: m=9;
133: m=8;
134: m=7; //71
135: m=7;
136: m=6;
137: m=5;
138: m=10;
139: m=10;
140: m=10;
141: m=10;
142: m=12;
143: m=12;
144: m=11;
145: m=10;
146: m=9;
147: m=10;
148: m=11;
149: m=0;
150: m=11;
151: m=10;
152: m=10;
153: m=9;
154: m=9;
155: m=8;
156: m=8;
157: m=8;
default: m=0;
endcase
end
else if (~M)
m=0;
endmodule
音调部分
clk是50Mhz时钟
B为无源蜂鸣器,当无源蜂鸣器输入时钟不同时,会发出不同的声音,详情可看代码部分
当输入m为不同的值时,q控制蜂鸣器时钟频率(例如m=1 、q=47773、蜂鸣器时钟频率为50M/(47773×2)=523.3HZ,发出中音do。)
module music(
input clk,
input [4:0] m,
input M,
output reg B=0
);
integer q=0;
integer p=0;
always@(posedge clk)
begin
case(m)
1:q=47773; //523.3HZ中do
2:q=42567; //587.3HZ 中ri
3:q=37919; //659.3HZ 中mi
4:q=35790; //698.5HZ 中fa
5:q=31887; //784HZ 中so
6:q=28409; //880HZ 中la
7:q=25308; //987.8HZ 中xi
8:q=23914; //1045.4HZ 高do
9:q=21282; //1174.7HZ 高ri
10:q=18960; //1318.5HZ 高mi
11:q=17904; //1396.3HZ 高fa
12:q=15943; //1568HZ 高so
13:q=14204; //1760HZ 高la
14:q=12655; //1975.5HZ 高xi
15:q=95565; //261.6HZ 低do
16:q=85120; //293.7HZ 低ri
17:q=75849; //329.6HZ 低mi
18:q=71592; //349.2HZ 低fa
19:q=63775; //392HZ 低so
20:q=56818; //440HZ 低la
21:q=50617; //493.9HZ 低xi
endcase
end
always@(posedge clk)
begin
if((p>=q)&M)
begin
p=0; B=~B;
end
else if(M)
p=p+1;
else
B=0;
end
endmodule
顶层模块
clk_0_5模块是分频器,输出周期为0.5s的时钟信号(比较简单,就不单独列出了)
state、music为乐曲、音调部分模块,上文已写
led_0是我之前写的显示ip核,可以显示当前播放进度,不影响核心功能,可以删除。
module buz(
input clk,
input M,
output B,
output [7:0] seg,
output [5:0] dig
);
wire clk_out;
wire [4:0] m;
wire [7:0] state;
clk_0_5s m1(clk,clk_out);
state m2(clk_out,M,m,state);
music m3(clk,m,M,B);
led_0 m4(clk,state/100,(state%100)/10,state%10,30,30,30,seg,dig);
endmodule
效果演示
FPGA演奏国际歌
3958



被折叠的 条评论
为什么被折叠?



