|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 赵侯261 于 2012-3-25 19:57 编辑
请教一下大家,能不能告诉我一下,当有按键按下时,只会在按键按下的一瞬间闪一下?非常感谢
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 |
|