//通过按键控制对应的led灯亮灭,按一下亮,再按一下灭,消抖时间20ms
module key_led
(
input clk , rst_n,
input [2:0]key ,
output led0,led1,led2
);
reg [2:0] key_rst;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
key_rst <= 3'b111 ;
else
key_rst <= key ;
end
reg [2:0] key_rst_r ;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
key_rst_r <= 3'b111;
else
key_rst_r <= key_rst ;
end
wire [2:0]key_en = key_rst_r & (~key_rst) ;
///
reg [19:0] cnt;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt <= 20'd0 ;
else if(key_en)
cnt <= 20'd0 ;
else
cnt <= cnt + 20'd1 ;
end
///
reg [2:0] low_sw ;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
low_sw <= 3'b111 ;
else if (cnt == 20'hfffff)
low_sw <= key ;
// else
// low_sw <= low_sw; //为什么这句加上去按键key[0]会不稳定??
end
reg [2:0] low_sw_r ;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
low_sw_r <= 3'b111 ;
else
low_sw_r <= low_sw;
end
wire [2:0]led_ctrl = low_sw_r[2:0] & (~low_sw[2:0]) ;
reg [2:0] led_out ;
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
led_out <= 3'b111 ;
else
begin
if(led_ctrl[0]) led_out[0] <= ~led_out[0] ;
if(led_ctrl[1]) led_out[1] <= ~led_out[1] ;
if(led_ctrl[2]) led_out[2] <= ~led_out[2] ;
end
end
assign led0 = led_out[0]? 1'd1 :1'd0;
assign led1 = led_out[1]? 1'd1 :1'd0;
assign led2 = led_out[2]? 1'd1 :1'd0;
endmodule