您当前的位置: 首页 >  fpga开发

正点原子

暂无认证

  • 5浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子FPGA连载】第十章按键控制蜂鸣器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

正点原子 发布时间:2021-10-23 11:38:55 ,浏览量:5

1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 4)关注正点原子公众号,获取最新资料更新 在这里插入图片描述

第十章按键控制蜂鸣器实验

蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号。蜂鸣器在生活中已经得到广泛使用,其典型应用包括医疗,消防等领域的各种报警装置以及日常生活中的各种警报器等。本章我们主要学习如何使用按键来控制蜂鸣器发声。 本章包括以下几个部分: 1010.1简介 10.2实验任务 10.3硬件设计 10.4程序设计 10.5下载验证 10.1简介 蜂鸣器按照驱动方式主要分为有源蜂鸣器和无源蜂鸣器,其主要区别为蜂鸣器内部是否含有震荡源。一般的有源蜂鸣器内部自带了震荡源,只要通电就会发声。而无源蜂鸣器由于不含内部震荡源,需要外接震荡信号才能发声。 在这里插入图片描述

图 10.1.1 左边为有源蜂鸣器 右边为无源蜂鸣器 在这里插入图片描述

图 10.1.2 本次实验使用的有源蜂鸣器 如图 10.1.1所示,从外观上看,两种蜂鸣器很相似,如将两种蜂鸣器的引脚都朝上放置,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。 相较于有源蜂鸣器,无源蜂鸣器成本更低,且发声频率可控。而有源蜂鸣器控制相对简单,由于内部自带震荡源,只要加上合适的直流电压即可发声。本次实验使用的蜂鸣器为图 10.1.2中的有源蜂鸣器。 10.2实验任务 本节实验任务是使用按键控制蜂鸣器发声。初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫。 10.3硬件设计 在这里插入图片描述

图 10.3.1 蜂鸣器控制电路原理图 图 10.3.1为蜂鸣器控制电路的原理图,我们可以看到蜂鸣器受到三极管的控制,这里三极管充当开关的作用,它基极连接到FPGA的IO引脚当FPGA输出高电平时三极管导通,蜂鸣器鸣叫反之蜂鸣器停止鸣叫。 本实验的管脚分配如下表所示: 表 10.3.1 按键控制蜂鸣器实验管脚分配 在这里插入图片描述

对应的TCL约束语句如下: set_location_assignment PIN_E16 -to key set_location_assignment PIN_D12 -to beep set_location_assignment PIN_M2 -to sys_clk set_location_assignment PIN_M1 -to sys_rst_n set_instance_assignment -name CURRENT_STRENGTH_NEW 12MA -to beep 需要说明的是,由于蜂鸣器需要的驱动电流较大,使用默认8mA的驱动电流有可能出现蜂鸣器发声较小的情况,解决方法是将蜂鸣器输出的驱动电流修改成12mA或者是16mA,如下图所示: 在这里插入图片描述

图 10.3.2 按键控制蜂鸣器管脚分配图 当然也可以在对应的TCL约束语句中修改,如上文TCL的最后一行所示,具体使用哪种方法大家根据自己喜好来。 10.4程序设计 由实验任务可知,我们只需要在按键按下时改变蜂鸣器的鸣叫状态,但实际上在按键按下的过程中存在按键抖动的干扰,体现在数字电路中就是不断变化的高低电平,为避免在抖动过程中采集到错误的按键状态,我们需要对按键数据进行消除抖动处理。因此本系统应至少包含按键消抖模块和蜂鸣器控制模块,按键控制蜂鸣器系统框图如图 10.4.1所示。 在这里插入图片描述

图 10.4.1 按键控制蜂鸣器系统框图 这里我们补充下如何查看软件生成的模块端口及信号连接图。首先在对工程进行编译,然后点击菜单栏的【Tools】→【NetList Viewers】→【RTL Viewer】,如图 10.4.2所示: 在这里插入图片描述

图 10.4.2 打开端口及信号连接图 稍后就可以看到软件生成的模块端口及信号连接图了,如图 10.4.3所示: 在这里插入图片描述

图 10.4.3 端口及信号连接图 需要注意的是,必须已经执行过综合或编译之后,才能打开模块端口及信号连接图。打开之后,按下键盘的【Ctrl】键,滚动鼠标的滚轮可以对生连接图进行放大和缩小。模块端口及信号连接图可以比较清晰的查看各个模块端口信号的连接,同时双击模块,也可以进一步查看模块的原理图。 由图 10.4.3的连接图可知,顶层模块例化了以下两个模块,按键消抖模块(key_debounce)和蜂鸣器控制模块(beep_control)。顶层模块(top_key_beep)完成了对另外两个模块的例化。按键消抖模块,主要起到延时采样,防止按键抖动的干扰。蜂鸣器控制模块,通过对按键信号的识别,起到控制蜂鸣器鸣叫的作用。 按键消抖模块(key_debounce):对按键信号延时采样,将消抖后的按键信号和按键数据有效信号输出至beep_control模块。 蜂鸣器控制模块(beep_control):根据输入的按键信号和按键数据有效信号,来控制蜂鸣器的鸣叫。 在这里我们介绍一下按键消抖的原理。通常我们所使用的开关为机械弹性开关,当我们按下或松开按键时,由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动,消除这种抖动的过程即称为按键消抖。 按键消抖可分为硬件消抖和软件消抖。硬件消抖主要使用RS触发器或电容等方法实现消抖,一般在按键较少时使用。软件消抖的原理主要为按键按下或松开后延时5ms—20ms采样,也可以在检测到按键状态稳定后采样,即避开抖动区域后再采样,如图 10.4.4所示。 在这里插入图片描述

图 10.4.4 按键消抖原理图 顶层模块代码如下:

1   module top_key_beep(
2       input        sys_clk,       //时钟信号50Mhz
3       input        sys_rst_n,     //复位信号
4       
5       input        key,           //按键信号       
6       output       beep           //蜂鸣器控制信号
7       );
8       
9   //wire define
10  wire key_value;
11  wire key_flag;
12  
13  //*****************************************************
14  //**                    main code
15  //*****************************************************
16  
17  //例化按键消抖模块
18  key_debounce u_key_debounce(
19      .sys_clk        (sys_clk),
20      .sys_rst_n      (sys_rst_n),
21      
22      .key            (key),
23      .key_flag       (key_flag),
24      .key_value      (key_value)
25      );
26  
27  //例化蜂鸣器控制模块
28  beep_control u_beep_control(
29      .sys_clk        (sys_clk), 
30      .sys_rst_n      (sys_rst_n),
31      
32      .key_flag       (key_flag),      
33      .key_value      (key_value),
34      .beep           (beep)
35      );
36      
37  endmodule 
在顶层模块中例化了按键消抖模块和按键控制蜂鸣器模块。
按键消抖模块代码如下:
1   module key_debounce(
2       input            sys_clk,          //外部50M时钟
3       input            sys_rst_n,        //外部复位信号,低有效
4       
5       input            key,              //外部按键输入
6       output reg       key_flag,         //按键数据有效信号
7       output reg       key_value         //按键消抖后的数据  
8       );
9   
10  //reg define    
11  reg [31:0] delay_cnt;
12  reg        key_reg;
13  
14  //*****************************************************
15  //**                    main code
16  //*****************************************************
17  always @(posedge sys_clk or negedge sys_rst_n) begin 
18      if (!sys_rst_n) begin 
19          key_reg               
关注
打赏
1665308814
查看更多评论
0.5736s