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) beginif(~sys_rst_n) key_in_r1 <= 1'b1 ;elsekey_in_r1 <= key_in ;end // reg                 key_in_r2 ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) key_in_r2 <= 1'b1 ;elsekey_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) beginif(~sys_rst_n) state_c <= IDLE ;elsestate_c <= state_n ;end// reg     [3:0]       state_n   ;always @(*) begincase(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 ;elsestate_n = FILTER_BACK ;default   :     state_n = IDLE ;endcaseendassign  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) beginif(~sys_rst_n) cnt_core <= 19'd0 ;elsecase (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 ;endcaseend// wire                filter_doneassign  filter_done = (cnt_core == MAX_CNT_10MS - 1) ;// output reg key_flagalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) key_flag <= 1'b0 ;else if(FILTER_UPtoSAMPLING)key_flag <= ~key_in_r2 ;else key_flag <= 1'b0 ;endendmodule

/*蜂鸣器驱动模块,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// parameterparameter   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 definereg                 beep_work ;reg     [23:0]      cnt_core  ;reg     [2:0]       state_c   ;reg     [2:0]       state_n   ;reg                 mod1_flag ;// wire signal definewire                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) beginif(~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) beginif(~sys_rst_n) state_c <= RING ;else state_c <= state_n ;end// reg     [2:0]       state_n   ;always @(*) beginif(beep_work) begincase(state_c)RING        :   if(RINGtoNO_RING_MOD1)state_n = NO_RING_MOD1 ;else if(RINGtoNO_RING_MOD2)state_n = NO_RING_MOD2 ;elsestate_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 ;endcaseendelsestate_n = RING ;endassign  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) beginif(~sys_rst_n) cnt_core <= 24'd0 ;elseif(beep_work) begincase (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 ;endcaseendelse cnt_core <= 24'd0 ;end// reg                 mod1_flag ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) mod1_flag <= 1'b1 ;else if(beep_work) beginif((state_c != RING) && (no_ring_done))mod1_flag <= ~mod1_flag ;else mod1_flag <= mod1_flag ;endelse 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_enalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beep_en <= 1'b1 ;else if(beep_work) beginif(state_c == RING)beep_en <= 1'b1 ;else beep_en <= 1'b0 ;endelse beep_en <= 1'b0 ; endendmodule

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 beginsys_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             ;endalways #( CYCLE / 2 ) sys_clk = ~sys_clk ;endmodule

仿真:

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

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

相关文章

AM@向量代数@向量基本概念和向量线性运算

文章目录 abstract向量的基本概念向量向量的坐标分解式和坐标&#x1f47a;向量的模向量的长度(大小)&#x1f47a;零向量单位向量&#x1f47a;方向向量非零向量的单位向量正规化向量夹角&#x1f47a; 向量方向角和向量间夹角投影几何描述向量的线性运算向量的加减运算向量的…

Linux中固定ip端口和修改ip地址

一&#xff0c;更改虚拟网络编辑器 1&#xff0c;首先启动VMware&#xff0c;选择自己要更改ip或固定ip的虚拟机&#xff0c;并找到虚拟网络配编辑器&#xff0c;点击进入 2&#xff0c;进入之后需要点击右下角获取管理员权限后才能修改&#xff0c;有管理员权限之后图片如下 …

技术分享 | app自动化测试(Android)--元素定位方式与隐式等待

元素定位是 UI 自动化测试中最关键的一步&#xff0c;假如没有定位到元素&#xff0c;也就无法完成对页面的操作。那么在页面中如何定位到想要的元素&#xff0c;本小节讨论 Appium 元素定位方式。 Appium的元素定位方式 定位页面的元素有很多方式&#xff0c;比如可以通过 I…

python使用selenium做自动化,最新版Chrome与chromedriver不兼容

目前Chrome版本是118.0.5993.118 下方是版本对应的下载地址&#xff1a; chrome版本118&#xff1a; https://download.csdn.net/download/qq_35845339/88510476 chrome版本119&#xff1a; chromedriverlinux64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testin…

华为取消6000万订单影响在扩大,高通嘴硬强调不受影响

高通公布了2023年第三季度的业绩&#xff0c;业绩显示营收下滑24%&#xff0c;净利润下滑36%&#xff0c;不过高通强调预计今年四季度业绩将回升&#xff0c;意思是说华为取消订单带来的影响较小。 一、高通处境不利已延续4年时间 2019年美国对华为采取措施&#xff0c;众多中国…

优雅设计之美:实现Vue应用程序的时尚布局

本文为翻译文章&#xff0c;原文链接&#xff1a; ** https://fadamakis.com/clean-layout-architecture-for-vue-applications-a738201a2a1e 前言 页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式。如果使用的是Nuxt&#xff0c;则可以提供开箱即用…

11.8旧有报错与修改

我将uart_done&#xff08;出问题的信号&#xff09;的变量类型设为reg了&#xff0c;也就是我是reg uart_done这个信号的&#xff0c;这样做是错误的&#xff0c;哪怕你在接收模块确实定义的是reg类型&#xff0c;但是在顶层模块的时候&#xff0c;它可以视为是一条单纯的线而…

oled显示器程序(IIC)从stm32f103移植到stm32f429出现bug不显示-解决移植失败问题

出现问题处&#xff1a; 刚开始更换了这两行代码&#xff0c;然后更换位置后&#xff0c;oled正常显示&#xff0c;如下为正确顺序 I2C_Configuration();//配置CPU的硬件I2COLED_Init();//OLED初始化 在这段代码中&#xff0c;I2C_Configuration() 函数用于配置CPU的硬件 I2C…

AJAX-解决回调函数地狱问题

一、同步代码和异步代码 1.同步代码 浏览器是按照我们书写代码的顺序一行一行地执行程序的。浏览器会等待代码的解析和工作&#xff0c;在上一行完成之后才会执行下一行。这也使得它成为一个同步程序。 总结来说&#xff1a;逐行执行&#xff0c;需原地等待结果后&#xff0…

深度学习之基于YoloV5-Deepsort人物识别与追踪系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 YoloV5-Deepsort是一种基于深度学习的人物识别与追踪系统&#xff0c;具有较高的准确率和实时性能。 YoloV5是一种…

【算法与数据结构】77、LeetCode组合

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;如果k是固定的&#xff0c;最直接的方法就是建立k个for循环&#xff0c;将结果全部压入result容器中。…

一篇文章带你使用(MMKV--基于 mmap 的高性能通用 key-value 组件)

一、MMKV是什么&#xff1f; MMKV 是基于 mmap 内存映射的 key-value 组件&#xff0c;底层序列化/反序列化使用 protobuf 实现&#xff0c;性能高&#xff0c;稳定性强。也是腾讯微信团队使用的技术。 支持的数据类型 支持以下 Java 语言基础类型&#xff1a; boolean、int…

第23章(上)_索引原理之索引与约束

文章目录 索引索引分类主键选择索引的代价 约束外键约束约束与索引的区别 索引使用场景不要使用索引的场景总结 索引 索引的概念&#xff1a;索引是一种有序的存储结构。索引按照单个或多个列的值进行排序。 索引的目的&#xff1a;提升搜索效率。 索引分类 按照数据结构分为…

蓝桥杯双周赛算法心得——串门(双链表数组+双dfs)

大家好&#xff0c;我是晴天学长&#xff0c;树和dfs的结合&#xff0c;其邻接表的存图方法也很重要。需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .串门 2) .算法思路 串门&#xff08;怎么存图很关键&#xf…

TLS回调函数

TLS在逆向中的作用 TLS回调函数常用于反调试 TLS先于EP代码执行 TLS是什么 TLS是各线程的独立的数据存储空间 使用TLS技术可以在线程内部独立使用或修改进程的全局数据或静态数据 创建和终止某进程时&#xff0c;TLS回调函数都会自动调用执行 使用OD调试TLS函数

ElasticSearch与Lucene是什么关系?Lucene又是什么?

一. ElasticSearch 与 Lucene 的关系 Elasticsearch&#xff08;ES&#xff09;和Apache Lucene之间有密切的关系&#xff0c;可以总结如下&#xff1a; Elasticsearch构建于Lucene之上&#xff1a;Elasticsearch实际上是一个分布式的、实时的搜索和分析引擎&#xff0c;它构建…

直击第一届中国测绘地理信息大会,华测导航强势出圈!

11月8日&#xff0c;由自然资源部指导&#xff0c;中国测绘学会、中国地理信息产业协会和中国卫星导航定位协会共同主办的第一届中国测绘地理信息大会于浙江德清盛大开幕&#xff0c;各家科研院所、企事业单位云集现场&#xff0c;展示科技创新成果。华测导航携多类智能装备及解…

推荐一款功能强大的在线文件预览工具-kkFileView

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

超好用的IDEA插件推荐

写完代码还得重复打字编写接口文档&#xff1f;代码量大定位接口定义方法太难找&#xff1f;麻烦&#xff01;写完代码还得复制粘贴到postman进行调试&#xff1f; 这三点太麻烦&#xff1f;今天给大家推荐一款IDEA插件&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;…

企业如何落地搭建商业智能BI系统

随着新一代信息化、数字化技术的应用&#xff0c;引发了新一轮的科技革命&#xff0c;现代化社会和数字化的联系越来越紧密&#xff0c;数据也变成继土地、劳动力、资本、技术之后的第五大生产要素&#xff0c;这一切都表明世界已经找准未来方向&#xff0c;前沿科技也与落地并…