求助FPGA按键消抖的输出问题
请教一下大家,能不能告诉我一下,当有按键按下时,只会在按键按下的一瞬间闪一下?非常感谢
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的。请问一下我最后一段的输出有什么问题没有啊?为什么只是会闪一下,既然闪了一下说明还是检测到有下降沿的啊!可是为什么不能一直保持呢?
