fpga开发--蜂鸣器发出连续不同的音调

这篇具有很好参考价值的文章主要介绍了fpga开发--蜂鸣器发出连续不同的音调。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

描述

使用fpga蜂鸣器连续发出do,re,mi,fa,so,la,xi七个不同的音调,每个音调的持续时间为0.5s。

思路

采用状态机实现音调的转化,当do状态持续了0.5s之后转移到re状态,以此类推...采用0.5s的时间flag信号控制状态机的转变。因为不同的音调有不同的频率,所以在每个时钟周期内需要发出不同频率的方波,采用计数器控制占空比,在每个状态下需要设置不同的频率计数器最大值,采用状态机控制计数器的频率最大值。

细节

设置输入clk,rst,输出beep

内部寄存器cnt_time 计数0.5s时间间隔,标志信号time_flag 每当计数0.5s拉高一个周期,当flag拉高时,状态寄存器状态改变

状态机采用三段式编写

设置内部寄存器cnt_wave,记录不同的频率最大值,设置变量wave_num为不同频率的最大值。

代码

module music
#(parameter time_max = 25'd24999999,
	parameter dowave = 17'd95419,
	parameter rewave = 17'd85033,
	parameter miwave = 17'd75756,
	parameter fawave = 17'd71632,
	parameter sowave = 17'd63774,
	parameter lawave = 17'd56817,
	parameter xiwave = 17'd50606
	)
(input wire clk,
input wire rst,
output reg beep);

parameter Do = 3'd0,Re = 3'd1,Mi= 3'd2,Fa = 3'd3,So=3'd4,La=3'd5,Xi=3'd6;
reg [24:0] cnt_time ;
reg [2:0] state,next_state;
reg  		time_flag;
reg [16:0] cnt_wave;
reg [16:0] wave_max;

//产生时钟信号
always@(posedge clk or negedge rst)
begin
	if(rst == 1'd0)
		cnt_time <= 25'd0;
	else if (cnt_time == time_max)
		cnt_time <=25'd0;
	else
		cnt_time <=cnt_time+25'd1;
end

always@(posedge clk or negedge rst)
begin
	if(rst == 1'd0)
		time_flag <= 1'd0;
	else if(cnt_time == (time_max -1))
		time_flag <=1'd1;
	else 
		time_flag<=1'd0;
end


//七个音调状态
always@(posedge time_flag or negedge rst)
begin
	if(rst == 1'd0)
		state <= Do;
	else 
		state <= next_state;
end

always@(*)
begin
	if(rst == 1'd0)
		next_state = Do;
	else 
	begin
		case (state)
		Do: next_state = Re;
		Re: next_state = Mi;
		Mi: next_state = Fa;
		Fa: next_state = So;
		So: next_state = La;
		La: next_state = Xi;
		Xi: next_state = Do;
		default: next_state=Do;
		endcase
	end
end

//产生不同的方波
always@(posedge clk or negedge rst)
begin
	if(rst == 1'd0)
		cnt_wave <= 17'd0;
	else if((cnt_wave == wave_max)|| time_flag == 1'd1)
		cnt_wave <= 17'd0;
	else 
		cnt_wave <=cnt_wave +17'd1;
				
end

always@(posedge clk or negedge rst)
begin
	if(rst ==1'd0)
		beep <=1'd0;
	else if(cnt_wave == wave_max)
		beep <=~beep;
	else 
		beep <=beep;
end

//选择不同的方波计数值
always@(posedge clk )
begin
	case (next_state)
	Do: wave_max <= dowave;
	Re: wave_max <= rewave;
	Mi: wave_max <= miwave;
	Fa: wave_max <= fawave;
	So: wave_max <= sowave;
	La: wave_max <= lawave;
	Xi: wave_max <= xiwave;
	default: wave_max <= dowave;
	endcase
end

endmodule

		
		

测试代码:

`timescale 1ns/1ns
`include"music.v"

module top();

reg clk;
reg rst;
wire beep;

initial
begin
	rst = 1'b0;
	clk = 1'b0;
	#15
	rst = 1'b1;
end

always #10 clk=~clk;

music 
#(.time_max (25'd50),
	.dowave (17'd39),
    .rewave (17'd29),
    .miwave (17'd21),
    .fawave (17'd15),
    .sowave (17'd10),
    .lawave (17'd8),
    .xiwave (17'd4))
m1(clk,rst,beep);

endmodule

仿真波形 

 

fpga开发--蜂鸣器发出连续不同的音调,fpga开发

 错误:

状态变化时采用了时序逻辑,应该用组合逻辑,

cnt_time 计数器无法清零,清零条件应改为计数器计数到最大值或者时间等于0.5s时清零,若只有计数器计数到最大值清零,那么只会在第一个频率内有beep波形文章来源地址https://www.toymoban.com/news/detail-619030.html

到了这里,关于fpga开发--蜂鸣器发出连续不同的音调的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32控制蜂鸣器间隔发出声音(响1s,关闭1s)

    我现在这个蜂鸣器是有缘蜂鸣器,只能发出一种声音。而且是 低电平触发 (根据你们自己的蜂鸣器决定),现在我要做的一个实验就是蜂鸣器响1s,关闭1s。实现间隔的发出声音。 这里我使用的是 定时器6 进行计时。 我这边蜂鸣器对应的引脚是GPIOA_Pin_8 代码也不算多,到这里

    2024年02月12日
    浏览(52)
  • 无缘蜂鸣器——stm32定时器PWM实现控制发出“哆瑞咪发…“七个音及简单音乐

    一、有缘蜂鸣器和无缘蜂鸣器 所谓的 有源蜂鸣器 是指蜂鸣器内部内置振荡电路,一通电就能响。但发生频率固定,音色单一; 无源蜂鸣 器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。人耳能听到的频率范围在20Hz–20kHz之间

    2024年02月02日
    浏览(97)
  • 《FPGA学习》->蜂鸣器播放

    🍎 与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。 蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。本实验采用无源蜂鸣器,蜂鸣器的发声不同是靠频率不同进行控制的

    2024年02月08日
    浏览(45)
  • FPGA蜂鸣器播放音乐

      最近做EDA课设,看到自己的买的板子上有蜂鸣器,所以就打算做一个FPGA控制蜂鸣器播放音乐。   这里我使用的板子是睿智助学的FPGA开发板,板子上的芯片是 EP4CE6E22C8 ,如果是你使用的是其他开发板或者是自己做的板子,就根据原理图,在写完代码时绑定相应的引脚下

    2024年02月06日
    浏览(45)
  • 【FPGA】五、蜂鸣器播放音乐

    文章目录 前言 一、蜂鸣器简介 二、音频音符简介 三、任务要求 四、程序设计 1、设计思路  2、程序代码    总结         蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号。它是一种一体化结构的电子讯响器,采用直流电压供电,被广泛用于计算机、

    2024年02月11日
    浏览(48)
  • 二、17【FPGA】无源蜂鸣器驱动实验

    学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 学习视频:是根据野火FPGA视频教程——第二十讲 https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3      蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器两种类型。 压电式蜂鸣器是以压电陶瓷的压

    2023年04月25日
    浏览(48)
  • 基于Quartus-FPGA制作蜂鸣器的相关教程

    写这篇文章实在是因为自己对这个制作流程很不熟悉,查询了很多资料都没有得到找到自己想要的东西,事倍功半了。由于本人是才开始写csdn,很多东西还不知道咋使用。写得不太好,但还是希望能帮到有需要的小伙伴。如有错误的地方,欢迎大家指正,我们共同进步。对于

    2024年02月09日
    浏览(38)
  • FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例

    ** ** 开发板上电后,通过蜂鸣器播放《两只老虎》。 原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期,再结合开发板具体的系统时钟周期,便可计算出每个音符对应多少个系统时钟周期个数,通过对这些个数计数,便可控制蜂鸣器播

    2024年02月15日
    浏览(131)
  • FPGA拾忆_(10):按键控制蜂鸣器_边沿检测_按键消抖

    1.硬件特征: 轻触式(回弹式)按键         略 蜂鸣器: 分为蜂鸣器按照结构原理不同可分为压电式蜂鸣器和电磁式蜂鸣器。 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、 阻抗匹配器及共鸣箱、外壳等组成; 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组

    2024年04月10日
    浏览(41)
  • 驱动开发-蜂鸣器、灯、风扇、马达

    头文件 驱动程序 应用程序

    2024年02月16日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包