📄 sw_debounce.v
字号:
`timescale 1ns / 1ps//说明:sw1_n,sw2_n,sw3_n,sw4_n对应取反输出sw_d1,sw_d2,sw_d3,sw_d4;// sw1_n,sw2_n,sw3_n,sw4_n状态与output[3:0] outh_d相同// clk; //主时钟信号,50MHz左右// rst_n; //复位信号,低有效//针对取反输出有用//没有用时不能悬空module sw_debounce( clk,rst_n, sw1_n,sw2_n,sw3_n,sw4_n, sw_d1,sw_d2,sw_d3,sw_d4, outh_d);input clk; //主时钟信号,50MHzinput rst_n; //复位信号,低有效//针对取反输出有用input sw1_n,sw2_n,sw3_n,sw4_n; //三个独立按键,低表示按下output sw_d1,sw_d2,sw_d3,sw_d4; //发光二极管,分别由按键控制//每次按键变化取反输出output[3:0] outh_d;//与按键状态相同输出//---------------------------------------------------------------------------reg[3:0] key_rst; always @(posedge clk or negedge rst_n) if (!rst_n) key_rst <= 4'b1111; else key_rst <= {sw4_n,sw3_n,sw2_n,sw1_n};//-----------------------------------------reg[3:0] key_rst_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always @ ( posedge clk or negedge rst_n ) if (!rst_n) key_rst_r <= 4'b1111; else key_rst_r <= key_rst;///------------------------------------ //当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期 wire[3:0] key_an = key_rst_r & ( ~key_rst);//---------------------------------------------------------------------------reg[19:0] cnt; //计数寄存器always @ (posedge clk or negedge rst_n) if (!rst_n) cnt <= 20'd0; //异步复位 else if(key_an) cnt <=20'd0; else cnt <= cnt + 1'b1; //-------------------------------------reg[3:0] low_sw;always @(posedge clk or negedge rst_n) if (!rst_n) low_sw <= 4'b1111; else if (cnt == 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw中 cnt == 20'hfffff low_sw <= {sw4_n,sw3_n,sw2_n,sw1_n}; //---------------------------------------------------------------------------reg [3:0] low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always @ ( posedge clk or negedge rst_n ) if (!rst_n) low_sw_r <= 4'b1111; else low_sw_r <= low_sw;//--------------------------------------------- //当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期 wire[3:0] led_ctrl = low_sw_r[3:0] & ( ~low_sw[3:0]);reg d1;reg d2;reg d3;reg d4;///--------------------------------------- always @ (posedge clk or negedge rst_n) if (!rst_n) begin d1 <= 1'b0; d2 <= 1'b0; d3 <= 1'b0; d4 <= 1'b0; end else begin //某个按键值变化时,LED将做亮灭翻转 if ( led_ctrl[0] ) d1 <= ~d1; if ( led_ctrl[1] ) d2 <= ~d2; if ( led_ctrl[2] ) d3 <= ~d3; if ( led_ctrl[3] ) d4 <= ~d4; endassign sw_d1 = d1 ? 1'b1 : 1'b0; //LED翻转输出assign sw_d2 = d2 ? 1'b1 : 1'b0; //LED翻转输出assign sw_d3 = d3 ? 1'b1 : 1'b0;assign sw_d4 = d4 ? 1'b1 : 1'b0;assign outh_d = low_sw; //与按键状态相同输出endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -