当前位置:网站首页>FPGA按键消抖+蜂鸣器
FPGA按键消抖+蜂鸣器
2022-08-03 23:34:00 【三个刺客】
一:按键消抖
解决方法一:

缺点:抖动时间不确定,采集信号不一定稳定
解决方法二:

Verilog HDL编写
key_debounce.v
module key_debounce(
input wire clk,
input wire rst_n,
input wire key,
output reg flag, //判断抖动是否消除的标志信号,0为抖动,1为抖动结束
output reg key_value //消抖后稳定的按键值给到蜂鸣器模块
);
//定义20ms延迟计数器,0.2s,1_000_000次
reg [19:0] delay_cnt;
//寄存依次key的值用来判断按键是否消抖成功
reg key_reg;
//20ms延时计数器
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n)
begin
key_reg <= 1'b1; //复位信号,设置按键无效
delay_cnt <= 1'b0; //计数器设置为0
end
else
begin
key_reg <= key;
if(key_reg ^ key) //当这一次key值和上一次key值不一样,证明正在抖动
delay_cnt <= 20'd1_000_000; //延迟时间20ms
else if(delay_cnt > 0)
delay_cnt <= delay_cnt - 1; //没有抖动,开始20ms倒计时
else
delay_cnt <= 1'b0;
end
end
//根据延时计数器获取按键状态以及按键值
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n)
begin
flag <= 1'b0; //复位信号,设置信号标志为抖动
key_value <= 1'b1; //设置抽样值为1
end
else
begin
if(delay_cnt == 20'd1) //倒计时1_000_000到1
begin
flag <= 1'b1;
key_value <= key; //稳定20ms后将key值给到key_value
end
else
begin
flag <= 1'b0;
key_value <= key_value; //20ms内先不取样
end
end
end
endmodule
说明:
当上一次的key值和这次的值不一样时,证明正在抖动,给计时器赋一个20ms的值,也就是1_000_000次,这个根据时钟频率得出。当key值稳定后,开始倒计时减一,当计时器减到1时,将key值输出。
二:按键消抖+蜂鸣器
beep.v
module beep(
input clk,
input rst_n,
input key_value,
input flag,
output reg beep
);
//蜂鸣器控制模块
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n)
beep <= 1'b0;
else if(flag == 1'b1 && (!key_value))
beep <= ~beep;
else
beep <= beep;
end
endmodule
这里的蜂鸣器和按键消抖分别在两个文件里面,需要设计顶层文件调用者两个模块
key_beep_top.v
module key_beep_top(
input wire clk,
input wire rst_n,
input wire key,
output wire beep
);
wire key_value;
wire flag;
//例化按键消抖模块
key_debounce inst_key_debounce(
.clk (clk ),
.rst_n (rst_n ),
.key (key ),
.flag (flag ),
.key_value (key_value)
);
//例化蜂鸣器模块
beep inst_beep(
.clk (clk ),
.rst_n (rst_n ),
.key_value (key_value),
.flag (flag ),
.beep (beep )
);
endmodule
查看RTL级门级电路:

边栏推荐
猜你喜欢

BMN: Boundary-Matching Network for Temporal Action Proposal Generation阅读笔记

【OpenCV图像处理】 图像拼接技术

3D Semantic Segmentation - 2DPASS

HCIP BGP lab report

The "interaction design" battle of the smart cockpit

最小化安装debian11

Click the icon in Canvas App to generate PDF and save it to Dataverse

初始 List 接口

Deep integration of OPC UA and IEC61499 (1)

用两个栈模拟队列
随机推荐
全球首款量产,获定点最多!这家AVP Tier1如何实现领跑?
CAS:178744-28-0,mPEG-DSPE,DSPE-mPEG,甲氧基-聚乙二醇-磷脂酰乙醇胺供应
BMN: Boundary-Matching Network for Temporal Action Proposal Generation Reading Notes
override learning (parent and child)
Zilliz 2023 Fall Campus Recruitment Officially Launched!
代码随想录笔记_动态规划_416分割等和子集
禾匠编译错误记录
[RYU] rest_router.py source code analysis
3D 语义分割——2DPASS
软测人每个阶段的薪资待遇,快来康康你能拿多少?
SRE运维解密-什么是SRE:DevOps模型的具体实践!
The longest substring that cannot have repeating characters in a leetcode/substring
SPOJ 2774 Longest Common Substring(两串求公共子串 SAM)
简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的
[2022强网杯] polydiv和gamemaster
3D Semantic Segmentation - 2DPASS
Creo 9.0创建几何点
rsync basic usage
JS get parameter value of URL hyperlink
Unity 截取3D图像 与 画中画PIP的实现