FPGA之按键控制LED-FPGA常见问题社区-FPGA CPLD-ChipDebug

FPGA之按键控制LED

 

一、按键开关

1、按键开关(轻触开关):主要是指轻触式按键开关,属于电子元器件类,使用时以满足操作力的条件向开关操作方向施压开关功能闭合接通,当撤销压力时开关即断开,其内部结构是靠金属弹片受力变化来实现通断的。

图片[1]-FPGA之按键控制LED-FPGA常见问题社区-FPGA CPLD-ChipDebug

       2、自锁按键:在开关按钮第一次按时,开关接通并保持,即自锁,在开关按钮第二次按时,开关断开,同时开关按钮弹出来。 自锁开关一般是指开关自带机械锁定功能,按下去,松手后按钮是不会完全跳起来的,处于锁定状态,需要再按一次,才解锁完全跳起来。

图片[2]-FPGA之按键控制LED-FPGA常见问题社区-FPGA CPLD-ChipDebug

二、硬件设计

1、 按键模块原理图如下:

图片[3]-FPGA之按键控制LED-FPGA常见问题社区-FPGA CPLD-ChipDebug

       对于管脚分配,可查看对应的FPGA原理图。

2、实验目的

使用开发板上的四个按键控制四个LED灯,没有按键按下时,四个灯全灭当按下KWEY0时,实现自右向左的流水灯当按下KWEY1时,实现自左向右的流水灯当按下KWEY2时,实现四个灯同时闪烁当按下KWEY3时,实现四个灯全亮

3、系统框图如下:

图片[4]-FPGA之按键控制LED-FPGA常见问题社区-FPGA CPLD-ChipDebug

       50Hhz时钟:由开发板上的晶振提供;

rst复位信号:由开发板上的复位按键提供;

三、程序代码

module key_led(
     input clk,
     input rst_n,  //(_n表示复位信号低电平有效)
     
     input [3:0] key,  //key的位宽为4
     output reg [3:0] led   //led的位宽为4
 
);
     //定义计数器
    reg [23:0] cnt;
    //定义状态计数器,4个状态,所以计数器位宽是2
    reg [1:0] led_ctrl;
    
    
    //always模块定义一个0.2s的计数器
always @ (posedge clk or negedge rst_n) begin //用一个上升沿或者下降沿触发always模块
    if(!rst_n)
       cnt <= 24'd0; //清零
     else
       if(cnt < 24'd10000000)
           cnt <= cnt + 1'b1; //累加
         else
            cnt <= 24'd0; //清零
end
 
    //每隔0.2s改变计数器状态
always @ (posedge clk or negedge rst_n) begin //用一个上升沿或者下降沿触发always模块
    if(!rst_n)  //复位
       led_ctrl <= 2'd0; //状态计数器清零,led_ctrl位宽为2,所以是2'd0;
     else
        if(cnt == 24'd1000_0000) //0.2s时,计数器加1
            led_ctrl <= led_ctrl + 1'b1;  //累加
          else
             led_ctrl <= led_ctrl;
end 
 
 
//根据按键改变led状态
always @ (posedge clk or negedge rst_n) begin //用一个上升沿或者下降沿触发always模块
    if(!rst_n)  //复位
       led <= 4'b0000; //状态计数器清零,led为4种状态,所以是4'b0000; 
     else
        if(key[0] == 1'b0) 
          case(led_ctrl)   //从右向左的流水灯
             2'd0:  led <= 4'b1000;
             2'd1:  led <= 4'b0100;
             2'd2:  led <= 4'b0010;
             2'd3:  led <= 4'b0001;   
          endcase
       else 
         if(key[1] == 1'b0) 
          case(led_ctrl)   //从左向右的流水灯
             2'd0:  led <= 4'b0001;
             2'd1:  led <= 4'b0010;
             2'd2:  led <= 4'b0100;
             2'd3:  led <= 4'b1000;   
          endcase
       else 
         if(key[2] == 1'b0) 
          case(led_ctrl)   //四个灯同时闪烁
             2'd0:  led <= 4'b1111;
             2'd1:  led <= 4'b0000;
             2'd2:  led <= 4'b1111;
             2'd3:  led <= 4'b0000;   
          endcase
      else if(key[3] == 1'b0)   //四个灯全亮
          led <= 4'b1111;
        else     //无按键按下时,灯全灭
          led <= 4'b0000;
end
 
endmodule

 

四、演示视频

FPGA学习笔记之按键控制LED演示效果

请登录后发表评论

    没有回复内容