按键消抖控制LED灯亮灭
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
结果应该是按了KEY后会出现都亮或者灭的现象,我想问的是为什么没出现呢?按键消抖程序应该没问
题啊
能不能说明下。你主要想实现什么功能。
当按下按键开关LEY后LED灯全亮,按rst_n后复位则为流水灯。(低电平LED灯亮)
你这里的按下按键是指按住不放还是按一下就松开?
你自己代码都写了“key_low的值变为高,维持一个时钟周期” 当然灯全亮就一个周期啊 然后就又走马灯了 一个周期全亮你能看出来?
这有区别吗,这两种分别应该是什么啊?我都试了,不行啊
module led_test(
input clk,
input rst_n,
input key1,
output reg [3:0] led
);
//-----------------
// reg declaration
//-----------------
reg[4:0] key1_reg = 5'd0;
reg switch = 1'b1;
//----------------
// main code
//----------------
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
key1_reg <= 5'd0;
else
key1_reg <= {key1_reg[3:0],key1};
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
switch <= 1'b1;
else if(key1_reg == 5'd1)
switch <= 1'b0;
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
led <= 4'd1;
else if(switch)
led <= {led[2:0],led[3]};
else
led <= 4'hf;
end
endmodule
//else if(key_low)
//led_r <= 4'b0;
//else if(enable & !key_low)
//led_r <= {led_r[0],led_r[3:1]};
key_low改为reg1_low试试
这是什么功能?好像没出现想要的
好像不行,那不就相当于reg1_low没有进行按键消抖处理了吗
