ZYNQ_project:key_beep

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

模块框图:

时序图:

 

代码:

/*
    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

仿真:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试

目录 1 搭建嵌入式gdb调试环境 1.1 交叉编译工具链自带的gdb和gdbserver 1.2 使用gdb进行嵌入式程序调试 1.2.1编写简单测试程序 1.2.2 gdb调试程序 1.3 源码编译gdb和gdbserver 1.3.1 下载gdb和gdbserver源码 1.3.2 编译gdb 1.3.3 移植gdbserver 2 VSCodegdbserver 图…

第十八章:Swing自述

18.1 Swing概述 18.2&#xff1a;Swing常用窗体 18.2.1&#xff1a;JFrame窗体 package eightth; import java.awt.*; //导入AWT包 import javax.swing.*; //导入Swing包 public class JFreamTest { public static void main(String args[]) { // 主方法 JFr…

阿里云99元服务器2核2G3M带宽_4年396元_新老用户均可

阿里云2核2G3M带宽99元服务器新老用户同享&#xff0c;续费不涨价&#xff0c;99元即可续费&#xff0c;可以续费到2027年&#xff0c;相当于396元买4年&#xff0c;阿里云百科aliyunbaike.com来详细说下阿里云99元服务器配置、购买条件、优惠价格和续费攻略&#xff1a; 阿里…

计算机毕业设计 基于SpringBoot的私人西服定制系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【Python】Python爬虫使用代理IP的实现

前言 在爬虫的过程中&#xff0c;我们经常会遇到需要使用代理IP的情况。比如&#xff0c;针对目标网站的反爬机制&#xff0c;需要通过使用代理IP来规避风险。因此&#xff0c;本文主要介绍如何在Python爬虫中使用代理IP。 一、代理IP的作用 代理IP&#xff0c;顾名思义&…

flutter生态一统甜夏 @Android @ios @windowse @macos @linux @Web

(愿景)G o o g l e 中 国flutter生态一统天下(IT) @Web

网络安全入门必学内容

网络安全入门 必/学/内/容/ 随着时代的发展&#xff0c;经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起&#xff0c;线上线下已经打通&#xff0c;虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界&#xff0…

YashanDB发布会圆满收官,V23.1三大新品引领国产数据库技术与应用突破!

11月8日&#xff0c;YashanDB 2023年度产品发布会在线上成功召开。本次产品发布会以“惟实励新”为主题&#xff0c;宣布崖山数据库系统YashanDB 内核能力、产品形态、生态创新全面升级&#xff0c;标志着YashanDB商业化进程又迈出了重要一步&#xff01; 据了解&#xff0c;深…

企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

java数据结构(红黑树)set集合 HashSet HashSet三个问题 LinkedHashSetTreeSet TreeSet集合默认规则排序规则

目录 数据结构(红黑树)红黑规则红黑树添加结点规则 set集合小结HashSet HashSet三个问题LinkedHashSet小结 TreeSetTreeSet集合默认规则排序规则(第一种排序方法)方式二练习 小练 总结总结 集合的使用应该怎么选择 数据结构(红黑树) 红黑规则 后代节点就是比如13根结点 13下面的…

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…

网络安全(黑客)-零基础自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

10-26 maven配置

打开idea 打开setting 基于Idea创建idea项目 加载jar包&#xff1a;(一般需要自己去手动加入&#xff0c;本地仓库是没有的)

Spring Cloud - 通过 Gateway webflux 编程实现网关异常处理

一、webflux 编程实现网关异常处理 我们知道在某一个服务中出现异常&#xff0c;可以通过 ControllerAdvice ExceptionHandler 来统一异常处理&#xff0c;即使是在微服务架构中&#xff0c;我们也可以将上述统一异常处理放入到公共的微服务中&#xff0c;这样哪一个微服务需要…

计算机网络基础知识1

1、tcp三次握手&#xff1f; SYN&#xff0c;标志位&#xff0c;用于建立TCP连接的握手过程中的标志位。 ACK&#xff0c;确认位&#xff0c;用于说明整个包是确认报文。 TCP/IP协议是传输层的一个面向连接提供可靠安全的传输协议。第一次握手有客户端发起&#xff0c;客户端向…

【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)

第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09; 2024 4th International Conference on Computer Network Security and Software Engineering 第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09;将于2024年2月…

使用 Rust 进行程序

首先&#xff0c;我们需要安装必要的库。在终端中运行以下命令来安装 scraper 和 reqwest 库&#xff1a; rust cargo install scraper reqwest 然后&#xff0c;我们可以开始编写程序。以下是一个基本的爬虫程序&#xff0c;用于爬取 上的图片&#xff1a; rust use reqwe…

【redis】ssm项目整合redis,redis注解式缓存及应用场景,redis的击穿、穿透、雪崩的解决方案

一、整合redis redis是nosql数据库&#xff0c;mysql是sql数据库&#xff0c;都是数据库因此可以参考mysql整合ssm项目的过程。 1.pom依赖 <properties> <redis.version>2.9.0</redis.version><redis.spring.version>1.7.1.RELEASE</redis.spri…

朋友圈延迟评论,你用过吗?

在社交媒体时代&#xff0c;朋友圈已经成为人们交流和互动的重要平台。然而&#xff0c;在发表评论时&#xff0c;我们往往会被情绪冲昏头脑&#xff0c;或者因为时间紧迫而没有充分思考。这可能会导致一些不恰当的言论&#xff0c;或者错过一些更精准的表达方式。朋友圈延迟评…

在外包干了3年,彻底废了...

前言 先简单说下&#xff0c;我18年的大专生&#xff0c;通过校招去了一家软件公司&#xff0c;在里面干了快3年的功能测试&#xff0c;后面我感觉自己不能够在这样下去了&#xff0c;长时间重复性工作且呆在一个舒适的环境会毁掉一个人&#xff0c;而我已经在一个企业干了3年…