【入门学习二】基于 FPGA 使用 Verilog 实现蜂鸣器响动的代码及原理讲解

您所在的位置:网站首页 音调的调咋写 【入门学习二】基于 FPGA 使用 Verilog 实现蜂鸣器响动的代码及原理讲解

【入门学习二】基于 FPGA 使用 Verilog 实现蜂鸣器响动的代码及原理讲解

2023-07-29 03:12| 来源: 网络整理| 查看: 265

目录 一、知识了解二、模块设计三、程序实现四、管脚配置及结果展示五、写给小白看的

上一篇博文:【入门学习一】基于 FPGA 使用 Verilog 实现按键点灯代码及原理讲解

功能描述:通过前面一篇学习的按键使用,本篇文章进一步使用按键,通过点击按键后,可以让蜂鸣器播放不同的曲子

一、知识了解

PWM 技术控制蜂鸣器不同声响

所谓 PWM 就是脉冲宽度调制,本文通过变化输出的脉冲频率来使得蜂鸣器发出不同的音符声音。下表是每个音符所对应的频率及半周期。 音符对应频率(Hz)时钟周期数152395600258785150365975850469871600578463750688056800798850600 音符对应的时钟周期数越多,那么它的一个周期就越长,从下图可以看出来,音符从 1 到 7,它的一个周期逐次递减。 在这里插入图片描述所以说,如何让蜂鸣器发声,只需要往蜂鸣器的管脚输出连续的高低变化电平即可。就拿我这个板子的蜂鸣器来说,图中有个 PNP 型三极管,当基极为高电平时截止,也就是高电平的发射极 Q7 无法导通到集电极使蜂鸣器发声,低电平时导通,此时高电平的发射极 Q7 可以导通到集电极使蜂鸣器发声。 在这里插入图片描述要让蜂鸣器发出不同的声音,采用 PWM 原理改变基极的脉冲宽度即可,也就是前面提到的,不同音符的一个周期所对应不同宽度脉冲。

设置每个音符持续时长

当输出一个周期的脉冲给蜂鸣器,它肯定会响,但是有一点,一个周期的脉冲时长只有几百毫秒,我们能听到吗?当然听不到,所以需要不断地重复一个周期的脉冲,使它连续输出波形长达 1 s 或者 0.5 s,也就是一个音符的持续时长,那么我们就肯定能听到了。 在这里插入图片描述这里我以音符 1 为基准,让它的一个周期重复 250 次,那么它总时长为 95600 × 250 = 23 , 900 , 000 95600×250=23,900,000 95600×250=23,900,000 个时序周期,其它的音符总时长也为 23 , 900 , 000 23,900,000 23,900,000 个时序周期,所以不难得出 每 个 音 符 的 重 复 次 数 = 23 , 900 , 000 该 音 符 一 个 周 期 时 序 数 每个音符的重复次数=\frac{23,900,000}{该音符一个周期时序数}\\ 每个音符的重复次数=该音符一个周期时序数23,900,000​音符1 = 23 , 900 , 000 95600 ≈ 250 ( 次 ) = \frac{23,900,000}{95600}≈250(次) =9560023,900,000​≈250(次) 音符2 = 23 , 900 , 000 85150 ≈ 281 ( 次 ) = \frac{23,900,000}{85150}≈281(次) =8515023,900,000​≈281(次) 音符3 = 23 , 900 , 000 75850 ≈ 315 ( 次 ) = \frac{23,900,000}{75850}≈315(次) =7585023,900,000​≈315(次) 音符4 = 23 , 900 , 000 71600 ≈ 334 ( 次 ) = \frac{23,900,000}{71600}≈334(次) =7160023,900,000​≈334(次) 音符5 = 23 , 900 , 000 63750 ≈ 375 ( 次 ) = \frac{23,900,000}{63750}≈375(次) =6375023,900,000​≈375(次) 音符6 = 23 , 900 , 000 56800 ≈ 421 ( 次 ) = \frac{23,900,000}{56800}≈421(次) =5680023,900,000​≈421(次) 音符7 = 23 , 900 , 000 50600 ≈ 472 ( 次 ) = \frac{23,900,000}{50600}≈472(次) =5060023,900,000​≈472(次)

歌谱

歌谱如下: 在这里插入图片描述 在这里插入图片描述 二、模块设计 由于程序比较简单,所以就只需要一个蜂鸣器 .v 文件即可,它也是顶层模块,再在其中引用按键模块。其中按键模块 key_debounce.v 在前一篇博文中已经贴出了,这里就不再重复贴出代码以及讲解了。 在这里插入图片描述 三、程序实现

蜂鸣器模块 pwm_buzzer.v

module pwm_buzzer( input clk , //时钟输入 input rst_n , //复位按键输入 input key_in , //按键输入 output reg buzzer //驱动蜂鸣器 ); wire press ; //线,连接按键标志信号 //引用按键模块 key_debounce u_key_debounce( .clk (clk ), .rst_n (rst_n ), .key (key_in ), .press (press ) ); //定义音符时序周期数 localparam M0 = 98800, M1 = 95600, M2 = 85150, M3 = 75850, M4 = 71600, M5 = 63750, M6 = 56800, M7 = 50600; //信号定义 reg [16:0] cnt0 ; //计数每个音符对应的时序周期 reg [10:0] cnt1 ; //计数每个音符重复次数 reg [5 :0] cnt2 ; //计数曲谱中音符个数 reg [16:0] pre_set ; //预装载值 wire [16:0] pre_div ; //占空比 reg [10:0] cishu ; //定义不同音符重复不同次数 wire [10:0] cishu_div ; //音符重复次数占空比 reg flag ; //歌曲种类标志:0小星星,1两只老虎 reg [5 :0] YINFU ; //定义曲谱中音符个数 //歌曲种类标志位 always @(posedge clk or negedge rst_n) begin if(!rst_n) begin flag


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3