当前位置: 首页 > article >正文

四个按键控制led的四种变化(按键控制led)(附源码)

文章目录

  • 一、实验任务
  • 二、系统框图
  • 三、代码实现
  • 四、引脚分配
  • 五、总结


一、实验任务

使用开发板上的四个按键控制四个LED灯。按下不同的按键时,四个LED灯显示不同效果。本实验是在EP4CE6F17C8开发板上实现,仿真请用modelsim Altera
请添加图片描述

在这里插入图片描述

二、系统框图

请添加图片描述

三、代码实现

module key_led (
    input clk,                      //时钟周期
    input rst_n,                    //复位信号
    input [3:0] key ,               //4个按键,提供4个位宽
    output reg [3:0] key_led        //4个led灯,提供4个位宽
);
reg [1:0] state;                    //两位宽的状态寄存器,存储4个状态
reg [25:0] cnt_1s;                  //存储1s的寄存器


parameter MAX_1s = 26'd49_999_999;//1s的时钟周期


//1s计数器
always @(negedge rst_n or posedge clk) begin
    if (!rst_n) begin
        cnt_1s <= 26'd0;
    end
    else if (cnt_1s == MAX_1s) begin
        cnt_1s <= 26'd0;
    end
    else begin
        cnt_1s <= cnt_1s + 26'd1;
    end
end

//状态每隔1s进行跳转
always @(negedge rst_n or posedge clk) begin
    if (!rst_n) begin
        state <= 2'd0;
    end
    else if (cnt_1s == MAX_1s) begin            //每隔1s进入下一个状态
        state <= state + 2'd1;
    end
    else begin
        state <= state;
    end
end

//不同按键不同led灯闪烁方式
always @(negedge rst_n or posedge clk) begin
    if (!rst_n) begin
        key_led <= 4'b0000;
    end
    else if (key[0] == 0) begin            //key0键按下,从右往左流水灯
        case (state)
            2'd0: key_led <= 4'b0001;
            2'd1: key_led <= 4'b0010;
            2'd2: key_led <= 4'b0100;
            2'd3: key_led <= 4'b1000;
            default: key_led <= key_led ;
        endcase
    end
     else if (key[1] == 0) begin            //key1键按下,从左往右流水灯
        case (state)
            2'd0: key_led <= 4'b1000;
            2'd1: key_led <= 4'b0100;
            2'd2: key_led <= 4'b0010;
            2'd3: key_led <= 4'b0001;
            default: key_led <= key_led ;
        endcase
    end
     else if (key[2] == 0) begin            //key2键按下,led灯闪烁
        case (state)
            2'd0: key_led <= 4'b1111;
            2'd1: key_led <= 4'b0000;
            2'd2: key_led <= 4'b1111;
            2'd3: key_led <= 4'b0000;
            default: key_led <= key_led ;
        endcase
    end
     else if (key[3] == 0) begin            //key3键按下,灯常亮
        case (state)
            2'd0: key_led <= 4'b1111;
            2'd1: key_led <= 4'b1111;
            2'd2: key_led <= 4'b1111;
            2'd3: key_led <= 4'b1111;
            default: key_led <= key_led ;
        endcase
    end
    else begin
        state <= state;
    end
end



endmodule

仿真代码:

`timescale 1ns/1ns
module key_led_tb (
);
    reg clk;
    reg rst_n;
    reg [3:0] key;
    wire [3:0] key_led;

    parameter MAX_1s = 9;
    parameter CYCLE = 20;

    always #(CYCLE/2) clk <= ~clk;

    initial begin
        clk = 1'b0;
        rst_n = 1'b0;
        #(CYCLE);
        rst_n = 1'b1;
        key = 4'b1111;
        #(4*(MAX_1s + 1)*CYCLE);  //4个state的时间
        key = 4'b1110;
        #(4*(MAX_1s + 1)*CYCLE);  
        key = 4'b1101;
        #(4*(MAX_1s + 1)*CYCLE);  
        key = 4'b1011;
        #(4*(MAX_1s + 1)*CYCLE);  
        key = 4'b0111;
        $stop;
    end


    key_led  #(.MAX_1s(MAX_1s))u_key_led(
        .clk(clk),
        .rst_n(rst_n),
        .key(key),
        .key_led(key_led)
    );


    
endmodule

四、引脚分配

请添加图片描述

五、总结

注意:该实验并未进行按键消抖,需一直按着按键才能让该按键所操控的led变化功能实现。


http://www.kler.cn/a/38015.html

相关文章:

  • 苹果APP安装包ipa如何安装在手机上
  • H3C-Cloud Lab实验-PPPoE实验
  • SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案
  • Mac环境下安装nginx并本地部署项目
  • Pytorch深度强化学习1-3:策略评估与贝尔曼期望方程详细推导
  • Day6---二叉树基础(上)
  • (一)Qt下实现多个海康工业相机内触发采集回调取流显示
  • Spring MVC文件上传
  • 编写Pthreads程序实现直方图统计
  • Java设计模式之创建型-原型模式(UML类图+案例分析)
  • Ansible 自动化运维工具(完善版)
  • 让白嫖来的阿里云服务器来跑jupyter
  • Flutter ValueNotifier 监听数据变化
  • 论文阅读 HighlightMe: Detecting Highlights from Human-Centric Videos
  • wordpress仿站常用功能代码
  • HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(四)
  • Java Vue物联网系统
  • vagrant和vitrulBox创建虚拟机后使用xshell连接
  • Android 中利用多个Button组合实现选项切换效果
  • layui入门