yvhksovo 发表于 2009-10-27 21:01:03

这个键盘去抖程序的这条语句是做什么的?

源代码如下:
module sw_debounce(
                    clk,rst_n,
                        sw0_n,sw1_n,sw2_n,sw3_n,
                           led_d2,led_d3,led_d4,led_d5
                    );

input   clk;        //主时钟信号,50MHz
input   rst_n;        //复位信号,低有效
input   sw0_n,sw1_n,sw2_n,sw3_n;         //三个独立按键,低表示按下
outputled_d2,led_d3,led_d4,led_d5;        //发光二极管,分别由按键控制

//---------------------------------------------------------------------------
reg key_rst;

always @(posedge clkor negedge rst_n)
    if (!rst_n) key_rst <= 4'b1111;
    else key_rst <= {sw3_n,sw2_n,sw1_n,sw0_n};

reg key_rst_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clkor negedge rst_n )
    if (!rst_n) key_rst_r <= 4'b1111;
    else key_rst_r <= key_rst;
   
//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期
wire key_an = key_rst_r & ( ~key_rst);

//---------------------------------------------------------------------------
regcnt;        //计数寄存器

always @ (posedge clkor negedge rst_n)
    if (!rst_n) cnt <= 20'd0;        //异步复位
        else if(key_an) cnt <=20'd0;
    else cnt <= cnt + 1'b1;

reg low_sw;

always @(posedge clkor negedge rst_n)
    if (!rst_n) low_sw <= 4'b1111;
    else if (cnt == 20'hfffff)         //满20ms,将按键值锁存到寄存器low_sw中       cnt == 20'hfffff
      low_sw <= {sw3_n,sw2_n,sw1_n,sw0_n};
      
//---------------------------------------------------------------------------
reg low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

always @ ( posedge clkor negedge rst_n )
    if (!rst_n) low_sw_r <= 4'b1111;
    else low_sw_r <= low_sw;
   
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wire led_ctrl = low_sw_r & ( ~low_sw);

reg d0;
reg d1;
reg d2;
reg d3;

always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
      d0 <= 1'b0;
      d1 <= 1'b0;
      d2 <= 1'b0;
      d3 <= 1'b0;
      end
    else begin                //某个按键值变化时,LED将做亮灭翻转
      if ( led_ctrl ) d0 <= ~d0;
      if ( led_ctrl ) d1 <= ~d1;       
      if ( led_ctrl ) d2 <= ~d2;
      if ( led_ctrl ) d3 <= ~d3;
      end

assign led_d2 = d0 ? 1'b1 : 1'b0;
assign led_d3 = d1 ? 1'b1 : 1'b0;                //LED翻转输出
assign led_d4 = d2 ? 1'b1 : 1'b0;
assign led_d5 = d3 ? 1'b1 : 1'b0;

endmodule

就是这条语句
wire key_an = key_rst_r & ( ~key_rst);
谢谢大家

ngzhang 发表于 2009-10-27 22:14:04

就是生成一个按键发生变化的时候reset掉cnt那个计数器的信号。只有在按键不变化(不抖动),且维持20ms以上的时候,按键的输入值的变化才会引起led的d0~d3对应信号的反转。

代码写的很有意思。学习了!

yvhksovo 发表于 2009-10-28 10:40:33

嗯,谢谢了楼上、
页: [1]
查看完整版本: 这个键盘去抖程序的这条语句是做什么的?