代码编织梦想

实验任务:按键按下切换蜂鸣器开关状态

 

module key_debounce(
    input      clk,
     input      rst_n,
     
     input      key,
     output reg key_value,
     output reg key_flag
);

reg key_reg;  //存储按键状态的寄存器,用来判别按键是处于消抖起始时间点
reg [19:0]delay_cnt; //用来延时的计数器

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)begin  //复位信号生效
      key_reg <= 1'b1; //寄存器里存储嘎电平,也就是没按下是的电平
      delay_cnt <= 20'd0; //计数器清零
    end
    else begin
      key_reg <=key;   //存储现在的按键值
      if(key!=key_reg)  //如果按键状态发生变化
         delay_cnt <= 20'd1000_000;  //计数值满载开始倒计时
         else begin  //还没有到开始消抖的时间点
          if(delay_cnt > 20'd0)  //已经满载了
             delay_cnt <= delay_cnt - 1;  //开始倒计时
          else
             delay_cnt <= 20'd0; //根本就没到时间,保持原样
         end 
    end
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)begin  //复位信号生效
      key_value <= 1'b1;  //初始没按下默认为高电平
      key_flag <= 1'b0;   //消抖标志默认为零
    end
    else begin
      if(delay_cnt == 20'd1)begin  //倒计时结束 为了和初始的0区分开来
         key_flag <= 1'b1;  //消抖完成,标志为1
          key_value <= key;  //小豆成功的按键值取出
      end
      else begin  //倒计时没有结束
         key_flag <= 1'b0;  //完成标志位还是为0
          key_value <= key_value; //按键值保持不变
      end
    end
end

endmodule

module beep_control(
         input        clk,
          input        rst_n,
            
            input        key_flag,
            input        key_value,
            output reg   beep
);
always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
      beep <= 1'b1;  //初始为鸣叫状态
    else 
      if(key_flag&(~key_value))  //消抖标志为1且按键被按下
         beep<=~beep;
      else
         beep = beep;

end
endmodule

module top_key_beep(
    input      clk,
     input      rst_n,
     
     input      key,
     output     beep
);

wire key_value;
wire key_flag;

 key_debounce u_key_debounce(
    .clk       (clk),
     .rst_n     (rst_n),
     
     .key       (key ),
     .key_value (key_value),
     .key_flag  (key_flag)
);

 beep_control u_beep_control(
         .clk         (clk ),
          .rst_n       (rst_n ),
            
            .key_flag    (key_flag),
            .key_value   (key_value),
            .beep        (beep)
);

endmodule

本次模块中比较重要的在于消抖模块,消抖模块的思路就是首先判断开始消抖的时间,等消抖点开始倒计时开始然后倒计时结束之后,判断消抖值,产出消抖标志,输送给下一个模块。

1.需要注意的是不是所有的if后面都要加begin和end但是比begin和end的是在同一个操作内进行的不能横跨多个,除非是always后面的begin和end。

2.对于头文件的例化可以选择输出生成新模块,在PDF头文件里面进行操作,也可以将各模块的输入输出全部复制到头文件里面之后进行相应的操作,首先删去定义module这个单词,然后把所有的input和output换成点。再把相应的输入进来的信号放在括号里面,跟在原变量之后,如果它只是中间的寄存器变量,那么需要在头文件里面进行wire变量的定义之后再进行例化,最后把头文件设置成顶层文件进行编译。

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

i.mx6ull裸机——GPIO中断-爱代码爱编程

1. 中断向量表 中断向量表是一个表,这个表里面存放的是中断向量。中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。 这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的,当某个中断被触发以后就会自动跳转到中断向量表中对应的中断服务程序(函数)入口地址处。 中断向量表在整个程序的

p1口实验_「正点原子NANO STM32开发板资料连载」第二章 实验硬件资源详解-爱代码爱编程

1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微信号公众号,获取更多资料:正点原子 第二章 实验平台硬件资源详解 本章,我们将节将向大家详细介绍 ALIENTEK NANO STM32F411 各部分的硬件原理图,让大家对该开发板的各部分硬

【正点原子Linux连载】第十七章GPIO中断试验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0-爱代码爱编程

1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:93544674

【正点原子MP157连载】第四章 ATK-STM32MP157功能测试-摘自【正点原子】STM32MP157快速体验-爱代码爱编程

第四章 ATK-STM32MP157功能测试 **4.1 LED测试、蜂鸣器测试****4.3 LCD测试****4.4 串口测试****4.5 USB测试****4.6 网络测试****4.7 CAN****4.8 RTC时钟测试****4.9 AP3216C测试****4.10 ICM20608测试****4.11 音频测试*****4.12

正点原子STM32F103(精英版)------蜂鸣器-爱代码爱编程

配合正点原子视频(工程新建与路径加入省略) 蜂鸣器硬件连接: 图中我们用到一个 NPN 三极管( S8050 )来驱动蜂鸣器 R33 主要用于防止蜂鸣器的误发声。 当 PB.8 输出 高电平的时候,蜂鸣器将发声, 当 PB.8 输出低电平的时候,蜂鸣器停止发声。 一.库函数版本  1.蜂鸣器实验步骤 使能IO口时钟。调用函数 RCC_

hal库:STM32CubeMX配置与使用(含Free RTOS)-爱代码爱编程

硬件:正点原子STM32F103ZET6 (一 )基础配置 1.必须配置: ①配置板子型号/封装: ②配置时钟:外部晶振 ③配置时基:串行总线调试(否则只能下载一次)、系统滴答定时器 ④配置时钟树:HCLK输入72MHZ主频,回车自动分配时钟树 ⑤配置工程名/IDE: ⑥配置分离.c/.h文件:

基于STM32的RTOS教程——RT-Thread学习教程-爱代码爱编程

下面所有资料都是转载整理于:https://www.rt-thread.org/document/site/#/ 文章目录 新手指导版本简介学习路线入门学习无RTOS经验模拟运行快速上手内核学习有RTOS经验快速上手编程指南[API 手册](https://www.rt-thread.org/document/site/#/other/novic

dsp28335 红外遥控改变led状态等实现其他功能_在校大二电信小洋洋的博客-爱代码爱编程

开发环境ccs6.0版本以上 正点原子stm320 F28335开发板  红外遥控器:    实现功能: // 远程遥控系统通过红外遥控器对板载资源进行控制。 //按下“1”时,LED快速闪烁。 //按下“2”时,LED慢速闪烁。 //按下“3”时,蜂鸣器鸣叫。 //按下“4”时,LED呈现呼吸灯效果。 //按下“5”时,数码管从10s开始倒计时

基于fpga的udp 通信(六)-爱代码爱编程

引言 前文链接: 基于FPGA的UDP 通信(一) 基于FPGA的UDP 通信(二) 基于FPGA的UDP 通信(三) 基于FPGA的UDP 通信(四) 基于FPGA的UDP 通信(五) 本文基于FPGA和MATLAB对千兆以太网通信模块UDP数据发送(FPGA发送)进行联合调试。 设计条件 FPGA芯片:xc7a35tfgg48

fpga dir-爱代码爱编程

Build instructions Source code The source code for the reference designs is managed on this Github repository: GitHub - fpgadeveloper/fpga-drive-aximm-pcie: Example designs for

uvm实战笔记(七)-爱代码爱编程

第七章. UVM中的寄存器模型 7.1 寄存器模型简介 7.1.1 带寄存器配置总线的DUT 本章节使用的DUT带寄存器配置,代码如下: module dut(clk, rst_n,

笔试题-2023-泰凌微-数字ic设计【纯净题目版】-爱代码爱编程

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.07.24 应聘岗位:数字IC设计 题目评价 难易程度:

笔试题-2023-华为-数字芯片【纯净题目版】-爱代码爱编程

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.07.29 应聘岗位:数字IC设计 题目评价 难易程度:

嵌入式串行通信协议-爱代码爱编程

嵌入式系统中,不同芯片之间通常使用串行总线的方式进行连接,根据器件行业规范、应用场景,不同芯片通常选择不同的串行通信接口进行通信。常用的串行通信接口有:1-Wire、I2C、SPI、UART。 一、1-Wire 1-wi

芯片设计|fpga 设计的指导原则(一)-爱代码爱编程

这一部分主要介绍 FPGA/CPLD 设计的指导性原则,如 FPGA 设计的基本原则、基本设计思想、基本操作技巧、常用模等。 FPGA/CPLD 设计的基本原则、思想、技巧和常用模块是一个非常大的问题,在此不可能面面俱到,只

46、linux开发笔记(主线更新)_linux 主线-爱代码爱编程

一、安装Vmware16 1.1、Vmware16的下载 1.2、Vmware16的安装 二、安装Ubuntu20 2.1、Ubuntu20的下载 2.2、Ubuntu20的安装 1、新建一个文件夹并把下载好的Ubuntu20镜像放在里面 2、打开Vmware并新建虚拟机 2.3、