按键控制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

转载于:https://www.cnblogs.com/hdu-Qmn/archive/2011/07/31/2122750.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值