代码编织梦想

顶层模块

module key_filter_led
 (
    input wire CLK,
    input wire RST,
    
    input wire KEY,
    
    output wire [3:0] LED
  );

//wire FLAG;
wire KEY_VALUE;

key_filter u_key_filter
(
   .clk      (CLK),
   .rst      (RST),
            
   .key      (KEY),
  // .flag     (FLAG),//判断
   .key_value(KEY_VALUE) //消抖后的key

);

led u_led
(
   . clk     (CLK),
   . rst     (RST),
   //.flag     (FLAG),
   .key_value(KEY_VALUE),
             
   . led     (LED)
);
endmodule

按键消抖模块

module key_filter
(
   input clk,
   input rst,
   
   input  wire key,
   //output reg flag,//判断
   output reg key_value //消抖后的key

);
parameter delay=20'd1_000_000;//10ms
reg [19:0] delay_cnt;//延时计数器
reg key_reg;//中间变量,存放当前按键信号的寄存器类型的值,用于和下一次信号按键的值作对比

always @(posedge clk or negedge rst)
   begin
     if(rst==1'b0)
       begin
         delay_cnt <=20'd0;
         key_reg   <=1'd1;    //初始化中间值   
       end
     else 
        begin
         key_reg <= key;
          if(key_reg !=key)//不等,此时有抖动
            delay_cnt <= delay;//开始倒计时,直到delay_cnt为零为止(开始进入延时消抖状态)
          else
            begin
              if(delay_cnt >20'd0)//如果延时延时寄存器大于0,说明延时未结束,继续倒计时
                delay_cnt<= delay_cnt -20'd1;
              else 
                delay_cnt<=20'd0;//如果延时计时器小于等于0,那么延时计时器归0,延时结束
            end
        end
   
   end
//根据延时寄存器获取key状态及其稳定的信号
always @(posedge clk or negedge rst)
    begin
      if(rst==1'b0)
        begin
        //  flag <= 1'b0;//抖动标志,初始化为0
          key_value    <=1'b1;//记录稳定信号,初始化为1,高电平有效      
        end
      else if(delay_cnt == 20'd1)
        begin
        // flag <= 1'b1;//已经消抖,延时计时器完成了,改变消抖状态为1
          key_value <= key;//key_value区key的稳定信号,
        end
      else
        begin
         // flag <= 1'b0;//消抖未完成,延时计时器未结束,flag仍为0
          key_value <= key_value;//消抖未完成,延时计时器未结束,key未进入稳定状态,key_value不计key的值,直到key稳定才计入
        end
    end
endmodule

小灯模块

module led
(
   input wire  clk,
   input wire  rst,
   //input flag,
   input key_value,
   
   output reg [3:0]  led
);
reg [25:0] cnt;
parameter T=26'd50_000_000;
always @(posedge clk or negedge rst)
    begin
       if(rst==1'b0)
         cnt<= 26'd0;
       else if(cnt == T-26'd1)
         cnt <=26'd0;
       else 
         cnt <= cnt + 26'd1;
    
    end
always @(posedge clk or negedge rst)
    begin
      if(rst==1'b0)
        begin
          led <= 4'b1110;
        end
      //else if(key_value == 1'b0)
      else 
        begin
         if(/* flag==1'b1 && */ (key_value==1'b0)&&(cnt == T-26'd1))  //已经消抖,且key信号稳定
            //led <= ~led;
            led <= {led[2:0],led[3]};
         else 
           //led <= 1'b1;
            
            led<=led;
        end        
    end


endmodule

上面小灯模块实现的为当按键按下,小灯现实右移

下面小灯模块是实现按键每按下一次,小灯向右移动一次,其中flag未注释,所以上面的顶层模块和按键消抖模块,都需要取消flag的注释

module led
(
   input wire  clk,
   input wire  rst,
   input flag,
   input key_value,
   
   output reg [3:0]  led
);
reg [25:0] cnt;
parameter T=26'd50_000_000;
always @(posedge clk or negedge rst)
    begin
       if(rst==1'b0)
         cnt<= 26'd0;
       else if(cnt == T-26'd1)
         cnt <=26'd0;
       else 
         cnt <= cnt + 26'd1;
    
    end
always @(posedge clk or negedge rst)
    begin
      if(rst==1'b0)
        begin
          led <= 4'b1110;
        end
      else if(flag==1'b1 &&key_value == 1'b0)
        
      /* else 
        begin
         if(/* flag==1'b1 &&  (key_value==1'b0)&&(cnt == T-26'd1))  //已经消抖,且key信号稳定
            //led <= ~led;*/
            led <= {led[2:0],led[3]}; 
         else 
           //led <= 1'b1;
            
            led<=led;
        //end        
    end


endmodule
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_61949778/article/details/129678110

【stm32学习】(4)按键控制流水灯-爱代码爱编程

学习单片机都要学习流水灯,因为流水灯比较简单,易于实现,效果也比较好呈现。 本次是通过按键控制流水灯,按键按一下启动流水灯,按键的使用,在单片机开发中是必不可少的。 这里我用的单片机型号为STM32F103VET 8个LED灯接在了PA口的低八位。 注意点: 1.开启GPIOA和GPIOB的时钟 2.设置GPIOA口的工作模式,和GPIOB口的

基于51单片机《按键控制流水灯》-爱代码爱编程

1.用4个LED灯发光二极管实现至少四种灯光效果 2.可以通过输入按键在几种灯光之间切换 3.可以通过暂停按键停止彩色灯光效果,使小灯全亮,再次按下按键后继续之前的效果 4.增加自动在几种效果间切换功能 原理图很简单,正常的最小系统,加上你需要的LED灯和按键,分别定义他们的引脚就可以了,最后把对应引脚改进程序就搞定。 #include"

独立按键控制流水灯方向_dream_begin_的博客-爱代码爱编程

控制流水灯方向,按独立按键1,流水灯向右移动;再按独立按键1,流水灯向左移动。 这是该工程所需要引的头文件。具体模板以及功能参考我之前发的文章 51单片机常用的一些模块(模块化编程)延时函数模块(delay)独立按键模块(key)数码管模块(Nixie)LCD1602模块矩形键盘模块定时器模块_Dream_begin_的博客-CSDN博客

cc2530开发-----按键控制流水灯暂停_.拾玖.的博客-爱代码爱编程

CC2530开发—按键控制流水灯 今天所要实现的效果如下 一、导入CC2530的包以及定义按键和LED的位置 #include "iocc2530.h" #define D3 P1_0 #define D4 P

keil5(按键控制流水灯)_cv搞机男的博客-爱代码爱编程_keil按钮控制灯

  前言 按键控制流水灯(正向,反向和暂停) 详细代码 main.c #include <REGX52.H> #include"Timer0Init.h" #include"key.h" #include<INTRINS.H> //函数库 unsigned char keynum,LED

51单片机按键控制流水灯_autumn_qyh的博客-爱代码爱编程

1、按键的使用 <1>独立按键的原理图 按键所对应的引脚为P3的0、1、2、3引脚口,并且这里总共有四个独立按键,它们公共的一段都接到了GND电源的负极。这样我们就知道按键上电的默认电平为高电平。所以我们只需要控制按键按下时给一个低电平0,不按下时默认高电平1就行。  <2>按键控制LED灯的亮灭 按键消抖:抖动是机械按

fpga基于riffa实现pcie采集ov5640图像传输,提供工程源码和qt上位机-爱代码爱编程

目录 1、前言2、RIFFA理论基础3、设计思路和架构4、vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取 1、前言 PCIE是目前速率很高的外部板卡与CPU通信的方案之一,广泛应用于电脑主

使用chatgpt写的串口模块,verilog实现-爱代码爱编程

还是很震撼的,仅供参考: 由于串口模块的具体实现方式与所用的FPGA设备和外设有关,因此无法提供通用的Verilog代码。以下是一个简单的示例,仅供参考。 module uart( input clk, // 时钟信号  input reset, // 复位信号  input tx_en, // 发送使能信号  input [7:0] tx_data,

stm32的按键控制流水灯_stm32按键控制流水灯-爱代码爱编程

对于stm32的设置首先是对时钟进行启动 要求:key0控制LED0和LED1的亮 key1控制LED0和LED1的亮 kw_up控制闪灯 led.c #include "led.h" #include "delay.h

按键控制流水灯(计时器)_p2=_crol_(p2,1);-爱代码爱编程

今天我们来了解并学会使用单片机的内部定时器  定时器最基本的功能就是计时,本次也是基于这个功能来实现流水灯,当然不同型号的单片机其内部计时器也是有些许差异的,基于本人的单片机型号的定时器配置如下  下面是定时器内部结构框图,从中可以很直观的看出定时器的工作原理  再使用定时器时我们首先要通过编程来对定时器的模式来进行配置,在STC中也为我