实验要求
按键实验:编写“key.v”,Bit 文件下载到开发板以后,开发板上的"PL LED1"、" PL LED2"、" PL LED3"、" PL LED4"都处于灭状态,按键“PL KEY1”按下“PL LED1”亮,按键“PL KEY2”按下“PL
LED2” 亮,按键“PL KEY3”按下“PL LED3” 亮, 按键“PL KEY4”按下“PL LED4” 亮。如视频所示。
实验原理
1.在本实验FPGA开发板上有四个独立的用户按键,用户通过FPGA来检测与按键对应的I/O信号的电平高低来判断按键是否按下或松开。
2.从开发板的用户手册中可以看到,电路的按键松开时是高电平,按下时是低电平。
而LED部分,低电平亮,高电平灭。
key.v的Verilog代码
module key(
input wire [3:0] key, // 4个按键输入
output reg [3:0] led // 4个LED输出
);
always @(*) begin
// 默认情况下,LED全灭(假设LED低电平点亮)
led = 4'b1111;
// 按键按下时(低电平),对应的LED亮(低电平)
if (key[0] == 0) led[0] = 1'b0; // 按键1按下,点亮LED1
if (key[1] == 0) led[1] = 1'b0; // 按键2按下,点亮LED2
if (key[2] == 0) led[2] = 1'b0; // 按键3按下,点亮LED3
if (key[3] == 0) led[3] = 1'b0; // 按键4按下,点亮LED4
end
endmodule
添加约束文件
key.xdc
#############LED Setting#############################
set_property PACKAGE_PIN J14 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN K14 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property PACKAGE_PIN J18 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property PACKAGE_PIN H18 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
############## key define##############################
set_property PACKAGE_PIN M15 [get_ports {key[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {key[0]}]
set_property PACKAGE_PIN M14 [get_ports {key[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {key[1]}]
set_property PACKAGE_PIN L17 [get_ports {key[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {key[2]}]
set_property PACKAGE_PIN L16 [get_ports {key[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {key[3]}]
仿真验证
Verilog 测试模块代码:
`timescale 1ns / 1ps
module tb_key;
// 信号声明
reg [3:0] key;
wire [3:0] led;
// 实例化待测模块
key uut (
.key(key),
.led(led)
);
initial begin
// 初始化按键状态
key = 4'b1111;
#10; // 等待一段时间,观察初始状态下LED全灭
// 按下按键1
key[0] = 0;
#10; // 等待,观察LED1点亮
// 释放按键1
key[0] = 1;
#10; // 等待,观察LED1熄灭
// 按下按键2
key[1] = 0;
#10; // 等待,观察LED2点亮
// 释放按键2
key[1] = 1;
#10; // 等待,观察LED2熄灭
// 按下按键3
key[2] = 0;
#10; // 等待,观察LED3点亮
// 释放按键3
key[2] = 1;
#10; // 等待,观察LED3熄灭
// 按下按键4
key[3] = 0;
#10; // 等待,观察LED4点亮
// 释放按键4
key[3] = 1;
#10; // 等待,观察LED4熄灭
//$finish; // 结束仿真
end
endmodule
仿真结果:
仿真分析:仿真开始时,按键key被初始化为4'b1111(即所有按键都处于未按下状态 )。此时,根据keyled模块的逻辑,LED信号led被赋值为4'b1111。在假设 LED 低电平点亮的情况下,这意味着所有LED都处于熄灭状态 ,符合实验要求中LED灯都处于灭状态的设定。当key[0]被赋值为0(即按键1按下)时,led[0]变为0,对应LED1点亮,其余三个按键和LED同理,仿真结果符合实验要求。
实验结果
bit文件下载到开发板以后,开发板上的四个LED都处于灭的状态。按键“PL KEY1”按下“PL LED1”亮,按键“PL KEY2”按下“PL LED2”亮,按键“PL KEY3”按下“PL LED3”亮, 按键“PL KEY4”按下“PL LED4”亮。松手后,按键会灭。