正点原子新起点FPGA按键+消抖模块实例化

前言

学习正点原子的新起点FPGA开发板时,对于按键+消抖模块的实例化仅仅实现了一个按键的实例化,对于初学者而言,进行多个按键+消抖进行模块示例化,可能会没有一点思绪,笔者也是初学者,通过尝试写出的多个按键+消抖模块实例化,现在分享如下:

代码功能:

通过FPGA开发板上面的4个按键控制4个LED灯,共4个状态:
KEY0:LED1和LED4亮,LED2和LED3灭;
KEY1:LED1和LED4灭,LED2和LED3亮;
KEY2:LED1、LED2、LED3和LED4全亮;
KEY3:LED1、LED2、LED3和LED4全灭;

代码编写:

1. 按键消抖模块

module key_debounce(
     
     input  sys_clk,     //系统时钟
     input  sys_rst_n,   //系统复位
     
     
     input  key,    
     output reg key_value,
     output reg key_flag
     
);

reg [31:0] delay_cnt;  //延时计数器

reg key_reg;           //按键按下标志位

parameter CNT_MAX = 32'd1_000_000 - 1'b1;   //延时计数实现20ms延时

always @(posedge sys_clk or negedge sys_rst_n)begin

     if(!sys_rst_n)begin
         delay_cnt <= 32'b0;
         key_reg <= 1'b0;
     end
     else begin
         key_reg <= key;       
         if(key_reg != key)    
            delay_cnt <= CNT_MAX;   
         else if(key_reg == key)begin  
            if(delay_cnt > 32'b0)     
              delay_cnt <= delay_cnt - 1'b1;  
            else
              delay_cnt <= delay_cnt;
         end
     end
end


always @(posedge sys_clk or negedge sys_rst_n)begin
     if(!sys_rst_n)begin
             key_value <= 1'b1;
             key_flag <= 1'b0;
     end
     else begin
        if(delay_cnt == 32'd1)begin
             key_value <= key;
             key_flag <= 1'b1;
         end
         else begin
             key_value <= key_value;
             key_flag <= 1'b0;  
         end       
     end
end
endmodule

2. LED控制模块

module led_ctrl(

     input              sys_clk,
     input              sys_rst_n,
     
     input      [3:0]   key_flag,
     input      [3:0]   key_value,
     output reg [3:0]   led

);

wire [3:0] Value;

assign Value[0] = key_flag[0] && (~key_value[0]);
assign Value[1] = key_flag[1] && (~key_value[1]);
assign Value[2] = key_flag[2] && (~key_value[2]);
assign Value[3] = key_flag[3] && (~key_value[3]);

always @(posedge sys_clk or negedge sys_rst_n)begin

     if(!sys_rst_n)
        led <= 4'b0000;
     else if(Value[0])
        led <= 4'b1001;
     else if(Value[1])
        led <= 4'b0110;
     else if(Value[2])
        led <= 4'b1111;
     else if(Value[3])
        led <= 4'b0000;
     else
        led <= led;
end
endmodule

3. 模块实例化

module Key_instantiation(
     input  sys_clk,
     input  sys_rst_n,

     
     input  [3:0] key,
     output [3:0] led
);

wire [3:0] key_flag;
wire [3:0] key_value;

key_debounce u_debounce0(
     .sys_clk        (sys_clk),
     .sys_rst_n      (sys_rst_n),
     
     .key            (key[0]),

     .key_flag       (key_flag[0]),
     .key_value      (key_value[0])

);
key_debounce u_debounce1(
     .sys_clk        (sys_clk),
     .sys_rst_n      (sys_rst_n),
     
     .key            (key[1]),

     .key_flag       (key_flag[1]),
     .key_value      (key_value[1])

);
key_debounce u_debounce2(
     .sys_clk        (sys_clk),
     .sys_rst_n      (sys_rst_n),
     
     .key            (key[2]),

     .key_flag       (key_flag[2]),
     .key_value      (key_value[2])

);
key_debounce u_debounce3(
     .sys_clk        (sys_clk),
     .sys_rst_n      (sys_rst_n),
     
     .key            (key[3]),

     .key_flag       (key_flag[3]),
     .key_value      (key_value[3])

);
led_ctrl u_led_ctrl1(
     .sys_clk        (sys_clk),
     .sys_rst_n      (sys_rst_n),
     .key_flag       (key_flag),
     .key_value      (key_value),
     .led            (led)
);
endmodule

现象

在这里插入图片描述

图1KEY1现象

在这里插入图片描述

图2KEY2现象

在这里插入图片描述

图3KEY3现象

在这里插入图片描述

图4KEY4现象
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值