verilog学习笔记- 11)按键控制蜂鸣器实验

这篇具有很好参考价值的文章主要介绍了verilog学习笔记- 11)按键控制蜂鸣器实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介:

蜂鸣器按照驱动方式主要分为有源蜂鸣器和无源蜂鸣器,其主要区别为蜂鸣器内部是否含有震荡源。一般的有源蜂鸣器内部自带了震荡源,只要通电就会发声。而无源蜂鸣器由于不含内部震荡源,需要外接震荡信号才能发声。

verilog学习笔记- 11)按键控制蜂鸣器实验

                                             左边为有源蜂鸣器 右边为无源蜂鸣器

从外观上看,两种蜂鸣器很相似,如将两种蜂鸣器的引脚都朝上放置,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。相较于有源蜂鸣器,无源蜂鸣器成本更低,且发声频率可控。而有源蜂鸣器控制相对简单,由于内部自带震荡源,只要加上合适的直流电压即可发声。


实验任务:

使用按键控制蜂鸣器发声。初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停止鸣叫,再次按下开关,蜂鸣器重新鸣叫


硬件设计:

verilog学习笔记- 11)按键控制蜂鸣器实验

我们可以看到蜂鸣器受到三极管的控制,这里三极管充当开关的作用,它基极连接到 FPGA 的 IO 引脚当 FPGA 输出高电平时三极管导通,蜂鸣器鸣叫反之蜂鸣器停止鸣叫。

管脚分配如下表所示:

verilog学习笔记- 11)按键控制蜂鸣器实验

对应的 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,如下图所示: 

verilog学习笔记- 11)按键控制蜂鸣器实验


程序设计:

由实验任务可知,我们只需要在按键按下时改变蜂鸣器的鸣叫状态,但实际上在按键按下的过程中存在按键抖动的干扰,体现在数字电路中就是不断变化的高低电平,为避免在抖动过程中采集到错误的按键状态,我们需要对按键数据进行消除抖动处理。因此本系统应至少包含按键消抖模块和蜂鸣器控制模块,按键控制蜂鸣器系统框图如图

verilog学习笔记- 11)按键控制蜂鸣器实验

查看软件生成的模块端口及信号连接图。首先在对工程进行编译,然后点击菜单栏的【Tools】→【NetList Viewers】→【RTL Viewer】

verilog学习笔记- 11)按键控制蜂鸣器实验

verilog学习笔记- 11)按键控制蜂鸣器实验需要注意的是,必须已经执行过综合或编译之后,才能打开模块端口及信号连接图。打开之后,按下键盘的【Ctrl】键,滚动鼠标的滚轮可以对生连接图进行放大和缩小。模块端口及信号连接图可以比较清晰的查看各个模块端口信号的连接,同时双击模块,也可以进一步查看模块的原理图。

顶层模块有以下两个模块,按键消抖模块(key_debounce)蜂鸣器控制模块(beep_control)。顶层模块(top_key_beep)完成了对另外两个模块的例化。按键消抖模块,主要起到延时采样,防止按键抖动的干扰。蜂鸣器控制模块,通过对按键信号的识别,起到控制蜂鸣器鸣叫的作用。

按键消抖模块(key_debounce):对按键信号延时采样,将消抖后的按键信号和按键数据有效信号输出至 beep_control 模块。蜂鸣器控制模块(beep_control):根据输入的按键信号和按键数据有效信号,来控制蜂鸣器的鸣叫。

 文章来源地址https://www.toymoban.com/news/detail-434183.html

按键消抖的原理。通常我们所使用的开关为机械弹性开关,当我们按下或松开按键时,由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动,消除这种抖动的过程即称为按键消抖。软件消抖的原理主要为按键按下或松开后延时 5ms—20ms 采样,也可以在检测到按键状态稳定后采样,即避开抖动区域后再采样,如图:

verilog学习笔记- 11)按键控制蜂鸣器实验

顶层模块代码如下:

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 <= 1'b1;
20 delay_cnt <= 32'd0;
21 end
22 else begin
23 key_reg <= key;
24 if(key_reg != key) //一旦检测到按键状态发生变化(有按键被按下或释放)
25 delay_cnt <= 32'd1000000; //给延时计数器重新装载初始值(计数时间为 20ms)
26 else if(key_reg == key) begin //在按键状态稳定时,计数器递减,开始 20ms 倒计时
27 if(delay_cnt > 32'd0)
28 delay_cnt <= delay_cnt - 1'b1;
29 else
30 delay_cnt <= delay_cnt;
31 end 
32 end 
33 end
34 
35 always @(posedge sys_clk or negedge sys_rst_n) begin
36 if (!sys_rst_n) begin
37 key_flag <= 1'b0;
38 key_value <= 1'b1; 
39 end
40 else begin
41 if(delay_cnt == 32'd1) begin //当计数器递减到 1 时,说明按键稳定状态维持了 20ms
42 key_flag <= 1'b1; //此时消抖过程结束,给出一个时钟周期的标志信号
43 key_value <= key; //并寄存此时按键的值
44 end
45 else begin
46 key_flag <= 1'b0;
47 key_value <= key_value;
48 end 
49 end 
50 end
51 
52 endmodule

程序中第 25 行不断检测按键状态,一旦发现按键状态发生改变,就给计数器 delay_cnt 赋初值 1000000。在按键状态不发生改变时,delay_cnt 递减从而实现倒计时的功能,在倒计时过程中,一旦检测到按键状态发生改变,则说明有抖动产生,此时重新给 delay_cnt 赋初值,并开始新一轮倒计时。在 50Mhz 时钟驱动下,delay_cnt 若能由 1000000 递减至 1,则说明按键状态保持稳定时间达 20ms,此时输出一个时钟周期的通知信号 key_flag,并将此时的按键数据寄存输出。

蜂鸣器控制模块的代码如下:

1 module beep_control(
2 //input
3 input sys_clk, //系统时钟
4 input sys_rst_n, //复位信号,低电平有效
5 
6 input key_flag, //按键有效信号
7 input key_value, //消抖后的按键信号 
8 output reg beep //蜂鸣器控制信号 
9 );
10 
11 //*****************************************************
12 //** main code
13 //*****************************************************
14 always @ (posedge sys_clk or negedge sys_rst_n) begin
15 if(!sys_rst_n)
16 beep <= 1'b1;
17 else if(key_flag && (~key_value)) //判断按键是否有效按下
18 beep <= ~beep; 
19 end
20 
21 endmodule

beep 初始状态为高电平,蜂鸣器鸣叫,当检测到按键有效信号 key_flag 为高电平,同时按键信号 key_value 为低电平时说明按键被有效按下,此时 beep 取反,蜂鸣器停止鸣叫。当按键再次按下时,beep再次取反,蜂鸣器重新开始鸣叫。

Test bench 模块代码如下:

1 `timescale 1 ns/ 1 ns
2 module tb_top_key_beep();
3 
4 //parameter define
5 parameter T = 20;
6 
7 //reg define
8 reg key;
9 reg sys_clk;
10 reg sys_rst_n;
11 reg key_value;
12 
13 // wire define 
14 wire beep;
15 
16 //*****************************************************
17 //** main code 
18 //*****************************************************
19 
20 //给信号初始值
21 initial begin
22 key <= 1'b1;
23 sys_clk <= 1'b0;
24 sys_rst_n <= 1'b0;
25 #20 sys_rst_n <= 1'b1; //在第 20ns 的时候复位信号信号拉高
26 #30 key <= 1'b0; //在第 50ns 的时候按下按键
27 #20 key <= 1'b1; //模拟抖动
28 #20 key <= 1'b0; //模拟抖动
29 #20 key <= 1'b1; //模拟抖动
30 #20 key <= 1'b0; //模拟抖动
31 #170 key <= 1'b1; //在第 300ns 的时候松开按键
32 #20 key <= 1'b0; //模拟抖动
33 #20 key <= 1'b1; //模拟抖动
34 #20 key <= 1'b0; //模拟抖动
35 #20 key <= 1'b1; //模拟抖动
36 #170 key <= 1'b0; //在第 550ns 的时候再次按下按键
37 #20 key <= 1'b1; //模拟抖动
38 #20 key <= 1'b0; //模拟抖动
39 #20 key <= 1'b1; //模拟抖动
40 #20 key <= 1'b0; //模拟抖动
41 #170 key <= 1'b1; //在第 800ns 的时候松开按键
42 #20 key <= 1'b0; //模拟抖动
43 #20 key <= 1'b1; //模拟抖动
44 #20 key <= 1'b0; //模拟抖动
45 #20 key <= 1'b1; //模拟抖动
46 end
47 
48 //50Mhz 的时钟,周期则为 1/50Mhz=20ns,所以每 10ns,电平取反一次 
49 always # (T/2) sys_clk <= ~sys_clk;
50 
51 //例化 key_beep 模块 
52 top_key_beep u1 (
53 .beep(beep),
54 .key(key),
55 .sys_clk(sys_clk),
56 .sys_rst_n(sys_rst_n)
57 ); 
58 
59 endmodule

仿真波形图如下:

verilog学习笔记- 11)按键控制蜂鸣器实验

测试代码中,为了方便仿真波形的查看,将按键消抖模块中的延时采样的延时时间改为四个时钟周期(将按键消抖模块中的第 26 行代码 delay_cnt <= 32'd1000000; 改为 delay_cnt <= 32'd4;)。tb_key_beep 模块中第 22 行到第 45 行为信号的激励。从图 10.4.5 可以看到,第 50ns 时,将 key 拉低,并在 50 至 130ns时模拟按键抖动,可见在按键抖动停止后的第 4 个时钟周期时,key_flag 出现一个时钟周期的高电平,同时beep 被拉低(蜂鸣器停止鸣叫);在第 300ns 时松开按键,随后模拟按键抖动,同理可知在抖动结束后的第四个时钟周期,key_flag 信号被拉高。读者可以仔细观察仿真波形结合代码深入理解,仔细体会 key_flag信号和 key 信号之间的关系。


下载验证:

verilog学习笔记- 11)按键控制蜂鸣器实验

功能正常 

 

到了这里,关于verilog学习笔记- 11)按键控制蜂鸣器实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32第三课:按键控制LED灯,光敏传感器控制蜂鸣器

            STM32的第三课,我们来学习如何使用按键来控制LED灯的亮灭。上一节课我们通过代码控制了LED的状态,但是还是处于一种较为低级的方式控制LED灯,缺少交互性,用按键进行控制属于更高的一个层次。然后我们将学习通过光敏传感器控制蜂鸣器的通断,让我们的学

    2024年04月29日
    浏览(35)
  • key_beep按键控制蜂鸣器程序及流程图

    使用按键控制蜂鸣器发声。 初始状态为蜂鸣器鸣叫,按下开关后蜂鸣器停 止鸣叫,再次按下开关,蜂鸣器重新鸣叫。

    2024年02月12日
    浏览(50)
  • 学习笔记|认识蜂鸣器|控制原理|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(上):蜂鸣器应用

    反面包上黑胶的是有源蜂鸣器。 在背面裸露的一块线路板的是无源蜂鸣器。 YX55675-无源蜂鸣器模块的资料 提取码:nl73 1、有源蜂鸣器内部带震荡源,所以只要一通电就会叫(一边高电平,一边低电平),而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫(必须不断给高

    2024年02月11日
    浏览(58)
  • 基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

    这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关;本文从原理图开始到最后实现功能,内容详细。 本栏目的所有都是基于STM32F407ZET6芯片,博主采用的是普中的天马F407开发板。 实现功能:LED0与LED1默认熄灭,蜂鸣器默认关闭。按下按键KEY0,控LED0亮灭;按下按

    2024年02月16日
    浏览(52)
  • 51单片机学习笔记-9蜂鸣器

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 蜂鸣器 是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。蜂鸣器按驱动方式可分

    2024年02月06日
    浏览(53)
  • 【STM32学习笔记】(10)——蜂鸣器实验详解

    蜂鸣器是一种一体化结构的电子讯响器,采用 直流电压 供电,广泛应用于计算机、打印机、复印机、报警器、 电子玩具 、汽车电子设备、电话机、 定时器 等电子产品中作发声器件。蜂鸣器主要分为 压电式蜂鸣器 和 电磁式蜂鸣器 两种类型。蜂鸣器在电路中用字母 “H”

    2024年02月06日
    浏览(45)
  • PADS-按键、蜂鸣器、继电器PCB封装设计

    放置一个表贴端点,更改矩形尺寸,同时计算与原点的距离,这里我们按7.9+0.2最大值来放置   分步与重复,放置右边的端点,然后根据样式,先画一个矩形,然后改变宽的尺寸,3.8/1.2得出1.9 同样改一下长的坐标6.3/2=3.15  把线宽改细一点 W 0.1,或者双击改线宽  添加倒角

    2024年02月13日
    浏览(55)
  • 音乐播放器蜂鸣器ROM存储歌曲verilog,代码/视频

    名称:音乐播放器蜂鸣器ROM存储歌曲 软件:Quartus 语言:Verilog 代码功能:        设计音乐播放器,要求至少包含2首歌曲,使用按键切换歌曲,使用开发板的蜂鸣器播放音乐,使用Quartus内的ROM IP核存储音乐文件, 简谱存储在ROM中,共2首歌曲。      《茉莉花》的简谱存

    2024年02月04日
    浏览(54)
  • 【【51单片机的蜂鸣器-11】】

    DS1302我一直有问题搁置了几百天了 先来看看蜂鸣器 搞了一个礼拜verilog然后出去吃饭 估计自己得有10多天没看c语言和51单片机了 现在先处理一下蜂鸣器的问题 蜂鸣器 蜂鸣器分为有源蜂鸣器和无源蜂鸣器 有源内部自带震荡源,将正负极接上直流电压及可持续发声,频率固定

    2024年02月16日
    浏览(66)
  • 嵌入式系统项目设计——基于LED、按键、蜂鸣器的打地鼠游戏(完整代码)

    内容摘自上学期嵌入式系统课程设计最终的实验报告,因为CSDN不支持上传word资料,所以我就摘录下来写进文章里了,希望可以帮助到你 1.1选题背景 打地鼠游戏是一种非常受小孩子欢迎的游戏,拥有数量极其广大的受众,所以它的市场前景非常广阔。当今社会虽然存在各种各

    2024年02月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包