- module keyxiaodou (
- input clk,//the freq or clk is 50M
- input rst,//use key3 for rst button
- input key1,key2,//use key1 to light led,use key2 to turn off led
- output led);
- //--------------------------------------------------
- reg [1:0] key_r;//the first time check the key
- always @ (posedge clk or negedge rst)
- if (!rst) key_r <= 2'b11;
- else key_r <= {key2,key1};
- reg [1:0] key_rb;
- always @ (posedge clk or negedge rst)
- if (!rst) key_rb <= 2'b11;
- else key_rb <= key_r;
- wire [1:0] key_an = key_rb & (~key_r);//if the key[?] is pressed,key_an[?] become 1'b1
- //--------------------------------------------------
- reg [19:0] cnt;//divice the freq 1/50m*2^20=20ms
- always @ (posedge clk or negedge rst)
- if (!rst) cnt <= 20'd0;
- else if (key_an) cnt <= 20'd0;
- else cnt <= cnt+1'b1;
- //--------------------------------------------------
- reg [1:0] keyn_r;//the second time check the key
- always @ (posedge clk or negedge rst)
- if (!rst) keyn_r <= 2'b11;
- else if(cnt ==20'hfffff) keyn_r <= {key2,key1};//relay 20ms for debounce
- reg [1:0] keyn_rb;
- always @ (posedge clk or negedge rst)
- if (!rst) keyn_rb <= 2'b11;
- else keyn_rb <= keyn_r;
- wire [1:0] key_p = keyn_rb & (~keyn_r);
- //--------------------------------------------------
- reg led_r;
- always @ (posedge clk or negedge rst)
- if (!rst) led_r <= 1'b0;
- else if (key_p[0]) led_r <= 1'b1;
- else if (key_p[1]) led_r <= 1'b0;
- assign led=~led_r;
- endmodule
|