基于FPGA的音乐喷泉控制Verilog代码Quartus仿真

名称:基于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
源代码

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

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于FPGA的数字计频器的Verilog代码,同时包含了Quartus II的仿真测试代码: ```verilog module freq_counter ( input clk, // 输入时钟 input reset, // 复位信号 input start, // 开始计数信号 output reg [31:0] freq_count // 输出计数器计数值 ); reg [31:0] count; // 内部计数器 always @(posedge clk) begin if (reset) begin count <= 0; freq_count <= 0; end else if (start) begin count <= count + 1; freq_count <= count; end end endmodule module freq_counter_test(); reg clk; reg reset; reg start; wire [31:0] freq_count; freq_counter counter( .clk(clk), .reset(reset), .start(start), .freq_count(freq_count) ); initial begin clk = 0; reset = 1; start = 0; #10 reset = 0; #100 start = 1; #1000 start = 0; #100000 $finish; end always #5 clk = ~clk; endmodule ``` 在这个例子中,我们定义了一个频率计数器模块`freq_counter`,它包含了一个时钟输入`clk`、一个复位信号`reset`、一个开始计数信号`start`和一个计数器计数值输出`freq_count`。在每个时钟上升沿时,如果复位信号为1,则计数器复位为0;如果开始计数信号为1,则计数器加1,并将计数器计数值赋值给输出端口。 我们还定义了一个测试模块`freq_counter_test`,它包含了一个时钟输入`clk`、一个复位信号`reset`、一个开始计数信号`start`和一个计数器计数值输出`freq_count`。在测试模块中,我们通过给时钟、复位和开始计数信号赋值的方式来测试计数器模块的功能。具体来说,我们在仿真开始时将复位信号置为1,经过一段时间后将其置为0,然后在一定时间后将开始计数信号置为1,经过一定时间后再将其置为0。最后,在一定时间后仿真结束。 在Quartus II中,我们可以通过仿真波形来验证计数器模块是否能够正确地计数。具体来说,我们可以打开波形编辑器,将测试模块的输入和输出端口添加到波形中,然后运行仿真。在仿真结果中,我们可以看到计数器模块的计数值是否与预期相符。如果相符,则说明计数器模块的功能是正确的。 希望这个Verilog代码Quartus II仿真测试代码对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值