前言
学习正点原子的新起点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