1112|2

504

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

【国产FPGA安路 高集成低功耗SF1系列FPSoC新品】按键(防抖)控制蜂鸣器 [复制链接]

 

f76815854f61ed93c66bafef68f7a190

 

前言

   前面测试了LED,和按键,这一篇结合按键测试蜂鸣器,并实现按键防抖。

过程

新建工程

参考https://bbs.eeworld.com.cn/thread-1234259-1-1.html

新建工程beep

 

创建key.v实现按键识别支持防抖。

创建beep.v实现蜂鸣器控制。

创建顶层文件top.v实例化上述模块实现按键控制蜂鸣器。

beep.v

`define PERIOD 32'd25000
`define DUTY 32'd12500

module beep(
      //input
      input        sys_clk,     
      input        sys_rst_n,  
      
      input        key_flag,   
      input        key_value,    
      output       beepout        
  );
  
//reg define
reg  [31:0]  period_cnt ;   
reg  [31:0]  duty_cycle ;  
reg          onoff;

//*****************************************************
//**                    main code
//*****************************************************

assign   beepout = (period_cnt >= duty_cycle && onoff) ?  1'b1  :  1'b0;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        period_cnt <= 32'd0;
        duty_cycle <= `DUTY;
    end
    else if(period_cnt == `PERIOD)
        period_cnt <= 32'd0;
    else
        period_cnt <= period_cnt + 1'b1;
end

always @ (posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        onoff <= 1'b0;
    end
    else begin
        if(key_flag && (~key_value))  begin
            onoff <= ~onoff;   
            //if(onoff) 
                //beepout <= (period_cnt >= duty_cycle) ?  1'b1  :  1'b0;
            //else 
            //    beepout <= 1'b0;
        end
    end       
end
    

    
endmodule 

key.v

module key(
    input            sys_clk,         
    input            sys_rst_n,       
    
    input            key,             
    output reg       key_flag,         
    output reg       key_value         
    );

//reg define    
reg [31:0] delay_cnt;
reg        key_reg0;
reg        key_reg1;

//*****************************************************
//**                    main code
//*****************************************************
always @(posedge sys_clk or negedge sys_rst_n) begin 
    if (!sys_rst_n) begin 
        key_reg0   <= 1'b1;
        key_reg1   <= 1'b1;
        delay_cnt <= 32'd0;
    end
    else begin
        key_reg0 <= key;                   
        key_reg1 <= key_reg0;               
        if(key_reg1 != key_reg0)             
            delay_cnt <= 32'd500000;        
        else if(key_reg1 == key_reg0) begin 
                 if(delay_cnt > 32'd0)
                     delay_cnt <= delay_cnt - 1'b1;
                 else
                     delay_cnt <= delay_cnt;
             end           
    end   
end

always @(posedge sys_clk or negedge sys_rst_n) begin 
    if (!sys_rst_n) begin 
        key_flag  <= 1'b0;
        key_value <= 1'b1;          
    end
    else begin
        if(delay_cnt == 32'd1) begin   
            key_flag  <= 1'b1;         
            key_value <= key_reg1;         
        end
        else begin
            key_flag  <= 1'b0;
            key_value <= key_value; 
        end  
    end   
end
    
endmodule 

beep_key_top.v

module beep_key_top(
      input        sys_clk,     
      input        sys_rst_n,    
      
      input        key,          
      output       beep         
      );
      
//wire define
wire key_value;
wire key_flag;

//*****************************************************
//**                    main code
//*****************************************************

key u_key(
    .sys_clk        (sys_clk),
    .sys_rst_n      (sys_rst_n),
    
    .key            (key),
    .key_flag       (key_flag),
    .key_value      (key_value)
    );
  

beep u_beep(
    .sys_clk        (sys_clk), 
    .sys_rst_n      (sys_rst_n),
    
    .key_flag       (key_flag),      
    .key_value      (key_value),
    .beepout           (beep)
    );
    
endmodule 

 

自动选择的顶层文件可能不对手动设置

top.v上右键选择Set As Top

 

约束

从原理图可以看到

 

25M时钟输入对应D7

 

 

 

没有专门的复位按键就使用KEY0  H3

 

 

 

原理图中KEY1和KEY2对应H2 G3对应代码中的KEY0和KEY1

 

蜂鸣器对应B10

 

 

 

 

约束如下

 

运行测试

按键KEY0复位

按键KEY1 蜂鸣器响,再按蜂鸣器停止响。

 

总结

以上实现了按键控制蜂鸣器,主要是按键防抖的思想。

 

最新回复

按键防抖是按键都需要有,楼主的防抖代码有什么特点   详情 回复 发表于 2023-3-5 22:09
点赞 关注
 
 

回复
举报

1703

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

按键防抖是按键都需要有,楼主的防抖代码有什么特点

点评

没什么特别的一般做法  详情 回复 发表于 2023-3-6 09:37
 
 
 

回复

504

帖子

4

TA的资源

纯净的硅(高级)

板凳
 
火辣西米秀 发表于 2023-3-5 22:09 按键防抖是按键都需要有,楼主的防抖代码有什么特点

没什么特别的一般做法

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表