FPGA项目(4)--基于FPGA的电子琴

这篇具有很好参考价值的文章主要介绍了FPGA项目(4)--基于FPGA的电子琴。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本次设计是基于FPGA的电子琴,设计要求如下:

fpga电子琴,FPGA项目,fpga开发,嵌入式硬件

         本次我采用modelsim仿真的方式验证设计功能的正确性。工作时钟选择50MHZ。

        所谓电子琴,本质就是用按键控制蜂鸣器发出不同频率的声音。我们平时所接触的音乐,从低音到高音,从哆瑞咪发到嗦啦西,都有相应的频率与之对应。音符与频率对应关系如下:

fpga电子琴,FPGA项目,fpga开发,嵌入式硬件

         所以整个设计的思路就是,按下按键,控制蜂鸣器的管脚产生相应频率的方波即可。下面首先给出整个设计的总体rtl视图,然后再根据此图讲解各个模块

        fpga电子琴,FPGA项目,fpga开发,嵌入式硬件

         首先,clock_gen模块的作用就是对系统时钟进行分频,系统时钟是50M,分频产生两个时钟,一个1M,一个1K。具体代码如下所示,分频细节不做具体介绍。

        

module clock_gen(
	input			clk,		//50M时钟
	input			rst_n,		
	output	reg		clk_1M,		
	output	reg		clk_1k		
);  

parameter	div_factor_1MHz = 6'd25;		//1MHz	分频系数
parameter	div_factor_1K = 9'd500;			//1K	分频系数

reg	[15:0]	cnt1;
always @ (posedge clk or negedge rst_n) 
begin
    if (!rst_n)begin
		cnt1 <= 0;
		clk_1M <= 0;
	end else 
		if(cnt1 == div_factor_1MHz-1)begin
			cnt1 <= 1'b0;
			clk_1M <= ~ clk_1M;
		end else
			cnt1 <= cnt1 + 1'b1;
end 

reg	[8:0]	cnt2;
always @ (posedge clk_1M or negedge rst_n) 
begin
    if (!rst_n)begin
		cnt2 <= 0;
		clk_1k <= 0;
	end else 
		if(cnt2 == div_factor_1K-1)begin
			cnt2 <= 1'b0;
			clk_1k <= ~clk_1k;
		end else
			cnt2 <= cnt2 + 1'b1;
end 

endmodule

        Key_input模块,以1KHZ信号为驱动时钟,处理按键信息,将按键输入的信息经过延时消抖以后,再编码输出。按键默认电平为高电平(1),也就是说,按键不按下为1,按下为0其中,按键为十位宽。最高三位代表的是音高,即决定低音,中音,高音。低七位代表的是音符。实现代码如下:

        

module key_input(
	input				clk_1k,
	input				rst_n,
	input		[9:0]	key_in,
	output reg	[9:0]	key_val
);

parameter delay_time = 8'd20;	//delay20ms
reg	[7:0] cnt;
reg [1:0] state;
always @(posedge clk_1k or negedge rst_n) 
begin
	if(!rst_n)begin
			key_val <= 10'b0000000000;
			cnt <= 0;
			state <= 0;
	end else 
		case(state)
			2'd0 : begin//check
				key_val <= 10'b0000000000;
				if(key_in==10'b1111111111)
					state <= 0;
				else
					state <= 1;
				end
					
			2'd1 : //delay
				if(cnt < delay_time-1)begin
					cnt <= cnt + 1'b1;
					state <= 1;
				end else begin
					cnt <= 8'd0;
					state <= 2;
					end
					
			2'd2 :begin //check again
				case(key_in)
					10'b1111111110 : key_val <= 10'b0000000001;
					10'b1111111101 : key_val <= 10'b0000000010;
					10'b1111111011 : key_val <= 10'b0000000100;
					10'b1111110111 : key_val <= 10'b0000001000;
					10'b1111101111 : key_val <= 10'b0000010000;
					10'b1111011111 : key_val <= 10'b0000100000;
					10'b1110111111 : key_val <= 10'b0001000000;
					10'b1101111111 : key_val <= 10'b0010000000;
					10'b1011111111 : key_val <= 10'b0100000000;
					10'b0111111111 : key_val <= 10'b1000000000;
					default        : key_val <= 10'b0000000000;
				endcase
				state <= 3;
				end
				
			2'd3 : begin //waiting key up
				if(key_in==10'b1111111111)
					state <= 0;
				else
					state <= 3;
				end
		endcase
end

endmodule

        Key_process模块,主要是从编码好的按键信息中,提取出音高、音符信息。并将两种信息合并,组合成为一个变量TN,将其传递后后面的模块,用于蜂鸣器发声。

        

module key_processor(
	input 			clk,
	input 			rst_n,
	input  [9:0]	key,
	output [4:0]	TN
);

reg[2:0] notes;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		notes <= 3'b000;
	else
		if(key[0] == 1'b1)
			notes <= 3'b001;
		else if(key[1] == 1'b1)
			notes <= 3'b010;
		else if(key[2] == 1'b1)
			notes <= 3'b011;
		else if(key[3] == 1'b1)
			notes <= 3'b100;
		else if(key[4] == 1'b1)
			notes <= 3'b101;
		else if(key[5] == 1'b1)
			notes <= 3'b110;
		else if(key[6] == 1'b1)
			notes <= 3'b111;
		else
			notes <= 3'b000;
end

reg[1:0] register;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		register <= 2'b00;
	else
		if(key[7] == 1'b1)
			register <= 2'b00;
		else if(key[8] == 1'b1)
			register <= 2'b01;
		else if(key[9] == 1'b1)
			register <= 2'b10;
		else
			register <= register;
end

assign TN = {register,notes};

endmodule

        Speaker模块是电子琴发声的关键模块,它根据音高、音符信息,决定电子琴具体产生多少频率的声音。

//蜂鸣器驱动
module speaker(
	input			clk   ,
	input			rst_n ,
	input  [4:0]	TN    ,
	output			spks
);

reg [10:0] temp;
always@(posedge clk)
begin
	case(TN)
		//
		5'b00001 : temp <= 11'd1908;	//低音 1
		5'b00010 : temp <= 11'd1701;	//低音 2
		5'b00011 : temp <= 11'd1515;	//低音 3
		5'b00100 : temp <= 11'd1433;	//低音 4
		5'b00101 : temp <= 11'd1276;	//低音 5
		5'b00110 : temp <= 11'd1136;	//低音 6
		5'b00111 : temp <= 11'd1012;	//低音 7
		//
		5'b01001 : temp <= 11'd956;		//中音 1
		5'b01010 : temp <= 11'd852;		//中音 2
		5'b01011 : temp <= 11'd759;		//中音 3
		5'b01100 : temp <= 11'd716;		//中音 4
		5'b01101 : temp <= 11'd638;		//中音 5
		5'b01110 : temp <= 11'd568;		//中音 6
		5'b01111 : temp <= 11'd506;		//中音 7
		//
		5'b10001 : temp <= 11'd478;		//高音 1
		5'b10010 : temp <= 11'd426;		//高音 2
		5'b10011 : temp <= 11'd379;		//高音 3
		5'b10100 : temp <= 11'd358;		//高音 4
		5'b10101 : temp <= 11'd319;		//高音 5
		5'b10110 : temp <= 11'd284;		//高音 6
		5'b10111 : temp <= 11'd253;		//高音 7 
		
		default	 : temp <= 0;			//静音
	endcase
end

reg [10:0] cnt;
reg wave;
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)begin
		cnt <= 11'd0;
		wave <= 0;
	end else begin
		if(temp != 0)begin
			if(cnt >= temp-1)begin
				cnt <= 11'd0;
				wave <= ~ wave;
			end else
				cnt <= cnt + 1'b1;
		end else
			wave <= 0;
		end
end

assign spks = wave;

endmodule












        这里最关键的是延迟变量temp如何选择的问题。以低音1为例,它的频率为262,speaker模块的驱动时钟是1M,而方波又是由等宽的高电平和低电平共同组成。所以要让spks取反,应该延迟的时间是1M/(262*2)=1908

           接下来就是进行modelsim仿真。仿真分析:

    fpga电子琴,FPGA项目,fpga开发,嵌入式硬件

         低音 5,对应程序内的编码(TN)为 00101,输出方波频率(spks)为392,与上表对照可知,结果正确

       fpga电子琴,FPGA项目,fpga开发,嵌入式硬件

         中音4,对应程序内的编码(TN)为 01100,输出方波频率(spks)为698,与上表对照可知,结果正确

fpga电子琴,FPGA项目,fpga开发,嵌入式硬件

         高音7,对应程序内的编码(TN)为 10111,输出方波频率(spks)为1.97k,与上表对照可知,结果正确

        

        完整的工程文件如下:(私我,便宜拿)

基于FPGA的电子琴设计仿真资源-CSDN文库https://download.csdn.net/download/guangali/88640298     文章来源地址https://www.toymoban.com/news/detail-759884.html

到了这里,关于FPGA项目(4)--基于FPGA的电子琴的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA用vhdl语言设计简单硬件电子琴设计

    硬件电子琴设计 目录 一、 设计内容简介 二、系统框图 三、代码说明 四、 管脚及管脚对应图 一、设计 内容简介 当按下琴键时,扬声器发出该琴键对应的音阶,同时数码管显示音阶数字。设置了一个模式切换键可选择低、中低、中高、高音4档音阶,每按下一次则可切换不

    2024年02月04日
    浏览(39)
  • 51单片机项目(9)——基于51单片机的电子琴设计

    简易电子琴设计设计内容: 1.用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符1.23.4.,5,6,  2.键按下的时间长短表征节拍的长短,用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 (代码及其工程文件放在最后) 电路图如下: 51单片机电子琴是一种基于51单片机(

    2024年02月09日
    浏览(48)
  • 基于单片机的电子琴设计

    摘 要 读书、看电影、听音乐,都是最常见的丰富内心世界的良剂。听音乐,作为陶冶情操、提升境界最便捷的方式,正受到越来越多人们的欢迎。音乐可以很轻松的融入各种场合,给人们带来很轻松的氛围,只有真正的接触它,才可以真正的感受到它的魅力。 本次设计正是

    2024年03月18日
    浏览(45)
  • 29、基于51单片机简易电子琴(有存储功能)系统设计

     随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴。我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器等等也很

    2024年02月03日
    浏览(49)
  • 基于51单片机的7键电子琴音乐播放器proteus

    本设计仅供参考 基于51单片机的7键电子琴音乐播放器proteus(仿真+源码+原理图) 原理图:Altium Designer 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号C0036 有需要学习可以点击下方链接下载 资料下载链接 设计介绍: 本次设计首先对单片机设计简易电子琴仔细分

    2024年02月11日
    浏览(42)
  • 基于AT89C51单片机的电子琴设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87848430?spm=1001.2014.3001.5503 源码获取 主要内容: 设计一个简易的电子琴,至少具有可以弹奏并发出不同的音调。电子琴方案主要分为实验的系统分析,具体的实施方案,以及最终的实验检验,最终

    2024年02月07日
    浏览(64)
  • 基于AT89C52单片机的简易电子琴设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853299?spm=1001.2014.3001.5503 源码获取 主要内容: 本设计是基于51系列的单片机进行的设计,利用所给键盘的八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间

    2024年02月04日
    浏览(50)
  • Proteus仿真--基于51单片机的可演奏电子琴设计(仿真文件+程序)

    本文主要介绍基于51单片机的可演奏电子琴设计(完整仿真源文件及代码见文末链接) 仿真图如下 其中通过矩阵键盘可以实现不同的音乐播放 仿真运行视频 Proteus仿真--基于51单片机的可演奏电子琴设计(仿真文件+程序) 附完整Proteus仿真资料+代码资料 百度网盘链接: https:

    2024年02月06日
    浏览(44)
  • 基于51单片机的16键电子琴音乐盒设计proteus仿真原理图程序

    功能: 0.本项目采用STC89C52作为单片机系统的控制MCU 1.LCD1602液晶实时显示时间和当前工作模式 2.支持电子琴模式和歌曲模式(内置8首歌曲) 3.短触’设置/切换’键可切换工作模式 4.长按’设置/切换‘键可进入时间设置模式 5.采用DC002作为电源接口可直接输入5V给整个系统供电

    2024年02月12日
    浏览(44)
  • 如何使用NE555设计一个简易电子琴

    今天来分享个使用NE555制作一个电子琴。 首先看到音调和频率的关系  NE555电子器的原理就是利用不同的按键使NE555发出不同频率的方波,从而产生不同的音调 NE555产生方波电路如下: 接上喇叭后就能发出不同的音调了 其中RB用不同的电阻加按键代替,当按下相应的按键后,

    2024年02月11日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包