FPGA学习笔记(三)------按键蜂鸣器

//***********Copyright (c)************//
//-------------------------------------
// File name:           my_key_led
// Last modified Date:  2020/6/11 10:30
// Last Version:        V1.1
// Descriptions:        按键蜂鸣器
//	key0    				 	右-左流水灯
//	key1      				左-右流水灯
//	key2      				全闪烁
//	key3       				全亮
//-------------------------------------
// 引脚分配,高电平响
// sys_clk     E1
// sys_rst_n   M1
//	key			E16
//	beep			D12
//-------------------------------------
//*************************************//
//顶层代码模块
module top_key_beep (
//input
input sys_clk, //时钟信号50Mhz
input sys_rst_n, //复位信号
input key, //按键信号
//output
output beep //蜂鸣器控制信号
);

//wire define
wire key_value;
wire key_flag;

//**************************************
//**				 main code
//**************************************

//例化按键消抖模块
key_debounce u_key_debounce
(
	.sys_clk 			(sys_clk),
	.sys_rst_n 			(sys_rst_n),

	.key            (key),
	.key_flag       (key_flag),
	.key_value      (key_value)
);

//例化蜂鸣器控制模块
beep_control u_beep_control (
    .sys_clk        (sys_clk), 
    .sys_rst_n      (sys_rst_n),
    
    .key_flag       (key_flag),      
    .key_value      (key_value),
    .beep           (beep)
);
endmodule
//蜂鸣器控制模块
module beep_control
(
	//input
	input	sys_clk,
	input	sys_rst_n,		//复位信号,低电平有效
	input	key_flag,		//按键有效信号
	input	key_value,		//按键信号
	//output
	output	reg	beep	//蜂鸣器控制信号
);

//**************************************
//**				 main code
//**************************************
always @	(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)
	beep<=1'b1;    //复位蜂鸣器响
	else
		if(key_flag&&(~key_value)) //按键有效按下
			beep=~beep;					//交替响
		else
			beep<=beep;	
end

endmodule
//按键消抖模块代码
module	key_debounce
(
	//input
	input sys_clk,
	input sys_rst_n,
	input	key,
	//output  需要赋值 reg
	output	reg	key_value,	//按键消抖后的数据
	output	reg	key_flag 	//按键数据有效信号
);

//reg	define
reg	[19:0]	delay_count;	//计数延时
reg				key_reg;

//**************************************
//**				 main code
//**************************************
always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)			//如果复位
		begin
			key_reg <=1'b1;
			delay_count<=20'd0;
		end
	else
		begin
			key_reg <=key;
			if(key_reg!=key)
				delay_count<=20'd1000_000;
			else if(key_reg==key)
				begin
				if(delay_count>20'd0)
					delay_count<=delay_count-1'b1;
				else
					delay_count<=20'd0;		
				end
		end	
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)
		begin
			key_flag<=1'b0;
			key_value<=1'b1;
		end
	else
		begin
			if(delay_count==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

你可能感兴趣的:(FPGA,verilog,fpga)