ZYNQ_project:key_beep

news2024/12/26 21:49:05

通过按键控制蜂鸣器工作。

模块框图:

时序图:

 

代码:

/*
    1位按键消抖
*/ 
module key_filter (
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,
    input       wire            key_in      ,

    output      reg             key_flag    
);
    // 参数定义
    parameter   MAX_CNT_10MS = 500_000  ;
    localparam  IDLE        = 4'b0001   ,
                FILTER_UP   = 4'b0010   ,
                SAMPLING    = 4'b0100   ,
                FILTER_BACK = 4'b1000   ;
    // reg signal define 
    reg                 key_in_r1 ;  
    reg                 key_in_r2 ;
    reg     [18:0]      cnt_core  ;
    reg     [3:0]       state_c   ;
    reg     [3:0]       state_n   ;
    // wire signal define 
    wire                nege      ;
    wire                pose      ;
    wire                IDLEtoFILTER_UP       ;
    wire                FILTER_UPtoIDLE       ;
    wire                FILTER_UPtoSAMPLING   ;
    wire                SAMPLINGtoFILTER_BACK ;
    wire                FILTER_BACKtoIDLE     ;
    wire                filter_done           ; 
    /******************************************************************/
    // reg                 key_in_r1 ; 
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            key_in_r1 <= 1'b1 ;
        else
            key_in_r1 <= key_in ;
    end 
    // reg                 key_in_r2 ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            key_in_r2 <= 1'b1 ;
        else
            key_in_r2 <= key_in_r1 ;
    end 
    // wire                nege      ;
    assign  nege = ~key_in_r1 &&  key_in_r2 ;
    // wire                pose      ;  
    assign  pose =  key_in_r1 && ~key_in_r2 ;
    // reg     [3:0]       state_c   ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            state_c <= IDLE ;
        else
            state_c <= state_n ;
    end
    // reg     [3:0]       state_n   ;
    always @(*) begin
        case(state_c)
        IDLE      : if(IDLEtoFILTER_UP)
                        state_n = FILTER_UP ;
                    else 
                        state_n = IDLE ;
        FILTER_UP : if(FILTER_UPtoIDLE)
                        state_n = IDLE ;
                    else if(FILTER_UPtoSAMPLING)
                        state_n = SAMPLING ;
                    else 
                        state_n = FILTER_UP ;
        SAMPLING  : if(SAMPLINGtoFILTER_BACK)
                        state_n = FILTER_BACK ;
                    else 
                        state_n = SAMPLING ;
        FILTER_BACK:if(FILTER_BACKtoIDLE)
                        state_n = IDLE ;
                    else
                        state_n = FILTER_BACK ;
        default   :     state_n = IDLE ;
        endcase
    end
    assign  IDLEtoFILTER_UP         = (state_c == IDLE)       && (nege) ;
    assign  FILTER_UPtoIDLE         = (state_c == FILTER_UP)  && (pose) ;
    assign  FILTER_UPtoSAMPLING     = (state_c == FILTER_UP)  && (filter_done) ;
    assign  SAMPLINGtoFILTER_BACK   = (state_c == SAMPLING)   && (pose) ;
    assign  FILTER_BACKtoIDLE       = (state_c == FILTER_BACK)&& (filter_done) ;
    // reg     [18:0]      cnt_core  ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_core <= 19'd0 ;
        else
        case (state_c)
        IDLE       :cnt_core <= 19'd0 ; 
        FILTER_UP  :if(filter_done)
                        cnt_core <= 19'd0 ;
                    else 
                        cnt_core <= cnt_core + 1'b1 ;
        SAMPLING   :cnt_core <= 19'd0 ; 
        FILTER_BACK:if(filter_done)
                        cnt_core <= 19'd0 ;
                    else 
                        cnt_core <= cnt_core + 1'b1 ;
        default    :    cnt_core <= 19'd0 ;
        endcase
    end
    // wire                filter_done
    assign  filter_done = (cnt_core == MAX_CNT_10MS - 1) ;
    // output reg key_flag
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            key_flag <= 1'b0 ;
        else if(FILTER_UPtoSAMPLING)
            key_flag <= ~key_in_r2 ;
        else 
            key_flag <= 1'b0 ;
    end

endmodule

/*
    蜂鸣器驱动模块,NPN三极管,beep_en == 1 鸣叫。有源电磁式。
    1, 初始状态鸣叫,按键每按下一次,蜂鸣器状态翻转。
    2.  初始状态蜂鸣器工作,响100ms , 不响100ms, 响100ms, 不响300ms.按键每按下一次,蜂鸣器工作状态翻转。
*/ 
module beep (
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,
    input       wire            key_flag    ,

    output      reg             beep_en     
);
    // // output reg beep_en
    // always @(posedge sys_clk or negedge sys_rst_n) begin
    //     if(~sys_rst_n) 
    //         beep_en <= 1'b1 ;
    //     else if(key_flag)
    //         beep_en <= ~beep_en ;
    // end

    // parameter
    parameter   MAX_CNT_100MS = 5_000_000  ,
                MAX_CNT_300MS = 15_000_000 ;
    localparam  RING          = 3'b001     ,
                NO_RING_MOD1  = 3'b010     ,
                NO_RING_MOD2  = 3'b100     ;
    // reg signal define
    reg                 beep_work ;
    reg     [23:0]      cnt_core  ;
    reg     [2:0]       state_c   ;
    reg     [2:0]       state_n   ;
    reg                 mod1_flag ;
    // wire signal define
    wire                RINGtoNO_RING_MOD1 ;
    wire                RINGtoNO_RING_MOD2 ;
    wire                NO_RING_MOD1toRING ;
    wire                NO_RING_MOD2toRING ;
    wire                no_ring_done       ;
    /*****************************************************/
    // reg                 beep_work ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            beep_work <= 1'b1 ;
        else if(key_flag)
            beep_work <= ~beep_work ;
        else 
            beep_work <= beep_work ;
    end
    // reg     [2:0]       state_c   ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            state_c <= RING ;
        else 
            state_c <= state_n ;
    end
    // reg     [2:0]       state_n   ;
    always @(*) begin
        if(beep_work) begin
            case(state_c)
            RING        :   if(RINGtoNO_RING_MOD1)
                                state_n = NO_RING_MOD1 ;
                            else if(RINGtoNO_RING_MOD2)
                                state_n = NO_RING_MOD2 ;
                            else
                                state_n = RING ;
            NO_RING_MOD1:   if(NO_RING_MOD1toRING)
                                state_n = RING ;
                            else 
                                state_n = NO_RING_MOD1 ;
            NO_RING_MOD2:   if(NO_RING_MOD2toRING)
                                state_n = RING ;
                            else 
                                state_n = NO_RING_MOD2 ;
            default     :       state_n = RING ;
            endcase
            end
        else
            state_n = RING ;
    end
    assign  RINGtoNO_RING_MOD1 = (state_c == RING)         && (no_ring_done && (mod1_flag))    ;
    assign  RINGtoNO_RING_MOD2 = (state_c == RING)         && (no_ring_done && (!mod1_flag))   ;
    assign  NO_RING_MOD1toRING = (state_c == NO_RING_MOD1) && (no_ring_done) ;
    assign  NO_RING_MOD2toRING = (state_c == NO_RING_MOD2) && (no_ring_done) ;
    // reg     [23:0]      cnt_core  ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_core <= 24'd0 ;
        else
        if(beep_work) begin
            case (state_c)
            RING        :   if(no_ring_done)
                                cnt_core <= 24'd0 ;
                            else 
                                cnt_core <= cnt_core + 1'b1 ; 
            NO_RING_MOD1:   if(no_ring_done)
                                cnt_core <= 24'd0 ;
                            else 
                                cnt_core <= cnt_core + 1'b1 ; 
            NO_RING_MOD2:   if(no_ring_done)
                                cnt_core <= 24'd0 ;
                            else 
                                cnt_core <= cnt_core + 1'b1 ;  
            default     :   cnt_core <= 24'd0 ;
            endcase
        end
        else 
            cnt_core <= 24'd0 ;
    end
    // reg                 mod1_flag ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            mod1_flag <= 1'b1 ;
        else if(beep_work) begin
            if((state_c != RING) && (no_ring_done))
                mod1_flag <= ~mod1_flag ;
            else 
                mod1_flag <= mod1_flag ;
            end
        else 
            mod1_flag <= 1'b1 ;
    end
    // wire                no_ring_done;
    assign  no_ring_done = (((state_c != NO_RING_MOD2)&&(cnt_core == MAX_CNT_100MS - 1))||((state_c == NO_RING_MOD2)&&(cnt_core == MAX_CNT_300MS - 1))) ? 1'b1 : 1'b0 ;
    // output reg beep_en
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            beep_en <= 1'b1 ;
        else if(beep_work) begin
            if(state_c == RING)
                beep_en <= 1'b1 ;
            else 
                beep_en <= 1'b0 ;
        end
        else 
            beep_en <= 1'b0 ; 
    end

endmodule

module top(
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,
    input       wire            key_in      ,

    output      wire            beep        
);
    // 例化间连线
    wire        key_flag ;
key_filter key_filter_inst(
    .sys_clk                ( sys_clk   ) ,
    .sys_rst_n              ( sys_rst_n ) ,
    .key_in                 ( key_in    ) ,

    .key_flag               ( key_flag  )  
);

beep beep_inst(
    .sys_clk                ( sys_clk   ) ,
    .sys_rst_n              ( sys_rst_n ) ,
    .key_flag               ( key_flag  ) ,

    .beep_en                ( beep      )  
);

endmodule

`timescale 1ns/1ns
module test_top();
    reg            sys_clk     ;
    reg            sys_rst_n   ;
    reg            key_in      ;

    wire           beep        ;

top top_inst(
    .sys_clk        ( sys_clk   ) ,
    .sys_rst_n      ( sys_rst_n ) ,
    .key_in         ( key_in    ) ,

    .beep           ( beep      )  
);

    parameter   CYCLE = 20 ;
    defparam    top_inst.key_filter_inst.MAX_CNT_10MS = 50 ;
    defparam    top_inst.beep_inst.MAX_CNT_100MS = 500  ;
    defparam    top_inst.beep_inst.MAX_CNT_300MS = 1500 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        key_in    <= 1'b1 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( CYCLE * 10 )   ;

        #( CYCLE * 3000 ) ;
        #( CYCLE * 500  ) ; // 检测蜂鸣器状态机是否正常工作。
        
        key_in    <= 1'b0 ;
        #( CYCLE * 50 * 3 ); // 按下足够长的时间,第一次按键按下。
        key_in    <= 1'b1 ;
        #( CYCLE * 3000 ) ;
        #( CYCLE * 500  ) ; // 检测蜂鸣器状态机是否正常工作。

        key_in    <= 1'b0 ;
        #( CYCLE * 50 * 3 ); // 按下足够长的时间,第二次按键按下。
        key_in    <= 1'b1 ;
        #( CYCLE * 3000 ) ;
        #( CYCLE * 500  ) ; // 检测蜂鸣器状态机是否正常工作。

        $stop             ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule

仿真:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言计算1,2,3…100的和

完整代码&#xff1a; // 计算 1&#xff0c;2&#xff0c;3…100 的和。 #include<stdio.h>int main() {int sum0;for (int i 1; i < 100; i){sumi;}printf("1&#xff0c;2&#xff0c;3…100 的和为&#xff1a;%d",sum);return 0; }运行截图&#xff…

【hcie-cloud】【3】华为云Stack规划设计之华为云Stack交付综述【上】

文章目录 前言华为云Stack交付综述交付流程华为云Stack交付流程华为云Stack安装部署流程 交付工具链华为云Stack交付工具链eDesigner - 让解决方案销售更智能eDesigner配置页面 - 基本信息eDesigner配置页面 - 服务及组网配置eDesigner配置页面 - 弹性云服务器/ECSeDesigner配置…

计算机视觉驾驶行为识别应用简述

一、什么是计算机视觉识别&#xff1f; 计算机视觉识别是一种基于图像处理和机器学习的人工智能应用技术&#xff0c;可以用于多个场景。常见应用场景包括人脸识别、场景识别、OCR识别以及商品识别等。今天以咱们国产系统豌豆云为例&#xff0c;为大家梳理一下在车辆驾驶行为中…

如何批量创建文件夹并命名?

如何批量创建文件夹并命名&#xff1f;批量创建文件夹指的是一次性在计算机中创建多个文件夹的操作。通常情况下&#xff0c;用户需要在特定的目录下创建多个具有相似命名规律的文件夹时&#xff0c;可以使用批量创建文件夹的功能&#xff0c;以简化和加快这一过程。这样的功能…

解决kubernetes集群证书过期的问题

现象&#xff1a; 解决办法&#xff1a; 1.在master节点运行&#xff1a; kubeadm alpha certs renew all 2.在master节点运行&#xff1a; rm -f /etc/kubernetes/kubelet.conf && cp /etc/kubernetes/admin.conf /etc/kubernetes/bootstrap-kubelet.conf 3.在maste…

CNVD-C-2023-76801:用友NC uapjs RCE漏洞复现[附POC]

文章目录 用友NC uapjs RCE漏洞复现(CNVD-C-2023-76801) [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 用友NC uapjs RCE漏洞复现(CNVD-C-2023-76801) [附POC] 0x01 前言 免责声明&#xff1a;请勿利用…

擎创动态 | 开箱即用!擎创科技联合中科可控推出大模型一体机

一、金融行业大模型一体机发布 10月26日至27日&#xff0c;2023金融科技安全与创新大会顺利召开。会上&#xff0c;中科可控联合擎创科技、卓世科技、文因互联、百川智能、捷通华声、智谱华章、易道博识等9大厂商&#xff0c;发布了9款金融行业大模型一体机&#xff0c;为金融…

ZYNQ_project:key_led

条件里是十进制可以不加进制说明&#xff0c;编译器默认是10进制&#xff0c;其他进制要说明。 实验目标&#xff1a; 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a; include "para.v"module key_filter (input wire …

opengauss权限需求

创建角色 "u_rts" 并授予对数据库 "rts_opsdb" 的只读权限&#xff1a; CREATE ROLE u_rts LOGIN PASSWORD Cloud1234; GRANT CONNECT ON DATABASE rts_opsdb TO u_rts; GRANT USAGE ON SCHEMA public TO u_rts; GRANT SELECT ON ALL TABLES IN SCHEMA pub…

二维码智慧门牌管理系统升级解决方案:轻松实现辖区范围门址统计

文章目录 前言一、系统功能与优势 前言 在这个数字化时代&#xff0c;传统的门牌管理系统已经无法满足现代管理的需求。为了满足辖区内门址的统计需求&#xff0c;我们引入了全新的二维码智慧门牌管理系统升级解决方案。这一升级将让您轻松实现辖区范围门址的统计&#xff0c;…

虹科分享 | 一文带你了解增强现实(AR)技术的前世今生

引言&#xff1a;增强现实&#xff08;Augmented Reality, AR&#xff09;技术在近几年大放光彩&#xff0c;您可能在《头号玩家》或《黑镜》等影视作品中看到过人们对AR技术的其奇思妙想&#xff0c;也可能从科普文章中了解过“元宇宙”、“数字孪生”等概念&#xff0c;您还可…

如何安装 StoneDB 2.0 企业版? | StoneDB 使用教程 #2

通过二进制TAR包安装&#xff08;CentOS 7.X&#xff09; 下载安装包 stonedb-ee-8.0-v2.1.0.el7.x86_64.tar.gz 下载地址&#xff1a;https://www.stoneatom.com/download 解压安装包 tar -zxvf stonedb-ee-8.0-v2.1.0.el7.x86_64.tar.gz -C /opt 依赖检查 ldd -r /opt/st…

Cordova插件开发三:通过广播实现应用间跨进程通信

文章目录 1.最终效果预览2.数据发送3.插件接受数据4.JS页面中点击获取数据返回1.最终效果预览 场景说明:我们给自来水公司开发了一个h5应用,需要对接第三方厂家支持硬件设备以便于获取到高精度定位数据,之前几篇文件写过,我已经集成过南方测绘RTK和高精度定位模块的设备,厂…

传感器数据采集:采样定理(奈奎斯特定理)

采样定理是连续时间信号&#xff08;通常称为“模拟信号”&#xff09;和离散时间信号&#xff08;通常称为“数字信号”&#xff09;之间的基本桥梁。该定理说明采样频率与信号频谱之间的关系&#xff0c;是连续信号离散化的基本依据。 它为采样率建立了一个足够的条件&#x…

Redis 线程、持久化和监控

Redis 线程、持久化和监控 Redis线程模型 Redis主线程模型 图1 Redis 6.0之前的主线程模型 IO多路复用程序指的是单个线程监听多个套接字连接&#xff08;Socket&#xff09;&#xff0c;当IO多路复用程序将多个Socket上的就绪事件放置于队列中&#xff0c; Redis主线程一次处…

Codeforces Round 908 (Div. 2)题解

目录 A. Secret Sport 题目分析: B. Two Out of Three 题目分析: C. Anonymous Informant 题目分析: A. Secret Sport 题目分析: A,B一共打n场比赛&#xff0c;输入一个字符串由A和‘B’组成代表A赢或者B赢&#xff08;无平局&#xff09;&#xff0c;因为题目说明这个人…

玩一玩MySQL8.0.35

文章目录 1 下载MySQL2 安装MySQL2.1 选择安装类型2.2 安装组件2.3 产品配置3 启动MySQL Shell4 使用MySQL Workbench4.1 创建数据库连接4.2 查看数据库列表4.3 创建数据库vue4.4 将csv导入数据库4.5 查看导入的表1 下载MySQL 网址:https://dev.mysql.com/downloads/installer…

Ansible优化大全

文章目录 一、关闭系统信息收集二、开启加速 Ansible 执行速度修改配置文件/etc/ansible/ansible.cfg由于该功能与sudo冲突&#xff0c;必须关闭 requiretty 选项方法一方法二 参考文章&#xff1a; https://blog.csdn.net/o0o0o0D/article/details/110998873 一、关闭系统信息…

【C#枚举 Enum】

C#枚举 Enum 一、枚举 1、枚举是将变量的值罗列出来,变量的值只限于列举出来的值的范围。 2、枚举使用enum关键字来声明&#xff0c;与类同级。枚举本身可以有修饰符&#xff0c;但枚举的成员始终是公共的&#xff0c;不能有访问修饰符。枚举本身的修饰符仅能使用public和int…

java项目之个人健康信息管理(ssm+jsp)

项目简介 个人健康信息管理实现了以下功能&#xff1a; 管理员&#xff1a;首页、个人中心、用户管理、医师管理、饮食记录管理、运动记录管理、健康信息管理、健康评估管理、健康知识管理、系统管理。用户&#xff1a;首页、个人中心、饮食记录管理、运动记录管理、健康信息…