当前位置:网站首页>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级门级电路:
边栏推荐
猜你喜欢
数据分析知识点搜集(纯粹的搜集)
用两个栈模拟队列
禾匠编译错误记录
AOSP CameraLatencyHistogram的原理与使用
走迷宫 BFS
Scala basics [regular expressions, framework development principles]
Creo9.0 绘制中心线
The Chinese Valentine's Day event is romantically launched, don't let the Internet slow down and miss the dark time
V8中的快慢数组(附源码、图文更易理解)
The super perfect layout has shortcut keys and background replacement
随机推荐
Prometheus监控Harbor(二进制版)
libnet
Click the icon in Canvas App to generate PDF and save it to Dataverse
redis持久化方式
射频芯片ATE测试从入门到放弃之参数测试
HNUCM 您好中国
In V8 how arrays (with source code, picture and text easier to understand)
单例模式使用饿汉式和懒汉式创建一定安全?很多人不知
Use tf.image.resize() and tf.image.resize_with_pad() to resize images
3D 语义分割——2DPASS
【LeetCode】最长公共子序列(动态规划)
BPF 可移植性和 CO-RE(一次编译,到处运行)
软件测试内卷严重,如何提升自己的竞争力呢?
P1996 约瑟夫问题
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
rosbridge-WSL2 && carla-win11
ML之yellowbrick:基于titanic泰坦尼克是否获救二分类预测数据集利用yellowbrick对LoR逻辑回归模型实现可解释性(阈值图)案例
Why Flutter Flutter of tutorials is the best choice for business?
log4j-slf4j-impl cannot be present with log4j-to-slf4j
Create function report error, prompting DECLARE definition syntax problem