按键消抖求帮忙
clk,rst_n,key1,
led
);
input clk;
input rst_n;
input key1;
output[3:0] led;
//------------------------键盘消抖程序---------------------------------------------------
reg reg0_key;
reg reg1_key;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
reg0_key <= 1'b1;
reg1_key <= 1'b1;
end
else begin
reg0_key <= key1;
reg1_key <= reg0_key; //根据非阻塞赋值的原理,reg1_key存储的值是reg0_key上一个时钟的值
end
end
//当寄存器key1由1变为0时,led_an的值变为高,维持一个时钟周期
wire key_an;
assign key_an = reg1_key & ( ~reg0_key);
//---------------------------------------------------------------------------
reg[19:0] cnt_key; //计数寄存器
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt_key <= 20'd0; //异步复位
else if(key_an)
cnt_key <=20'd0;
else
cnt_key <= cnt_key + 1'b1;
end
reg reg_low;
reg reg1_low;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
reg_low <= 1'b1;
end
else if(cnt_key == 20'hfffff)
begin
reg_low <= key1; //cnt == 20'hfffff,20ms
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
reg1_low <= 1'b1;
else
reg1_low <= reg_low;
end
//---------------------------------------------------------------------------
//当寄存器reg_low由1变为0时,key_low的值变为高,维持一个时钟周期
wire key_low = reg1_low & ( ~reg_low);
//===============LED控制==================================
reg[21:0] cnt; //
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 22'b0;
else
cnt <= cnt + 1'b1;
end
reg enable_r;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
enable_r <= 1'b0;
else
if (cnt == 22'h3fffff) enable_r <= 1'b1;
else
enable_r <= 1'b0;
end
wire enable;
assign enable = enable_r;
reg[3:0] led_r;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
led_r <= 4'b0111;
else if(key_low)
led_r <= 4'b0;
else if(enable & !key_low)
led_r <= {led_r[0],led_r[3:1]};
else ;
end
wire[3:0] led;
assign led = led_r;
endmodule这个程序为什么没起到按键消抖地作用
谁能帮忙看一下谢啦
lz可以说说你说的没有起到按键消抖地作用是什么意思吗?我认为按键消抖的程序没有什么问题啊。
//------------------------键盘消抖程序---------------------------------------------------
reg reg0_key;
reg reg1_key;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
reg0_key <= 1'b1;
reg1_key <= 1'b1;
end
else begin
reg0_key <= key1;
reg1_key <= reg0_key; //根据非阻塞赋值的原理,reg1_key存储的值是reg0_key上一个时钟的值
end
end
//当寄存器key1由1变为0时,led_an的值变为高,维持一个时钟周期
wire key_an;
assign key_an = reg1_key & ( ~reg0_key);
//---------------------------------------------------------------------------
reg[19:0] cnt_key; //计数寄存器
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt_key <= 20'd0; //异步复位
else if(key_an)
cnt_key <=20'd0;
else
cnt_key <= cnt_key + 1'b1;
end
reg reg_low;
reg reg1_low;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
reg_low <= 1'b1;
end
else if(cnt_key == 20'hfffff)
begin
reg_low <= key1; //cnt == 20'hfffff,20ms
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
reg1_low <= 1'b1;
else
reg1_low <= reg_low;
end
//---------------------------------------------------------------------------
//当寄存器reg_low由1变为0时,key_low的值变为高,维持一个时钟周期
wire key_low = reg1_low & ( ~reg_low);
这段程序应该能够实现你的这个结论的————即在按键下降延到来的20ms后key_low会产生一个持续时间为一个时钟周期的高电平脉冲,并且就散你一直按着按键也不会再产生新的脉冲啦。所以你这个按键消抖程序应该没有什么问题啊
可是结果应该是按了KEY后会出现都亮或者灭的现象,我想问的是为什么没出现呢?
如果你不按按键,就让程序跑,出现的是什么现象啊?是不是出现流水灯的效果啊
是啊,为什么按键后不会变,是key_low只有一个周期的原因吗,该怎么改呢