基于FPGA板的音乐盒的设计
本实验室基于Cyclone IV E:EP4CE6E22C8的FPGA板的音乐盒设计,播放的音乐是《世上只有妈妈好》,根据模块化设计的思想,我们需要先设计底层模块,大概需要计数器,4分频,任意分频器,音调译码器,分频器预置数译码器。
以下是各个子模块:
计数器:
module count(clk4,num,full);
input clk4;
output[7:0]num;output full;
reg full;
reg[7:0]num;
always@(posedge clk4)
begin
if(num==127)
begin
full=1;
num=0;
end
else
begin
num=num+1;
full=0;
end
end
endmodule
音调译码器:
module decodeA(Qin,Q2);
input [7:0]Qin;
output [4:0]Q2;
reg [4:0]Q2;
always@(Qin)
begin
case(Qin)
0:Q2=13;
1:Q2=13;
2:Q2=13;
3:Q2=13;
4:Q2=12;
5:Q2=12;
6:Q2=12;
7:Q2=12;
8:Q2=10;
9:Q2=10;
10:Q2=10;
11:Q2=10;
12:Q2=12;
13:Q2=12;
14:Q2=12;
15:Q2=12;
16:Q2=15;
17:Q2=15;
18:Q2=15;
19:Q2=15;
20:Q2=13;
21:Q2=13;
22:Q2=12;
23:Q2=12;
24:Q2=13;
25:Q2=13;
26:Q2=13;
27:Q2=13;
28:Q2=10;
29:Q2=10;
30:Q2=10;
31:Q2=10;
32:Q2=12;
33:Q2=12;
34:Q2=13;
35:Q2=13;
36:Q2=12;
37:Q2=12;
38:Q2=12;
39:Q2=12;
40:Q2=10;
41:Q2=10;
42:Q2=9;
43:Q2=9;
44:Q2=8;
45:Q2=8;
46:Q2=6;
47:Q2=6;
48:Q2=12;
49:Q2=12;
50:Q2=10;
51:Q2=10;
52:Q2=9;
53:Q2=9;
54:Q2=9;
55:Q2=9;
56:Q2=9;
57:Q2=9;
58:Q2=9;
59:Q2=9;
60:Q2=10;
61:Q2=10;
62:Q2=10;
63:Q2=10;
64:Q2=12;
65:Q2=12;
66:Q2=12;
67:Q2=12;
68:Q2=12;
69:Q2=12;
70:Q2=13;
71:Q2=13;
72:Q2=10;
73:Q2=10;
74:Q2=10;
75:Q2=10;
76:Q2=9;
77:Q2=9;
78:Q2=9;
79:Q2=9;
80:Q2=8;
81:Q2=8;
82:Q2=8;
83:Q2=8;
84:Q2=12;
85:Q2=12;
86:Q2=12;
87:Q2=12;
88:Q2=10;
89:Q2=10;
90:Q2=10;
91:Q2=10;
92:Q2=9;
93:Q2=9;
94:Q2=8;
95:Q2=8;
96:Q2=6;
97:Q2=6;
98:Q2=8;
99:Q2=8;
100:Q2=5;
101:Q2=5;
102:Q2=5;
103:Q2=5;
default:Q2=0;
endcase
end
endmodule
4分频:module div4(clk1,clkout4);
input clk1;
output clkout4;
reg clkout4;
reg [31:0]q1;
always @(posedge clk1)
begin
if (q1==6249999)
begin q1=0;
clkout4=!clkout4;
end
else
q1=q1+1;
end
endmodule
预置数译码器:module dcodec(din,origin);
input [4:0]din;
output [31:0]origin;
reg [31:0]origin;
always@(din)
begin
case(din)
0:origin=50000000;
1:origin=95749;
2:origin=85266;
3:origin=75965;
4:origin=71695;
5:origin=63857;
6:origin=56883;
7:origin=50669;
8:origin=47819;
9:origin=42604;
10:origin=37948;
11:origin=35817;
12:origin=31908;
13:origin=28425;
14:origin=25332;
15:origin=23901;
16:origin=21291;
17:origin=18962;
18:origin=17903;
19:origin=15949;
20:origin=14209;
21:origin=12658;
default :origin=50000000;
endcase
end
endmodule
任意分频器:module divb(clk2,clkoutb,origin);
input clk2;
input[31:0]origin;
output clkoutb;
reg clkoutb;
reg [31:0]q2;
always @(posedge clk2)
begin
if (q2==origin)
begin q2=0;
clkoutb=!clkoutb;
end
else
q2<=q2+1;
end
endmodule
顶层模块:module song(clk,speaker);
input clk;
output speaker;
wire A1,A2,A3;
wire[7:0]B1;
wire[4:0]B2;
wire[31:0]C3;
reg speaker;
div4 u1(.clk1(clk),.clkout4(A1));
count u2(.clk4(A1),.num(B1),.full(A2));
decodeA u3(.Qin(B1),.Q2(B2));
dcodec u4(.din(B2),.origin(C3));
divb u5(.clk2(clk),.clkoutb(A3),.origin(C3));
always@(posedge A3)
begin
speaker=!speaker;
end
endmodule