按键控制led变化

这篇具有很好参考价值的文章主要介绍了按键控制led变化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

按键控制led变化

一、简介

使用按键控制开发板上一个led灯的亮灭,当按键按下的时候led灯就亮,当再一次按下按键的时候led就不亮了。由于按键存在抖动,按键松开的时候led灯就不亮,所以需要一个消抖模块对按键消抖

二、代码

module key_led (
    input wire clk,
    input wire rst_n,
    input wire[3:0] key,
     
    output reg[3:0] led
);
parameter TIME_0_2S = 10_000_000;  //
reg[24:0] cnt_0_2S;
reg[1:0] state;
//=================0.2s计时====================//
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        cnt_0_2S<=24'd0;
    end
    else if(cnt_0_2S == TIME_0_2S - 1)begin
        cnt_0_2S<=24'd0;
    end
    else begin
        cnt_0_2S<=cnt_0_2S+1'b1;
    end
end


//=================state=================//
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        state<=2'b00;
    end
    else if(cnt_0_2S == TIME_0_2S - 1) begin
        state<=state+1'b1;
    end
    else begin
        state<=state;
    end
end
//================按键控制流水灯===============//
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        led<=4'b0000;
    end
    else if(~key[0]) begin
        case (state)
            2'd0:led<=4'b0001;
            2'd1:led<=4'b0010;
            2'd2:led<=4'b0100;
            2'd3:led<=4'b1000;
        endcase
    end
    else if(~key[1]) begin
        case (state)
            2'd0:led<=4'b1000;
            2'd1:led<=4'b0100;
            2'd2:led<=4'b0010;
            2'd3:led<=4'b0001;
        endcase
    end
    else if(~key[2]) begin
        case (state)
            2'd0:led<=4'b1111;
            2'd1:led<=4'b0000;
            2'd2:led<=4'b1111;
            2'd3:led<=4'b0000;
        endcase
    end
    else if(~key[3]) begin
        case (state)
            2'd0:led<=4'b1111;
            2'd1:led<=4'b1111;
            2'd2:led<=4'b1111;
            2'd3:led<=4'b1111;
        endcase
    end
    else begin
        led<=4'b0000;
    end
end

endmodule
// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : 辣子鸡味的句橘子,331197689@qq.com
// File   : key_debounce.v
// Create : 2023-07-14 10:36:44
// Revise : 2023-07-14 10:36:44
// Editor : sublime text4, tab size (4)
// -----------------------------------------------------------------------------
module key_debounce(
    input wire clk,
    input wire rst_n,
    input wire[3:0] key_in,//四个按键信号输入

    output reg[3:0] key_out//四个按键信号消抖输出
);

parameter TIME_20MS = 1000_000;
reg[19:0] cnt;//20ms计数器
wire add_cnt;//计数开始
wire ent_cnt;//计数终止
wire nedge;//下降沿检测

reg[3:0] key_in_r0;//同步key_in输入信号
reg[3:0] key_in_r1;//延迟一个周期
reg[3:0] key_in_r2;//延迟两个周期

reg flag;//消抖开始标志信号

//计数器模块,当addent满足时开始计数,检测到下降沿重新计数,end_ent满足时停止计数,消抖完成
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
       cnt<=20'd0;
    end
    else if(add_cnt)begin
        if(ent_cnt)begin
            cnt<=20'd0;
        end
        else if(nedge)begin
            cnt<=20'd0;
        end
        else begin
            cnt<=cnt+1;
        end
    end
    else begin
        cnt<=cnt;
    end
end

assign add_cnt = flag;//计数开始条件
assign end_cnt = (cnt == TIME_20MS - 1)&&add_cnt;//终止结束条件,当满足计时到20ms,且满足计时条件时成立

//信号延时模块
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        key_in_r0<=4'b1111;
        key_in_r1<=4'b1111;
        key_in_r2<=4'b1111;
    end
    else begin
        key_in_r0<=key_in;
        key_in_r1<=key_in_r0;
        key_in_r2<=key_in_r1;
    end
end

//检测下降沿,当任意一个按键出现下降沿都会被检测到
assign nedge = (~key_in_r1[0]&key_in_r2[0])||(~key_in_r1[1]&key_in_r2[1])||(~key_in_r1[2]&key_in_r2[2])||(~key_in_r1[3]&key_in_r2[3]);

//消抖开始模块
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
       flag<=1'b0;
    end
    else if(nedge)begin//当出现下降沿开始消抖
        flag<=1'b1;
    end
    else if(end_cnt)begin//当end_cnt满足时停止消抖
        flag<=1'b0;
    end
    else begin
        flag<=flag;
    end
end

//输出信号赋值模块,当消抖完毕标志按键按下,出现一个脉冲信号表示按键按下
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
       key_out<=4'b1111;//默认为高电瓶
    end
    else if(end_cnt)begin
        key_out<=key_in;//稳定信号赋值
    end
    else begin
       key_out<=4'b1111;//其他信号默认为高电平
    end
end

endmodule
module key_top(
    input wire clk,
    input wire rst_n,
    input wire[3:0] key,

    output wire[3:0] led
);
wire[3:0] key_r;

key_debounce inst_key_debounce (
	.clk(clk), 
	.rst_n(rst_n), 
	.key(key), 
	.key_r(key_r));
key_led inst_key_led (
	.clk(clk), 
	.rst_n(rst_n), 
	.key(key_r), 
	.led(led));

endmodule

三、仿真代码

module key_top_tb();
reg clk;
reg rst_n;
reg[3:0] key;
wire[3:0] led;
wire[3:0] key_r;

parameter SYS_CLK = 20;
parameter TIME = 100;
always #(SYS_CLK/2) clk = ~clk;
initial begin
	clk=1'b0;
	rst_n=1'b0;
	#(2*SYS_CLK);
	rst_n=1'b1;
	key = 4'b1111;
	#(2*SYS_CLK);
	repeat (19) begin
   		key[0] = ~key[0];
   		#(2*SYS_CLK);
	end
	key[0] = 1'b0;
	#(400*SYS_CLK);
	$stop;
end
key_debounce #(.TIME_20MS(TIME)) inst_key_bounce (
	.clk(clk), 
	.rst_n(rst_n), 
	.key(key), 
	.key_r(key_r));

key_led #(.TIME_0_2S(TIME)) inst_key_led (
	.clk(clk), 
	.rstn(rstn), 
	.key(key), 
	.led(led));


endmodule

四、仿真结果

按键控制led变化,fpga开发

五、总结

总的来说编写不算复杂,需要注意的是模块之间的连接和按键消抖模块文章来源地址https://www.toymoban.com/news/detail-599472.html

到了这里,关于按键控制led变化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA/Verilog HDL/AC620零基础入门学习——第一个项目按键控制LED

    最近要考试了,所以我赶紧补习FPGA,我们用的是小梅哥的AC620开发板,软件是Quartus。推荐看这个视频教程:零基础轻松学习FPGA,小梅哥FPGA设计思想与验证方法视频教程 用按键控制LED灯的亮灭就是一个二选一多路器,两个IO,a、b,可以是高电平,也可以是低电平。 输入按键

    2024年02月05日
    浏览(43)
  • 按键控制 LED 实验

    目录 1 按键简介 2 实验任务 3 硬件设计 4 程序设计 5 下载验证         按键开关是一种电子开关,属于电子元器件类。         轻触式按键         自锁式按键         使用底板上的 PL_KEY0 和 PL_KEY1 按键来控制底板上的 PL_LED0 和 PL_LED1 两个 LED 的闪烁方式。没有

    2024年02月11日
    浏览(30)
  • 按键控制LED闪烁实验

    实验任务: 本节实验任务是使用底板上的PL_KEY0和PL_KEY1按键来控制底板上的PL_LED0和PL_LED1两个LED的闪烁方式。没有按键按下时,两个LED保持常亮;如果按键0按下,则两个LED交替闪烁;如果按键1按下,则两个LED同时闪烁。 模块示意图:   模块代码实现: modulekey_led( input     

    2024年02月04日
    浏览(35)
  • SoC-按键控制led

    1.hps_0.h 2.main.c SoC

    2024年02月10日
    浏览(30)
  • 独立按键控制led灯

    今天,我们来学习关于独立按键来控制led灯的知识。 1.独立按键控制led灯亮灭 首先是来用一个独立按键控制一个led灯的亮灭。其中独立按键由P3表示,其具体电路图如下                     其中第一个按键为P3_1,第二个按键为P3_0,第三个按键为P3_2,第四个按键为P3_3,很明

    2024年02月08日
    浏览(37)
  • 触摸按键控制LED灯

    目录 1.理论 2.代码 2.1 touch_ctrl_led.v 2.2 tb_touch_ctrl_led 以上的波形图的touch_flag是采用组合逻辑的方式产生的。 以上的touch_flag是采用时序逻辑产生的,时序逻辑会延迟一拍。 以上是上升沿和下降沿的组合逻辑和时序逻辑实现,逻辑或的写法刚好是逻辑与的两个寄存器的值反过来

    2024年01月23日
    浏览(40)
  • 【stm32----按键中断实验,按键控制LED灯】

    1、按下KEY1,LED1亮,再次按下KEY1,LED1灭; 2、按下KEY2,LED2亮,再次按下KEY2,LED2灭; 3、按下KEY3,LED3亮,再次按下KEY3,LED3灭; 一、头文件 1、gpio.h 2、key.h 二、初始化函数及功能函数 1、gpio.c 2、key.c 三、中断处理函数 do_irq.c 四、主函数 main.c 依次按下key3、key2、key1、key2

    2024年02月04日
    浏览(41)
  • STM32按键控制LED

    1.利用模块化编程对LED 2.设置LED的几种状态(亮,灭,和利用按键反转电平) 3.按键 (1)按键初始化 (2)如果按键按下做什么(这里是控制LED) 4,主函数

    2024年02月12日
    浏览(33)
  • 驱动——按键中断控制LED灯实验

    要求:按键按一下灯亮,再按一下灯灭 注:由于开发板位置,为了方便一一对应观察,采用key1控制LED3,key2控制LED2,key3控制LED1 0、添加相关设备树节点信息 ①按键相关引脚,通过原理图可得: key1------gpiof9; key2------gpiof7; key3------gpiof8 ②LED灯相关引脚: led1-----gpioe10; led2---

    2023年04月18日
    浏览(26)
  • FPGA实战-----点灯大师(1)led灯闪烁流水跑马+按键

    FPGA实战 用verliog语言点亮FPGA开发板上的led灯是最最最最最基础的操作。 这里用的EP4CE6F17C8开发板,上边一共有四个led灯珠,可以实现简单的例如4个全亮,流水灯,跑马灯以及相比之下难了一点的呼吸灯等等等等效果。 本文最终目的就是实现 用按键切换led灯的运动模式 。做

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包