19.蜂鸣器

按alt可以竖向选择文本

用的是正点原子的fpga教程

有源(直接加直流)与无源(外加震荡源)蜂鸣器,区别在于是否有黑胶。要区分正负极

按键抖动时间,一般设置为20ms

多模块要记得将其中一个设为顶层模块,右键菜单选择即可。或者在assignment→setting里面设置

 按键延时代码

module key_debounce(
	input clk,
	input rst_n,
	
	input key,
	output reg key_value,
	output reg key_flag
);
reg key_reg;
reg [19:0]delay_cnt;
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		key_reg<=1'b1;
		delay_cnt<=20'd0;
	end
	else begin
		key_reg<=key;
		if(key!=key_reg)
			delay_cnt<=20'd1000_0000;
		else begin
			if(delay_cnt>20'd0)
				delay_cnt<=delay_cnt-1'b1;
			else
				delay_cnt<=20'd0;
		end
	end
	
end

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		key_value<=1'b1;
		key_flag <=1'b0;
	end
	else begin
		if(delay_cnt==20'd1)begin
			key_flag<=1'b1;
			key_value<=key;
		end
		else begin
			key_flag<=1'b0;
			key_value<=key_value;
		end
	end
	
end
endmodule

蜂鸣器控制代码

module beep_control(
      
      input        clk,     
      input        rst_n,   
      
      input        key_flag,    
      input        key_value,	
      output  reg  beep         
  );
  

always @ (posedge clk or negedge rst_n) begin
    if(!rst_n)
        beep <= 1'b1;
    else if(key_flag && (~key_value))  
        beep <= ~beep;        
end
    
endmodule 

顶层模块代码

module kep_beep(
	input	clk,
	input	rst_n,
	
	input	key,
	output	beep
);

wire key_value;
wire key_flag;

key_debounce u_key_debounce(
	.clk(clk),
	.rst_n(rst_n),
	
	.key(key),
	.key_value(key_value),
	.key_flag(key_flag)
);

beep_control u_beep_control(
	.clk(clk),
	.rst_n(rst_n),
	
	.key_flag(key_flag),
	.key_value(key_value),
	.beep(beep)
);
endmodule

 对应的模块图:

发布了51 篇原创文章 · 获赞 1 · 访问量 623

猜你喜欢

转载自blog.csdn.net/weixin_44737922/article/details/105137628