发的第一篇文章,是我仿照别人做的verilog消抖代码,有什么不足之处希望各位大佬能帮我提出来,尽管批评!也欢迎各位和我一样的初学者来和我一起讨论.
设计思路:通过按键按下代表输入高电平,当检测到有输入时,开始计时,短暂计时结束后如果发现仍有输入,则判断为有效输入,输出高电平,否则为抖动.
设计代码:
module eli_vibrat(clk,rst,key_pulse,key);
input clk,rst;
parameter N=1; //按键个数
input [N-1:0] key; //输入
output wire [N-1:0] key_pulse; //输出脉冲:输入为1输出高电平,反之低电平
reg [N-1:0] key_now; //当前时刻的输入状态
reg [N-1:0] key_now_pre; //上一时钟的输入状态
always@(posedge clk or posedge rst)
begin
if(rst) begin //高电平有效置零
key_now <= {N{1'b0}};
key_now_pre <= {N{1'b0}};
end
else begin
key_now <= key; //获得当前输入
key_now_pre <= key_now; //非阻塞赋值获得上一时钟的输入
end
end
reg [N-1:0] key_sec; //延时后的输入
wire [N-1:0] key_edge; //判断按键是否按下
assign key_edge= key_now & (~key_now_pre);
reg [33:0] cnt; //设置为34位是为了设置两秒的延时方便上板观察
always@(posedge clk or posedge rst)
begin
if(rst) cnt<=0;
else if(key_edge) cnt<=0;
else cnt<=cnt+1;
end
always@(posedge clk or posedge rst)
begin
if(rst) key_sec<={N{1'b0}};
else if (cnt==34'd20) key_sec <= key; //延时后获取当前key值
end
assign key_pulse = key_sec;
endmodule
测试代码:
module eli_vibrat_tb();
reg clk,rst;
parameter N=1;
reg [N-1:0] key;
wire [N-1:0] key_pulse;
eli_vibrat e(
.clk(clk),
.rst(rst),
.key(key),
.key_pulse(key_pulse));
always #1 clk <= ~clk;
initial begin
clk<=0;rst<=1;key<=0;
#5 rst<=0;
#5 key<=1;
#5 key<=0;
#100 key<=1;
end
endmodule
最终仿真结果如下:
标签:clk,高电平,消抖,pulse,verilog,key,rst,操作,输入 From: https://blog.csdn.net/2402_83350384/article/details/143499358