FPGA学习实现蜂鸣器音阶

蜂鸣器

框图

在这里插入图片描述

代码

module beep 
#(
    parameter CNT_MAX = 32'd24999999,
    parameter DO_MAX = 32'd190839,
    parameter RI_MAX = 32'd170067,
    parameter MI_MAX = 32'd151514,
    parameter FA_MAX = 32'd143265,
    parameter SO_MAX = 32'd127551,
    parameter LA_MAX = 32'd113636,
    parameter SI_MAX = 32'd101214,
    parameter DO_DUTY = 32'd95419,
    parameter RI_DUTY = 32'd85033,
    parameter MI_DUTY = 32'd75756,
    parameter FA_DUTY = 32'd71632,
    parameter SO_DUTY = 32'd63774,
    parameter LA_DUTY = 32'd56817,
    parameter SI_DUTY = 32'd50606
)(
    input wire clk,
    input wire rst_n,
    output reg gam
);

// parameter CNT_MAX = 32'd24999999;
// parameter DO_MAX = 32'd190839;
// parameter RI_MAX = 32'd170067;
// parameter MI_MAX = 32'd151514;
// parameter FA_MAX = 32'd143265;
// parameter SO_MAX = 32'd127551;
// parameter LA_MAX = 32'd113636;
// parameter SI_MAX = 32'd101214;
// parameter DO_DUTY = 32'd95419;
// parameter RI_DUTY = 32'd85033;
// parameter MI_DUTY = 32'd75756;
// parameter FA_DUTY = 32'd71632;
// parameter SO_DUTY = 32'd63774;
// parameter LA_DUTY = 32'd56817;
// parameter SI_DUTY = 32'd50606;


reg [31:0]cnt;
reg [2:0]cnt_500ms;
reg [31:0]fre_cnt;
reg [31:0]fre_data;
reg [31:0]duty_data;


always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        cnt <= 32'd0;
    end
    else if (cnt == CNT_MAX) begin
        cnt <= 32'd0;
    end
    else begin
        cnt <= cnt + 32'd1;
    end
end

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        cnt_500ms <= 3'd0;
    end
    else if (cnt_500ms == 3'd6 && cnt == CNT_MAX) begin
        cnt_500ms <= 3'd0;
    end
    else if (cnt == CNT_MAX) begin
        cnt_500ms <= cnt_500ms + 3'd1;
    end
    else begin
        cnt_500ms <= cnt_500ms;
    end
end

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        fre_cnt <= 32'd0;
    end
    else if (fre_cnt == fre_data || cnt == CNT_MAX) begin
        fre_cnt <= 32'd0;
    end
    else begin
        fre_cnt <= fre_cnt + 32'd1;
    end
end

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        duty_data <= 32'd0;
    end
    else case (cnt_500ms)
        0 : duty_data <= DO_DUTY; 
        1 : duty_data <= DO_DUTY;
        2 : duty_data <= MI_DUTY;
        3 : duty_data <= FA_DUTY;
        4 : duty_data <= SO_DUTY;
        5 : duty_data <= LA_DUTY;
        6 : duty_data <= SI_DUTY;
        default: duty_data <= DO_MAX; 
    endcase
end

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        fre_data <= 32'd0;
    end
    else case (cnt_500ms)
        0 : fre_data <= DO_MAX; 
        1 : fre_data <= DO_MAX;
        2 : fre_data <= MI_MAX;
        3 : fre_data <= FA_MAX;
        4 : fre_data <= SO_MAX;
        5 : fre_data <= LA_MAX;
        6 : fre_data <= SI_MAX;
        default: fre_data <= DO_MAX; 
    endcase
end

always @(posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        gam <= 1'b0;
    end
    else if (cnt == CNT_MAX) begin
        gam <= 1'b0;
    end
    else if (fre_cnt == fre_data || fre_cnt == duty_data) begin
        gam <= ~gam;
    end
    else begin
        gam <= gam;
    end
end

endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值