最近在学习FPGA,用的别人的一块Altera的Cyclone IV的板子,要学的东西太多了,偶尔写篇博客督促自己。
这个程序是独立按键的延时消抖,每次按键按下,使板载的4颗LED状态发生反转,原理很简单。
//******************************************
//独立按键,延时消抖,控制LED点亮与熄灭
//Author : HuaSir
//Date : 30,October,2020
//******************************************
module test(
input sys_clk, //系统时钟
input sys_reset_slk,//系统复位时钟
input key,
output reg[3:0] led //四个LED,板载上4个LED
);
reg key_reg; //保存上一个键值
reg key_flag; //输出按键按下有效位
reg [31:0] count; //计数寄存器
//按键检测,消抖
always@(posedge sys_clk or negedge sys_reset_slk)begin
if(!sys_reset_slk)begin
key_reg <= 1;
count <= 0;
end
else begin
key_reg <= key; //寄存键值
if(key_reg != key) //与上一次的键值对比,发生跳变
count <= 32'd100_0000; //赋初值,50MHz晶振下,100_0000个时钟周期是20ms
else begin
if(count > 0)
count <= count - 1; //递减
else
count <= count; //当计数器递减至0时,停止计数
end
end
end
always@(posedge sys_clk or negedge sys_reset_slk)begin
if(!sys_reset_slk)begin
key_flag <= 0;
end
else begin
if(count == 1)
key_flag <= 1; //计数器递减至1,表示消抖结束
else
key_flag <= 0; //key_flag输出一个周期的高电平
end
end
//**************************************************
//** main code
//**************************************************
always@(posedge sys_clk or negedge sys_reset_slk)begin
if(!sys_reset_slk)begin
led <= 4'b0000; //系统复位后,LED全部熄灭(高电平点亮)
end
else if(key_flag && (!key))//key_flag和键值综合表征是否按下,消抖结束后按键为0,说明按键有效
led <= ~led; //LED取反
else
led <= led;
end
endmodule