名称:基于FPGA的音乐喷泉控制Verilog代码Quartus仿真(文末获取)

软件:Quartus

语言:Verilog

代码功能:

基于FPGA的音乐喷泉控制

1、具有启动控制按键,按下后开始

2、喷泉具有6个喷嘴,可以手动切换三种工作模式

3、输入的音乐信号分为低音、中音、高音

4、将输入的音转换为对应的pwm波占空比参数

5、不同的工作模式下,6个喷嘴对应pwm波的分部不同

音乐喷泉

1.程序文件

2.程序运行

3.程序RTL图

4.Testbench

5.仿真图

fountain_out为输出的6喷嘴[5:0],喷嘴输出为不同占空比的PWM波

Mode 切换不同模式

Start为高电平时启动

高中低对应的占空比不一样

输出的6个喷嘴,下图中喷嘴5,3,1分别对应高、中、低,4,2,0未打开,不同模式下对应喷嘴不同,启动的喷嘴也不同。

下图中可看到不同模式下喷嘴启动不一样。

状态机

状态图

部分代码展示:

module Musical_fountain(

input clk,

input start,//为高电平时开启

input [1:0] mode,//三种模式,00,01,10

input [2:0] low_music,//低音,0~7

input [2:0] mid_music,//中音,0~7

input [2:0] hig_music,//高音,0~7

output [5:0] fountain_out //6个喷嘴输出

);

wire [7:0] low_music_zkb;

wire [7:0] mid_music_zkb;

wire [7:0] hig_music_zkb;

//将输入的音转换为对应的pwm占空比参数

zhankongbi low_music_zhankongbi(

. clk(clk),

. voice(low_music),

. pwm_zhankongbi(low_music_zkb)

);

//将输入的音转换为对应的pwm占空比参数

zhankongbi mid_music_zhankongbi(

. clk(clk),

. voice(mid_music),

. pwm_zhankongbi(mid_music_zkb)

);

//将输入的音转换为对应的pwm占空比参数

zhankongbi hig_music_zhankongbi(

. clk(clk),

. voice(hig_music),

. pwm_zhankongbi(hig_music_zkb)

);

//分频100

reg [7:0] pwm_cnt=8'd0;

always@(posedge clk)

if(pwm_cnt>=8'd100)

pwm_cnt<=8'd0;

else

pwm_cnt<=pwm_cnt+8'd1;

reg low_music_pwm=0;

reg mid_music_pwm=0;

reg hig_music_pwm=0;

always@(posedge clk)

if(start==0)

low_music_pwm<=0;

else

if(low_music_zkb>pwm_cnt)

low_music_pwm<=1;//产生低音PWM波

else

low_music_pwm<=0;

always@(posedge clk)

if(start==0)

mid_music_pwm<=0;

else

if(mid_music_zkb>pwm_cnt)

mid_music_pwm<=1;//产生中音PWM波

else

mid_music_pwm<=0;

always@(posedge clk)

if(start==0)

hig_music_pwm<=0;

else

if(hig_music_zkb>pwm_cnt)

hig_music_pwm<=1;//产生高音PWM波

else

hig_music_pwm<=0;

reg [5:0] fountain=6'd0;

parameter S0=2'b00;

parameter S1=2'b01;

parameter S2=2'b10;

reg [1:0] state=2'b00;

always@(posedge clk)

case(state)//mode控制不同模式,即改变喷嘴对应不同的音,可自己组合

S0:

if(mode==2'b01)

state<=S1;

else if(mode==2'b10)

state<=S2;

else

state<=S0;

S1:

if(mode==2'b00)

state<=S0;

else if(mode==2'b10)

state<=S2;

else

state<=S1;

S2:

if(mode==2'b00)

state<=S0;

else if(mode==2'b01)

state<=S1;

else

源代码

 扫描文章末尾的公众号二维码

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: