【FPGA实验】按键实验

实验要求

按键实验:编写“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”亮。松手后,按键会灭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值