唉,忙于数电实验,好久没写代码了QAQ,最近什么都没写,就只能把数电作业拉上来凑个数了QWQ~
首先来个整体吧
这个就是整个项目的top了,再之后就是分开来各个模块啦
锁相环分频
这个pll就是用来分频的,自己这的FPGA板子是Cyclone IV的自带的是20MHz的时钟信号,然后蜂鸣器需要1MHz,音乐需要4KHz,VGA显示器640 * 480 * 60Hz需要25MHz,就分别分频咯~
音乐模块
这个就是音乐模块啦,主要是分为记录音符数的constep,记录音符的Rom,音符转换为蜂鸣器频率的INX2CODE还有发声的SPK0
constep就是单纯的计数器啦,记到mif所储存的音符数量。
ROM的话需要去把简谱变成mif文件然后用ROM模块生成出器件。
INX2CODE
module INX2CODE (INX, F_CODE);
input[3:0] INX;
output[10:0] F_CODE;
reg[10:0] F_CODE;
always @(INX)
case (INX)
0 : F_CODE <= 11'H7FF;
1 : F_CODE <= 11'H305;
2 : F_CODE <= 11'H390;
3 : F_CODE <= 11'H40C;
4 : F_CODE <= 11'H45C;
5 : F_CODE <= 11'H4AD;
6 : F_CODE <= 11'H50A;
7 : F_CODE <= 11'H55C;
8 : F_CODE <= 11'H582;
9 : F_CODE <= 11'H5C8;
10 : F_CODE <= 11'H606;
11 : F_CODE <= 11'H640;
12 : F_CODE <= 11'H656;
13 : F_CODE <= 11'H684;
14 : F_CODE <= 11'H69A;
15 : F_CODE <= 11'H6C0;
default : F_CODE <= 11'H6C0;
endcase
endmodule
SPK0
VGA驱动
图片可以先jpg(或其他格式)转成bmp格式,然后再转成mif(怎么实现我不管,自己百度/Google),然后像存音符一样存到ROM里生成一个器件。
vga_driver
module vga_driver(
clk,
hs,vs,
r,g,b,
rgbin,dout
);
input clk;
output hs,vs;
output r,g,b;
input rgbin;
output[15:0] dout;
reg[9:0] hcnt,vcnt;
reg r,g,b;
reg hs,vs;
assign dout={vcnt[7:0],hcnt[7:0]};
always @(posedge clk)
if(hcnt<800)
hcnt<=hcnt+1;
else
hcnt<={10{1'b0}};
always @(posedge clk)
if(hcnt==640+8)
if(vcnt<525)
vcnt<=vcnt+1;
else
vcnt<={10{1'b0}};
always @(posedge clk)
if((hcnt>=640+8+8)&(hcnt<640+8+8+96))
hs<=1'b0;
else
hs<=1'b1;
always @(vcnt)
if((vcnt>=480+8+2)&(vcnt<480+8+2+2))
vs<=1'b0;
else
vs<=1'b1;
always @(posedge clk)
if(hcnt<256&vcnt<256)
begin
r=rgbin;
g=rgbin;
b=rgbin;
end
else
begin
r=0;
g=0;
b=0;
end
endmodule
选择器模块
module choose2_1(
EN,
badapple,sakura,
HS1,VS1,HS2,VS2,
SPK1,SPK2,
R1,R2,G1,G2,B1,B2,
SPK,R,G,B,HS,VS
);
input EN,badapple,sakura;
input HS1,VS1,HS2,VS2;
input SPK1,SPK2;
input R1,R2,B1,B2;
input G1,G2;
output SPK;
output HS,VS;
output R,B;
output G;
reg SPK;
reg HS,VS;
reg R,B;
reg G;
always @ (
EN,
badapple,sakura,
HS1,VS1,HS2,VS2,
SPK1,SPK2,
R1,R2,G1,G2,B1,B2
)
if(EN==1)
begin
SPK=1;
R=0;
G=0;
B=0;
VS=0;
HS=0;
end
else
if({sakura,badapple}==2'B10)
begin
SPK=SPK1;
R=R1;
G=G1;
B=B1;
VS=VS1;
HS=HS1;
end
else
if({sakura,badapple}==2'B01)
begin
SPK=SPK2;
R=R2;
G=G2;
B=B2;
VS=VS2;
HS=HS2;
end
else
begin
SPK=1;
R=0;
G=0;
B=0;
VS=0;
HS=0;
end
endmodule
我没有VGA接口的显示器就只能到别人寝室玩啦~
具体源码在Github上啦,想玩的可以去看看啦~
因为一些音符有瑕疵就不放出了
好帅!!!
诶嘿嘿~