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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章