⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sw_debounce.v

📁 verilog键盘防抖程序
💻 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 + -