FPGA之按键控制蜂鸣器

一、蜂鸣器(BEEP)

       蜂鸣器的鸣叫需要一个震荡源,蜂鸣器分为有源(有震荡源)蜂鸣器和无源(无震荡源)蜂鸣器。

       有源蜂鸣器:内部带震荡源,只要一通电就会叫;

       无源蜂鸣器:内部不带震荡源,如果用直流信号无法令其鸣叫,则必须用2K-5K的方波去驱动它。

二、按键消抖

       1、按键抖动:抖动时间的长短由按键的机械特性决定,一般为5ms~10ms;在按键抖动后,按键才会趋于稳定状态。按下按键和释放按键时,都有一个5ms~10ms的抖动过程。

        2、按键消抖目的:防止按键在闭合及断开的瞬间均伴随有一连串的抖动。

              按键消抖方法:在按键按下和释放时采用延时采样(一般延时20ms)           

 三、程序设计

         按键——按键消抖——蜂鸣器控制——蜂鸣器

        实现功能:使用按键控制蜂鸣器发声,初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫。

四、代码实现

 如图:

  1、按键消抖模块

module key_debounce(
       input      clk,
       input      rst_n,
       
       input      key,
       output reg key_value,
       output reg key_flag
);


reg key_reg;
reg [19:0] delay_cnt;

always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
          key_reg <= 1'b1;
          delay_cnt <= 20'd0;
     end
     else begin
          key_reg <= key;
          if(key != key_reg)
              delay_cnt <= 20'd1000_000;
              else begin
                if(delay_cnt > 20'd0)
                  delay_cnt <= delay_cnt - 1'b1;
                  else
                  delay_cnt <= 20'd0;
            end
     end
end

always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
         key_value <= 1'b1;
         key_flag <= 1'b0;
     end
     else begin
          if(delay_cnt == 20'd1) begin
              key_flag <= 1'b1;
              key_value <= key;
            end
           else begin
             key_flag <= 1'b0;
             key_value <= key_value;
           end
     end
end

endmodule

  2、按键控制模块

module beep_control(
       input      clk,
       input      rst_n,
       
       input     key_flag,
       input     key_value,
       output reg beep
);

always @ (posedge clk or negedge rst_n) begin
       if(!rst_n)
         beep <= 1'b1;
         else 
            if(key_flag & (~key_value))
               beep <= ~beep;
            else
                 beep <= beep;
end

endmodule

  3、顶层文件设计模块

module top_key_beep(
       input      clk,
       input      rst_n,
       input      key,
       output     beep
);

wire key_value;
wire key_flag;

key_debounce u_key_debounc(
       .clk       (clk),
       .rst_n      (rst_n),
       
       .key        (key),
       .key_value   (key_value),
       .key_flag    (key_flag)
);
beep_control u_beep_control(
       .clk        (clk),
       .rst_n       (rst_n),
       
       .key_flag    (key_flag),
       .key_value   (key_value),
       .beep         (beep)
);


endmodule

五、演示效果

FPGA学习笔记之按键控制蜂鸣器

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值