1.硬件特征:轻触式(回弹式)按键 自锁式按键
按键开关是一种电子开关,属于电子元器件类。我们的开发板上有两种按键开关: 第一种是本实验所使用的轻触式按键开关,简称轻触开关。 使用时以向开关的操作方向施加压力使内部电路闭
合接通,当撤销压力时开关断开,其内部结构是靠金属弹片受力后发生形变来实现通断的;第二种是自锁按键, 自锁按键第一次按下后保持接通,即自锁,第二次按下后,开关断开,同时开关按钮弹出来, 开发板上的电源键就是这种开关。;
2.原理图:
3.端口:时钟,复位,按键输入,led输出
4.代码技巧:
//空语句“ ; ”等同于信号自赋值,即信号保持
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
led_flag <= 2'd0;
else if(cnt == CNT_MAX - 25'd1)
led_flag <= led_flag + 2'd1;
else
; //效果等同于led_flag <= led_flag
end
//例化过程中的参数传递的使用格式 #(
.变量名(要赋予的值)
)
key_led #(
.CNT_MAX(25) //500ns
)
key_led_1(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.led(led),
.key(key)
);
5.代码:
/*
实现功能:四个按键控制四个led输出不同效果,时间间隔为500ms
key[3:0] == 4'b0000; led[3:0] == 4'b0000;
key[3:0] == 4'b0001; led[3:0] == 4'b0001; -->led[3:0] == 4'b0010;-->led[3:0] == 4'b0100; 500ms
key[3:0] == 4'b0010; led[3:0] == 4'b0001; -->led[3:0] == 4'b1000;-->led[3:0] == 4'b0100; 500ms
key[3:0] == 4'b0100; led[3:0] == 4'b0000; -->led[3:0] == 4'b1111;-->led[3:0] == 4'b0000; 500ms
key[3:0] == 4'b1000; led[3:0] == 4'b1111;
*/
module key_led(
input sys_clk,
input sys_rst_n,
input [3:0] key,
output reg [3:0] led
);
parameter CNT_MAX = 25'd25_000_000;
reg [24:0] cnt;
reg [1:0] led_flag;
//计数时间0.5s
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
cnt <= 25'd0;
else if(cnt <= CNT_MAX - 25'd1)
cnt <= cnt+1;
else
cnt <=25'd0;
end
//led_flag信号,每计数到24_999_999时,led_flag信号+1
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
led_flag <= 2'd0;
else if(cnt == CNT_MAX - 25'd1)
led_flag <= led_flag + 2'd1;
else
; //效果等同于led_flag <= led_flag
end
//led控制逻辑
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
led[3:0] <= 4'd0000;
else
begin
case(key[3:0])
4'b1111: led[3:0] <= 4'b0000; //全灭
4'b1110:
begin
case(led_flag)
2'b00: led <= 4'b0001;
2'b01: led <= 4'b0010;
2'b10: led <= 4'b0100;
default:led <= 4'b1000;
endcase
end
4'b1101:
begin
case(led_flag)
2'b00: led <= 4'b0001;
2'b01: led <= 4'b1000;
2'b10: led <= 4'b0100;
default:led <= 4'b0010;
endcase
end
4'b1011:
begin
case(led_flag)
2'b00: led <= 4'b0000;
2'b01: led <= 4'b1111;
2'b10: led <= 4'b0000;
default:led <= 4'b1111;
endcase
end
default :led <= 4'b1111;
endcase
end
end
endmodule
6.仿真与验证:
功能验证正确,其中led信号变化总是比led_flag的变化慢一拍,这是正常的,也就是这里反映了时序上的延迟,即只有在后一拍,led才能稳定采集到led_flag的变化并相应做出改变 。
7.易错点与总结:
略