VGA显示的自动播放音乐盒

唉,忙于数电实验,好久没写代码了QAQ,最近什么都没写,就只能把数电作业拉上来凑个数了QWQ~

首先来个整体吧

图片1.png
这个就是整个项目的top了,再之后就是分开来各个模块啦

锁相环分频

图片2.png
这个pll就是用来分频的,自己这的FPGA板子是Cyclone IV的自带的是20MHz的时钟信号,然后蜂鸣器需要1MHz,音乐需要4KHz,VGA显示器640 * 480 * 60Hz需要25MHz,就分别分频咯~

音乐模块

图片3.png
这个就是音乐模块啦,主要是分为记录音符数的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

Screen Shot 2018-12-30 at 1.42.37 AM.png

VGA驱动

图片4.png

图片可以先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

选择器模块

图片5.png

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

图片7.png

图片6.png

我没有VGA接口的显示器就只能到别人寝室玩啦~

具体源码在Github上啦,想玩的可以去看看啦~


因为一些音符有瑕疵就不放出了

发布者

Aslin

学习ing~

《VGA显示的自动播放音乐盒》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注