康尔洋 发表于 2015-11-5 21:30:13

矩阵键盘制作电子钢琴

        特别羡慕小墨同学的FPGA学习打卡日记,自己也在学习FPGA,但是我的文笔有限,水平也不高,没有人帮助,全靠至芯的网上认识的两位老师提点,都是自己学习的一些成果。
研究了一周的矩阵键盘,还是和单片机的矩阵键盘原理有很大的差别,但是总算是搞定了,心情很好。附上代码,供大家参考和指正。写于接触FPGA一个月左右时。

static/image/hrline/line3.png

module beep_p(
        input wire clk,
        input wire rst_n,
        input wire hang,   
        output wire lie,   
        output reg bee      
);
reg shijian ;   
reg jishu;      
reg bianhua;
reg lie1;

always @(posedge clk or negedge rst_n)
        if(rst_n==0)
                lie1=4'b0111;
        else if(hang==4'b0111|hang==4'b1011|hang==4'b1101|hang==4'b1110)
                lie1<=lie1;
        else
                lie1={lie1,lie1};

assign lie=lie1;

always @(posedge clk or negedge rst_n)
                case({lie,hang})
                                8'b0111_0111:shijian<=18'd191131;
                                8'b1011_0111:shijian<=18'd170241;
                                8'b1101_0111:shijian<=18'd151699;
                                8'b1110_0111:shijian<=18'd143184;
                                8'b0111_1011:shijian<=18'd127551;
                                8'b1011_1011:shijian<=18'd113636;
                                8'b1101_1011:shijian<=18'd101235;
                               
                                8'b1110_1011:shijian<=18'd95547;
                                8'b0111_1101:shijian<=18'd85135;
                                8'b1011_1101:shijian<=18'd75838;
                                8'b1101_1101:shijian<=18'd71581;
                                8'b1110_1101:shijian<=18'd63776;
                                8'b0111_1110:shijian<=18'd56818;
                                8'b1011_1110:shijian<=18'd50618;
                               
                                8'b1101_1110:shijian<=18'd47778;
                                8'b1110_1110:shijian<=18'd42564;
                                default:shijian<='b0;
                endcase
               
always @(posedge clk or negedge rst_n)
        if(rst_n==0)
                jishu<=0;
        else if(jishu==shijian)
                jishu<=0;
        else
                jishu=jishu+1;
               
always @(posedge clk or negedge rst_n)
        if(rst_n==0)
                bianhua<=0;
        else if(jishu<(shijian)/2)
                bianhua<=1;
        else if(jishu>(shijian)/2)
                bianhua<=0;
        else
                bianhua<=bianhua;
               
always @(posedge clk or negedge rst_n)
        if(rst_n==0)
                bee<=0;
        else if(bianhua==0)
                bee<=0;
        else
                bee<=1;
               
endmodule
       

                               
页: [1]
查看完整版本: 矩阵键盘制作电子钢琴