2、按键检测例程

编程入门 行业动态 更新时间:2024-10-21 18:36:17

2、<a href=https://www.elefans.com/category/jswz/34/1768597.html style=按键检测例程"/>

2、按键检测例程

采用的是黑金的板子

1、实验目的

    这一次的实验的目的就是使用FPGA上的按键能够控制上面的LED灯的亮灭

2、实验理解

    step1  能够检测到按键的变化 

    step2 将 检测到的按键变化-----能够通过判断到这个按键发生了变化 (消抖的问题) -- 对应到led的灯的亮灭上    

3、开始编程啦

//===========================================================================
// Module name: key_test.v
// : ⿪ϵĸKEY1~KEY4, ⵽ʱ,ӦLEDƷת
//===========================================================================`timescale 1ns / 1psmodule key_test  (clk,              // ʱ: 50Mhzrst_n,            // 븴λkey_in,           // 밴ź(KEY1~KEY4)led_out           // LED,ڿƿĸLED(LED1~LED4));//===========================================================================
// PORT declarations
//===========================================================================						
input        clk; 
input        rst_n;
input  [3:0] key_in;
output [3:0] led_out;//Ĵ
reg [19:0] count;
reg [3:0] key_scan; //ɨֵKEY//===========================================================================
// ֵ20msɨһ,ƵСڰëƵʣ൱˳˸Ƶëźš
//===========================================================================always @(posedge clk or negedge rst_n)     //ʱӵغ͸λ½
beginif(!rst_n)                //λźŵЧcount <= 20'd0;        //0elsebeginif(count ==20'd999_999)   //20msɨһΰ,20ms(50M/50-1=999_999)begincount <= 20'b0;     //Ƶ20mskey_scan <= key_in; //ƽendelsecount <= count + 20'b1; //1end
end
//===========================================================================
// źһʱӽ
//===========================================================================
reg [3:0] key_scan_r;
always @(posedge clk)key_scan_r <= key_scan;       wire [3:0] flag_key = key_scan_r[3:0] & (~key_scan[3:0]);  //⵽½ر仯ʱð£Ч //===========================================================================
// LEDƿ,ʱ,صLEDת
//===========================================================================
reg [3:0] temp_led;
always @ (posedge clk or negedge rst_n)      //ʱӵغ͸λ½beginif (!rst_n)                 //λźŵЧtemp_led <= 4'b1111;   //LEDƿźΪ, LEDȫelsebegin            if ( flag_key[0] ) temp_led[0] <= ~temp_led[0];   //KEY1ֵ仯ʱLED1תif ( flag_key[1] ) temp_led[1] <= ~temp_led[1];   //KEY2ֵ仯ʱLED2תif ( flag_key[2] ) temp_led[2] <= ~temp_led[2];   //KEY3ֵ仯ʱLED3תif ( flag_key[3] ) temp_led[3] <= ~temp_led[3];   //KEY4ֵ仯ʱLED4תend
endassign led_out[0] = temp_led[0];assign led_out[1] = temp_led[1];assign led_out[2] = temp_led[2];assign led_out[3] = temp_led[3];endmodule
 

4、最重要的是关于按键的消抖操作的理解

always @(posedge clk or negedge rst_n)     //ʱӵغ͸λ½
begin
   if(!rst_n)                //λźŵЧ
      count <= 20'd0;        //0
   else
      begin
         if(count ==20'd999_999)   //20msɨһΰ,20ms(50M/50-1=999_999)
            begin
               count <= 20'b0;     //Ƶ20ms
               key_scan <= key_in; //ƽ
            end
         else
            count <= count + 20'b1; //1
     end

end

上面这个模块是对按键进行扫描,扫描的间隔就是20ms(这也就是消抖的关键,进行二次及其二次以上的判断)

always @(posedge clk)
 //  key_scan_r <= key_scan;   //这一句话 是进行将上一个20ms的状态存下来  当下一个20ms 来了时候 就进行比较得到结果

    key_scan_r <=4'b1111 ;    //  这句话 就是固定值   用于实现只有按下的时候 或者只有放开的时候灯才亮或者灭掉,

                                            //同样 , 在这种情况下, 我们将key_scan的那个 取反的 符号 去掉 就可以了  就可以 实现 只有按下的时候 才灭掉   否则 是只有按下的时候 才亮起来  


wire [3:0] flag_key = key_scan_r[3:0] & (~key_scan[3:0]);   


更多推荐

2、按键检测例程

本文发布于:2023-06-27 08:20:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/908696.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:按键   例程

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!