微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助FPGA按键消抖的输出问题

求助FPGA按键消抖的输出问题

时间:10-02 整理:3721RD 点击:

请教一下大家,能不能告诉我一下,当有按键按下时,只会在按键按下的一瞬间闪一下?非常感谢
module my_button(module my_button(                clk,rst_n,
                but1,
                led1
                );
input clk;
input rst_n;
input but1;
output led1;
reg but1_r;
reg but1_r_n;
reg[19:0] cout_r;
reg ker;
reg ker_n;
reg d1;
wire but1_r_o;
wire ker_i;
wire ker_o;
/*******************************/
//检测按键输入端口的下降沿
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                but1_r <= 1'b1;
        else
                but1_r <= but1;
end
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                but1_r_n <= 1'b1;
        else
                but1_r_n <= but1_r;
end
assign but1_r_o = but1_r_n & ( ~but1_r );
/*******************************/
/*******************************/
//按键消抖,输出消抖以后的波形,本段最后一行为测试输出
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                cout_r <= 20'h0;
        else if(but1_r_o)
                cout_r <= 20'h0;
        else
                cout_r <= cout_r + 1'b1;
end
assign ker_i = (cout_r == 20'hfffff) ? 1'b1 : 1'b0;
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                ker <= 1'b1;
        else if(ker_i)
                ker <= but1;
end

//assign led1 = ker;
/*******************************/
/*******************************/
//检测消抖后信号的下降沿
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                ker_n <= 1'b1;
        else if(ker_i)
                ker_n <= ker;
end
//assign led1 = ker_n;
/*******************************/
/*******************************/
//控制信号灯的亮与不亮,当检测到下降沿时,灯得状态取反
assign ker_o = ker_n & (~ker);
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                d1 <= 1'b1;
        else if(ker_o)
        begin
                #1;
                d1 <= ~d1;
        end
end
assign led1 = d1;
/*******************************/
endmodule

为什么不能一直输出亮

自己仿真就能看出来。
你的代码一堆的问题。
”assign but1_r_o = but1_r_n & ( ~but1_r );“这个检测的是上升沿吧;
//按键消抖,输出消抖以后的波形,本段最后一行为测试输出
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                cout_r <= 20'h0;
        else if(but1_r_o)
                cout_r <= 20'h0;
        else
                cout_r <= cout_r + 1'b1;
end
assign ker_i = (cout_r == 20'hfffff) ? 1'b1 : 1'b0;
always @ (posedge clk or negedge rst_n)
begin
        if(!rst_n)
                ker <= 1'b1;
        else if(ker_i)
                ker <= but1;
end

//assign led1 = ker;
没看出来是干啥用的,
cout的控制应该是有问题的。是不是按键无效时应该计数到某个值后停下来?


如果输入为
but1_r:   1110011
~but1_r: 0001100
but1_r_o:   1110011
相与:       0001000
检测的是下降沿啊。
我的设计思想是:让端口一直采样,每20ms锁存一次,当采到下降沿时重新从零计数,当道20ms时再采一次,若为低则采取动作。



   关于仿真的问题,我是一个菜鸟,刚学FPGA,就仿真过一个例子,自己写的代码不知道该怎么仿真,这个按键消抖的程序我没有仿真,就加入了几个测试点,测试了一下有输出,比如最后一段前面有个测试点,在开发板上是有结果的。按下一个键等到释放的时候灯才会灭,但是最后一段的输出不知道为什么有问题。

assign ker_i = (cout_r == 20'hfffff) ? 1'b1 : 1'b0;
下一个clk ker_i就该为0了吧



   ker_i是在cout_r计数到1024x1024以后,即计满100万次以后保持一个时钟周期的高电平,作为下一步锁存信号的控制。就在cout_r==20'hfffff的时候为1,其他时间都为0的。请问一下我最后一段的输出有什么问题没有啊?为什么只是会闪一下,既然闪了一下说明还是检测到有下降沿的啊!可是为什么不能一直保持呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top