目录
1 按键简介
按键开关是一种电子开关,属于电子元器件类。
轻触式按键
自锁式按键
2 实验任务
使用底板上的 PL_KEY0
和
PL_KEY1
按键来控制底板上的
PL_LED0
和
PL_LED1
两个 LED
的闪烁方式。没有按键按下时,两个
LED
保持常亮;如果按键
0
按下,则两个
LED
交替闪烁;如果按键 1
按下,则两个
LED
同时闪烁。
3 硬件设计
![](https://img-blog.csdnimg.cn/f7e2eb59842346b98b96634e0b5236bd.png)
![](https://img-blog.csdnimg.cn/b3e2fda09b2d43569012f1af9e205e07.png)
对应的 XDC 约束语句如下所示:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports key[0]]set_property -dict {PACKAGE_PIN K16 IOSTANDARD LVCMOS33} [get_ports key[1]]set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports {led[0]}]set_property -dict {PACKAGE_PIN L15 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
4 程序设计
![](https://img-blog.csdnimg.cn/7d4e483037724d7c9095b63c9de59791.png)
计数器对 50MHz
时钟进行计数,从而达到计时的目的。计数器在每次计时到
0.5
秒的时候,就改变 LED
的显示状态,然后清零并重新开始计数。然后根据两个按键(KEY0
和
KEY1
)的状态,在不同的
LED
状态下,分别设置
LED
的显示模式(是同时闪烁,或者交替闪烁)。
顶层模块代码如下:
module key_led(
input sys_clk ,
input sys_rst_n ,
input [1:0] key ,
output reg [1:0] led
);
//reg define
reg [24:0] cnt;
reg led_ctrl;
//*****************************************************
//** main code
//*****************************************************
//计数器
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt <= 25'd0;
else if(cnt < 25'd2500_0000) //计数 500ms
cnt <= cnt + 1'b1;
else
cnt <= 25'd0;
end
//每隔 500ms 就更改 LED 的闪烁状态
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led_ctrl <= 1'b0;
else if(cnt == 25'd2500_0000)
led_ctrl <= ~led_ctrl;
end
//根据按键的状态以及 LED 的闪烁状态来赋值 LED
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led <= 2'b11;
else case(key)
2'b10 : //如果按键 0 按下,则两个 LED 交替闪烁
if(led_ctrl == 1'b0)
led <= 2'b01;
else
led <= 2'b10;
2'b01 : //如果按键 1 按下,则两个 LED 同时闪烁
if(led_ctrl == 1'b0)
led <= 2'b11;
else
led <= 2'b00;
2'b11 : //如果两个按键都未按下,则两个 LED 都保持点亮
led <= 2'b11;
default: ;
endcase
end
endmodule