【FPGA】按键消抖

2023-05-16

文章目录

  • 一、按键消抖概述
    • 1、为何要进行按键消抖
    • 2、消抖的方式
  • 二、系统设计
    • 1、系统模块划分
    • 2、系统时序图
  • 三、代码实现
    • 1、按键消抖模块(key_debounce)
    • 2、呼吸灯模块(led_breath)
    • 3、流水灯模块(led_waterfall)
    • 4、按键控制模块
    • 5、顶层文件
  • 四、效果展示
  • 五、仿真设计
    • 1、仿真文件
    • 2、波形图

一、按键消抖概述

1、为何要进行按键消抖

在这里插入图片描述

2、消抖的方式

在这里插入图片描述

二、系统设计

1、系统模块划分

在这里插入图片描述

按键和LED是不同的外设,这里划分模块时,可以将按键消抖设计为一个模块,LED控制设计为一个模块。当然,这个工程比较简单,可以将两者划分为一个模块。

2、系统时序图

在这里插入图片描述

三、代码实现

文件结构:
在这里插入图片描述

1、按键消抖模块(key_debounce)

/**
 *
 * 按键消抖模块
*/
module key_debounce(
    input   wire    clk,
    input   wire    rst_n,
    input   wire    key_in,  // 按键输入

    output   reg     key_out  // 消抖后的按键, 1为按下
);


    parameter TIME_DELAY = 1000_000;  // 延迟时间,20ms

    reg [19:0]   cnt_delay;  // 计数器
    wire         add_cnt;    // 是否计数
    wire         end_cnt;    // 是否完成一次计数

    reg          key_before;  // 前一个状态电平
    reg          key_now;     // 当前按键电平

    wire         flag_fall;   // 按下(开始抖动)标志
    reg          flag_timing;  // 在计时标志,1表示在(可)计时


    // 当前按键电平设置
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_now <= 1'b1;
        else
            key_now <= key_in;
    end

    // 前一个按键状态电平设置
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_before <= 1'b1;
        else
            key_before <= key_now;
    end

    // 前一状态为1,后一状态为0,开始抖动
    assign flag_fall = key_before & (~key_now);


    // 计时标志判断
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            flag_timing <= 1'b0;
        else if (flag_fall) // 开始计时
            flag_timing <= 1'b1;
        else if (end_cnt)  // 计时结束
            flag_timing <= 1'b0;
    end



    // 计数器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt_delay <= 20'd0;
        else if (add_cnt) begin   // 计数
            if (end_cnt)
                cnt_delay <= 20'd0;
            else
                cnt_delay <= cnt_delay + 1'd1;
        end
    end

    assign add_cnt = flag_timing;  // 在计时状态 计时
    assign end_cnt = ((cnt_delay==TIME_DELAY) && add_cnt);  // 计时结束标志




    // 消抖后的按键
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            key_out <= 1'b0;
        else if (end_cnt)
            key_out <= ~key_now;
        else
            key_out <= 1'b0;
    end
    



endmodule

2、呼吸灯模块(led_breath)

/**
 *
 * 呼吸灯
*/
module led_breath(
    input   wire        clk,
    input   wire        rst_n,
    input   wire        flag_state_change,  // 状态切换标志

    output  reg[3:0]    led_b
);


    parameter TIME_US = 50;  // 1us (微秒)
    parameter TIME_MS = 1000;  // 1000次us --- 1ms
    parameter TIME_S = 1000; // 1000次毫秒 --- 1s

    // 信号定义
    reg [5:0]     cnt_us; // 微秒计数器
    reg [9:0]    cnt_ms; // 毫秒计数器
    reg [9:0]     cnt_s;  // 秒计数器

    wire add_cnt_us;
    wire end_cnt_us;
    wire add_cnt_ms;
    wire end_cnt_ms;
    wire add_cnt_s;
    wire end_cnt_s;

    reg flag;  // 满1s时,flag取反, flag 为0 时由灭变亮,flag为1时由亮变灭

    // us计数器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt_us <= 6'd0;
        else if (flag_state_change)
            cnt_us <= 6'd0;
        else if (add_cnt_us) begin
            if (end_cnt_us)
                cnt_us <= 6'd0;
            else 
                cnt_us <= cnt_us + 1'd1;
        end
    end


    assign add_cnt_us = 1'b1;
    assign end_cnt_us = ((cnt_us==TIME_US-1) && add_cnt_us);


    // ms 计数器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt_ms <= 10'd0;
        else if (flag_state_change)
            cnt_ms <= 6'd0;
        else if (add_cnt_ms) begin
            if (end_cnt_ms)
                cnt_ms <= 10'd0;
            else if(end_cnt_us) // 每1us,+1
                cnt_ms <= cnt_ms + 1'd1;
        end
    end


    assign add_cnt_ms = 1'b1;
    assign end_cnt_ms = ((cnt_ms==TIME_MS-1) && add_cnt_ms);


    // s 计数器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt_s <= 10'd0;
        else if (flag_state_change)
            cnt_s <= 6'd0;
        else if (add_cnt_s) begin
            if (end_cnt_s)
                cnt_s <= 10'd0;
            else if(end_cnt_ms) // 每1ms,+1
                cnt_s <= cnt_s + 1'd1;
        end
    end


    assign add_cnt_s = 1'b1;
    assign end_cnt_s = ((cnt_s==TIME_S-1) && add_cnt_s);


    // flag判断
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            flag <= 1'b0;
        else if (flag_state_change)
            flag <= 1'b0;
        else if(end_cnt_s)
            flag <= ~flag;
    end

    
    // led判断
    // flag 为0 时由灭变亮,flag为1时由亮变灭
    integer i;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led_b <= 4'b0000;
        else if (flag_state_change)
            led_b <= 4'b0000;
        else begin
            led_b <= {4{(cnt_s > cnt_ms) ? ~flag : flag}};
        end
    end









endmodule

3、流水灯模块(led_waterfall)

/**
 *
 * 流水灯模块
*/
module led_waterfall(
    input   wire        clk,
    input   wire        rst_n,
    input   wire        flag_state_change,  // 状态切换标志

    output  reg[3:0]    led_w
);


    parameter T_WATER = 25'd24_999_999;  // 一个变化时间--0.5s

    reg [24:0]  cnt_period;  // 周期计时器
    wire    add_cnt;
    wire    end_cnt;

    // 计时器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt_period <= 25'd0;
        else if (flag_state_change)  // 状态切换时,从头开始
            cnt_period <= 25'd0;
        else if (add_cnt) begin
            if (end_cnt)
                cnt_period <= 25'd0;
            else
                cnt_period <= cnt_period + 1'd1;
        end
    end

    assign add_cnt = 1'b1;
    assign end_cnt = ((T_WATER==cnt_period) && add_cnt);


    // 流水灯输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led_w <= 4'b0001;
        else if (flag_state_change) // 切换状态,从头开始
            led_w <= 4'b0001;
        else if (end_cnt)
            led_w <= {led_w[2:0], led_w[3]};
        else
            led_w <= led_w;
    end





endmodule

4、按键控制模块

/**
 *
 * 按键控制模块
*/
module led_control(
    input   wire            clk,
    input   wire            rst_n,
    input   wire[1:0]       key,  // 1为按下

    output  reg[3:0]        led  // LED, 1为亮
);


    // LED两种状态
    parameter WATERFALL_LIGHT = 0; // 流水灯
    parameter BREATH_LIGHT = 1;    // 呼吸灯

    reg led_state = WATERFALL_LIGHT;  // LED状态,初始为流水灯
    reg flag_state_change;  // 状态切换标志

    /* 按键改变LED状态,
       key[0] 为流水灯
       key[1] 为呼吸灯
    */
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led_state <= WATERFALL_LIGHT;
        else if (key[0]) begin
            led_state <= WATERFALL_LIGHT;
            flag_state_change = 1'b1;
        end
        else if (key[1]) begin
            led_state <= BREATH_LIGHT;
            flag_state_change = 1'b1;
        end
        else begin
            led_state <= led_state;
            flag_state_change <= 1'b0;
        end
    end


    wire[3:0] led_w;
    wire[3:0] led_b;


    led_waterfall u_led_waterfall(
        .clk                    (clk),
        .rst_n                  (rst_n),
        .flag_state_change      (flag_state_change),  // 状态切换标志

        .led_w                  (led_w)
    );

    led_breath u_led_breath(
        .clk                    (clk),
        .rst_n                  (rst_n),
        .flag_state_change      (flag_state_change),  // 状态切换标志

        .led_b                  (led_b)
    );



    // led输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led <= 4'b1111;
        else if (led_state == WATERFALL_LIGHT)
            led <= led_w;
        else if (led_state == BREATH_LIGHT)
            led <= led_b;
        else
            led <= led;
    end

5、顶层文件

/**
 *
 * 顶层文件
*/
module led_control_top(
    input   wire        clk,
    input   wire        rst_n,
    input   wire[1:0]   key_in,

    output  wire[3:0]   led
);


    wire [1:0] key;  // 消抖后的key

    // 按键消抖模块实例化
    key_debounce k0(
        .clk            (clk),
        .rst_n          (rst_n),
        .key_in         (key_in[0]),  // 按键输入
    
        .key_out        (key[0])  // 消抖后的按键, 1为按下
    );
    key_debounce k1(
        .clk            (clk),
        .rst_n          (rst_n),
        .key_in         (key_in[1]),  // 按键输入
    
        .key_out        (key[1])  // 消抖后的按键, 1为按下
    );



    // led控制模块实例化
    led_control u_led_control(
        .clk            (clk),
        .rst_n          (rst_n),
        .key            (key),  // 1为按下

        .led            (led)  // LED, 1为亮
    );










endmodule

四、效果展示

按键消抖控制LED

五、仿真设计

1、仿真文件

/**
 *
 * 仿真文件
*/
`timescale 1ns/1ps
module led_control_top_tb;

    reg          tb_clk;
    reg          tb_rst_n;
    reg [1:0]    tb_key_in;

    wire [3:0]   tb_led;

    parameter CYCLE = 20;  // 时钟周期
    // 修改消抖持续时间
    defparam test_led_control_top.k0.TIME_DELAY = 10;
    defparam test_led_control_top.k1.TIME_DELAY = 10;
    // 修改呼吸灯周期
    defparam test_led_control_top.u_led_control.u_led_breath.TIME_US = 5;
    defparam test_led_control_top.u_led_control.u_led_breath.TIME_MS = 5;
    defparam test_led_control_top.u_led_control.u_led_breath.TIME_S = 5;
    // 修改流水灯周期
    defparam test_led_control_top.u_led_control.u_led_waterfall.T_WATER = 5;


    // 时钟变化
    always #(CYCLE/2) tb_clk = ~tb_clk;


    // 初始化
    integer i,j;
    initial begin
        tb_clk = 1'b1;
        tb_rst_n = 1'b0;
        tb_key_in = 2'b11;
        #(CYCLE * 10);
        tb_rst_n = 1'b1;
        #(CYCLE * 100);   // 默认为流水灯

        // 按下key1,切换为呼吸灯
        for (i=0 ;i<5; i=i+1) begin
            tb_key_in[1] = {$random};
            j = {$random}%20;  // 按键产生的时差
            #(CYCLE * j);

        end
        tb_key_in = 2'b11;


        #(CYCLE *120);
        // 按下key0,切换为流水灯
        for(i= 0; i<5; i=i+1) begin
            tb_key_in[0] = {$random};
            j = {$random}%20;
            #(CYCLE * j);
        end
        tb_key_in = 2'b11;
        #(CYCLE *120);
        $stop;


    end




    // 模块实例化
    led_control_top test_led_control_top(
        .clk        (tb_clk),
        .rst_n      (tb_rst_n),
        .key_in     (tb_key_in),

        .led        (tb_led)
    );









endmodule

2、波形图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【FPGA】按键消抖 的相关文章

  • FPGA笔记8——串口通信(回环实验)

    目录 串口通信原理 串行通信基础知识 处理器与外部设备通信的两种方式 串行通信的通信方式 串行通信的传输方向 常见的串行通信接口 异步串口通信UART基础知识 数据格式 传输速率 接口标准 RS232接口 串口通信实验RS 232 实验任务
  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • Xilinx ISE系列教程(9):LabTools下载、安装、使用教程(独立的下载工具)

    文章目录 1 ISE Vivado LabTools简介 2 ISE 14 7 Lab Tools下载 安装 3 Vivado 2018 3 LabTools下载 安装 1 ISE Vivado LabTools简介 Xilinx LabT
  • 2022芯原芯片设计 笔试题分析和讨论

    2022芯原设计笔试题分析和讨论 以下仅为个人理解和分析 不保证正确 欢迎大家发表自己的想法 讨论出正确答案 企业知识题 1 1 D 芯原的主要经营模式为芯片设计平台即服务 Silicon Platform as a Service SiP
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag
  • 八段数码管动态显示(输入数据为BCD编码)

    八段数码管动态显示 输入数据为BCD编码 一 数码管概述 图1 八段共阴数码管内部等效原理图 图2 八段共阳数码管内部等效原理图 上面两图分别是对应八段共阴 共阳的数码管内部等效图 共阴是将八个LED数码管的阴极连接在一起接低 阳极segm
  • JESD204B(RX)协议接口说明。

    解释一下Vivado IP协议中的Shared Logic in Example 与 Shared Logic in Core 首先 什么是Shared Logic 字面意思很好理解 就是共享逻辑 主要包括时钟 复位等逻辑 当选择Share
  • 【数字IC】从零开始的Verilog SPI设计

    从零开始的Verilog SPI协议设计 一 写在前面 1 1 协议标准 1 2 数字IC组件代码 1 3 设计要求 1 4 其他协议解读 1 4 1 UART协议 1 4 2 SPI协议 1 4 3 I2C协议 1 4 4 AXI协议 二
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • FPGA功耗估计(二)

    针对于Altera的Cyclone III 做出了静态功耗 对于Altera 其提供了一个功耗早期估计工具 可以在官网上下到 首先需要将宏设置为安全 在excel选型中选择文件 之后便可看到 根据相应的选择 红框部分 可以查看静态功耗 对于
  • [从零开始学习FPGA编程-38]:进阶篇 -语法-函数与任务

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 什么是函数Function 1 1 什么是函数 1 2 函
  • Spartan-3E 上的随机数生成

    我需要在 Spartan 3E FPGA 上为我的遗传算法生成伪随机数 并且我想在 verilog 中实现它 您能给我任何关于此的指示吗 当然 Adam 的随机生成器是不可合成的 您必须显式创建一个LFSR 以下示例可能会有所帮助 它是一个
  • 64 位 ALU 输出在 TestBench 波上显示高阻抗

    我必须制作一个 64 位 ALU 它接受 A 和 B 64 位输入 进位输入输入并输出 64 位结果以及 1 位进位输出 还有一个 5 位功能选择 FS 其中 FS 0 控制 B 是否反转 使用 2to1 多路复用器 F 1 对 A 执行相
  • 用python接收高速率的UDP数据包

    我正在使用 python 来从 FPGA 接收 UDP 数据包流 并尝试丢失尽可能少的数据包 数据包速率从大约 5kHz 到一些 MHz 我们希望在特定时间窗口 代码中的 acq time 内获取数据 我们现在有这样的代码 BUFSIZE
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • UIO 设备上的 mmap EINVAL 错误

    在尝试使用 UIO 而不是直接映射后 我在 Xilinx Zynq 上映射物理内存时遇到问题 dev mem 虽然计划是以普通用户身份运行应用程序 而不是root这仍在运行root 显然 第一个映射成功 其余映射到同一个文件描述符12 de
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更
  • 可以购买哪些 FPGA(现场可编程门阵列)在家中进行实验? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 什么是 FPGA 在哪里可以买到 它们要花多少钱 您需要什么样的系统来试验它们 如何对它们进行编程 如果这是正确的术语 您能否使用普通 M

随机推荐

  • MATLAB(一)基本操作与矩阵输入

    文章目录 前言一 Matlab视窗二 基本操作与矩阵输入1 把MATLAB当做计算机2 初等数学函数Exercise练习 2 嵌入函数3 特殊变量和常量4 MATLAB调用优先5 数字显示格式长Exercise练习 6 命令行终端7 部分函
  • MATLAB(六)图形界面_GUI_程式设计

    文章目录 前言MATLAB GUI Programs启动GUI程序对齐组件给按钮标上标签GUI脚本结构function untitled OpeningFcn对象的回调Set the axes for PlottingExercise练习P
  • Excel 精选28个技巧

    文章目录 前言1 一键求和2 一键插入柱形图3 单元格内强制换行4 快速移动资料5 快速生成下拉式功能表6 计算带单位的数据7 小写金额转大写8 快速输入 9 批量添加下划线10 文字随单元格大小变化11 图片随单元格大小变化12 快速提取
  • 调度算法——时间片轮转、优先级、多级反馈队列(例题详细!!!)

    文章目录 前言知识总览时间片轮转 xff08 RR Round Robin xff09 优先级调度算法多级反馈队列调度算法知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记 xff0c 大部分图片都是课件老师的PPT xff0c
  • 生产者-消费者问题(有例题!!!)

    文章目录 前言问题描述如何实现思考 xff1a 能否改变相邻P V操作的顺序 知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记 xff0c 大部分图片都是课件老师的PPT xff0c 方便复习用 此篇文章仅供学习参考 提示 xf
  • 计算机网络习题——循环冗余校验

    3 07 要发送的数据为1101011011 采用CRC的生成多项式是 P X 61 X 4 43 X 43 1 试求应添加在数据后面的余数 xff08 1 xff09 若要发送的数据在传输过程中最后一个1变成了0 xff0c 即变成了11
  • 计算机网络课后答案(谢希仁第八版)

    计算机网络课后答案 谢希仁第八版
  • linux系统 删除文件命令

    Linux系统下删除文件是一个非常高频的需求 xff0c 几乎每天都会遇到 xff0c 所以rm命令是一个非常常用Linux命令 rm命令是英文单词 remove 的缩写 xff0c 它主要作用是 xff1a 1 删除文件 xff1b 2
  • 常见的HTTP状态码列表

    HTTP状态码列表 状态码 状态码英文名称 中文描述 1xx xff08 信息性状态码 xff09 xff1a 请求已被接受 xff0c 需要继续处理 100 Continue 继续 客户端应继续其请求 101 Switching Prot
  • 二进制的加减法_二进制加减法

    二进制的加减法 1 二进制加法 1 Binary Addition Since binary numbers consist of only two digits 0 and 1 so their addition is different
  • SQL注入攻击方法

    SQL注入攻击是一种利用Web应用程序中存在的安全漏洞 xff0c 通过在输入框中插入恶意的SQL代码 xff0c 从而实现对数据库的非法操作 以下是一些常见的SQL注入攻击方法 xff1a 使用单引号 xff08 39 xff09 进行字
  • 利用Python+selenium技术,实现浏览器基本操作详解,代码有详细注释

    首先 xff0c 需要安装selenium库和对应的浏览器驱动程序 以Chrome浏览器为例 xff0c 可以使用以下命令安装selenium和chromedriver xff1a pip install selenium 然后 xff0c
  • &和&&的区别(简单易懂)

    amp xff08 按位与 xff09 和 amp amp xff08 逻辑与 xff09 的区别如下 xff1a 1 amp amp 具有短路功能 xff0c 而 amp 不具有短路功能 2 当 amp 运算符两侧的表达式的结果均为真时
  • Spring框架学习笔记

    一 什么是Spring框架 Spring框架是由于软件开发的复杂性而创建的 Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情 然而 xff0c Spring的用途不仅仅限于服务器端的开发 从简单性 可测试性和松耦
  • 人工智能——DBSCAN密度聚类(Python)

    目录 1 概述 1 1 概念 1 2 DBSCAN数据点分类 2 DBSCAN算法流程 2 1 DBSCAN算法流程 xff1a 2 2 举例 3 案例1 xff08 Python实现 xff09 3 1 案例 3 2 Python实现 3
  • @RequestMapping的参数和用法

    在Spring MVC 中使用 64 RequestMapping 来映射请求 xff0c 也就是通过它来指定控制器可以处理哪些URL请求 xff0c 相当于Servlet中在web xml中配置 源码 xff1a 该注解说明可以在类和方法
  • Linux 实验:记录型信号量 生产者-消费者问题详解

    进程同步问题是一个非常重要且相当有趣的问题 xff0c 因而吸引了很多学者对他进行研究 本文就选取其中较为代表性的生产者 消费者问题来进行学习 xff0c 以帮助我们更好的理解进程同步的概念及实现方法 一 问题描述 有一群生产者进程在生产产
  • Linux C语言线程解决生产者与消费者

    前言 生产者 消费者模式 xff0c 生产者这边负责生产产品 而消费者负责消费产品 xff0c 对于消费者来说 xff0c 没有产品的时候只能等待产品出来 xff0c 有产品就使用它 这里我们使用一个变量来表示这个这个产品 xff0c 生产
  • Mariadb

    文章目录 1 数据库的介绍2 mariadb的安装与开启3 软件基本信息4 数据库的安全初始化4 1 执行安全初始化脚本4 2 关闭数据库开放端口 5 数据库的基本管理5 1查看5 2新建5 3更改5 4备份与删除 6 数据库密码管理6 1
  • 【FPGA】按键消抖

    文章目录 一 按键消抖概述1 为何要进行按键消抖2 消抖的方式 二 系统设计1 系统模块划分2 系统时序图 三 代码实现1 按键消抖模块 xff08 key debounce xff09 2 呼吸灯模块 xff08 led breath x