按键控制led灯

//通过按键控制对应的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

posted on 2011-07-31 15:33  qmn91  阅读(344)  评论(3编辑  收藏  举报

导航