⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2_mouse.v

📁 ps2鼠标驱动,verilog 编写
💻 V
字号:
//*******************************************************************************************************////******************************************************************************************************////------------------------------------------------------------------moudule: ps2_mouse_ctr-----------------------------------------------////------------------------------------------------------------------Xu Pengyuan------3051109145-----------------------------------------////----------------------------------------------------------------------time: 30_6_2008----------------------------------------------------////----------------------------------------------------------------------time: 1_7_2008:(23:37)-----------------------------------------////******************************************************************************************************////******************************************************************************************************//module	ps2_mouse_ctr(					input	wire		reset,					input	wire		clk,					inout				ps2_data_mouse,					inout				ps2_clk_mouse,					output	reg[7:0]	xcont			=	8'd0,					output	reg[7:0]	ycont			=	8'd0,					output	reg			lfbut			=	1'b0,					output	reg			rgbut			=	1'b0,					output	wire		all_data_rdy					);	reg			ps2_data_en		=	1'b1;	reg			ps2_clk_en		=	1'b1;	reg[2:0]		ps2_clk_buf		=	3'b000;	reg[10:0]		data_buf_in		=	11'd0;	reg[7:0]		memory_1		=	8'd0;	reg[7:0]		memory_sign		=	8'd0;	reg[7:0]		memory_xcont	=	8'd0;	reg[7:0]		memory_ycont	=	8'd0;	reg			state_b			=	1'b0;	reg			state_b_1		=	1'b0;	reg[31:0]		cont_rst		=	31'd0;	reg			sdata			=	1'b0;	reg[3:0]		cont_rec		=	4'b0000;	reg[3:0]		cont_sdata		=	4'd0;	reg[1:0]		mmr_state		=	2'b00;	reg[1:0]		mmr_state_next	=	2'b01;	reg[1:0]		get_data_en		=	2'b00;	reg[3:0]		no_use			=	4'd0;	wire			get_data;	assign		all_data_rdy	=	((get_data_en == 2'b10)&&(mmr_state == 2'b11));	assign		get_data	=	(cont_rec==4'b1010);	assign		ps2_clk_mouse	=	ps2_clk_en?1'bz:1'b0;	assign		ps2_data_mouse	=	ps2_data_en?1'bz:sdata;//*************************************************************************************////---------------------------------reset the systerm--------------------------------------------------////************************************************************************************////---------------------------------ps2_clk_mouse buffer-----------------------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)		ps2_clk_buf[2:0]	=	3'b000;		else		begin			ps2_clk_buf[2]	=	ps2_clk_buf[1];			ps2_clk_buf[1]	=	ps2_clk_buf[0];			ps2_clk_buf[0]	=	ps2_clk_mouse;		end	end//---------------------------all kind of signs-------------------------------------------------//	always@(posedge clk	or negedge reset)	begin		if(reset==0)		begin			state_b		<=	1'b0;			state_b_1	<=	1'b0;			ps2_clk_en	<=	1'b0;		end		else if(cont_rst	==	32'd12000000)			ps2_data_en	<=	1'b0;		else if(cont_rst	==	32'd14000000)		begin			ps2_clk_en	<=	1'b1;			state_b		<=	1'b1;		end		else if((ps2_clk_buf[2:0]	==	3'b111)	&&	(cont_sdata	==	4'd11))		begin			ps2_data_en	<=	1'd1;			state_b_1	<=	1'b1;		end	end//---------------------counter for pulling down the ps2_clk for 150us--------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)		begin			cont_rst	<=	32'd0;		end		else if(state_b	==	1'b0)		begin			if(cont_rst	==	32'd14000000)			cont_rst	<=	32'd0;			else			cont_rst	<=	cont_rst+1;		end	end//--------------------------send the '0xf4' commond to ps2 mouse---------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)		begin			sdata	<=	1'b0;		end		else if((state_b	==	1)	&&	(state_b_1	==	0))		begin			if(ps2_clk_buf	==	3'b110)			begin				case(cont_sdata)					4'd1	:sdata	<=	1'b0	;					4'd2	:sdata	<=	1'b0	;					4'd3	:sdata	<=	1'b1	;					4'd4	:sdata	<=	1'b0	;					4'd5	:sdata	<=	1'b1	;					4'd6	:sdata	<=	1'b1	;					4'd7	:sdata	<=	1'b1	;					4'd8	:sdata	<=	1'b1	;					4'd9	:sdata	<=	1'b0	;					4'd10	:sdata	<=	1'b1	;				endcase			end		end	end//----------------------------counter for signing how many bits of data have been sent---------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)		cont_sdata	<=	4'd0;		else if((ps2_clk_buf[2:0]	==	3'b001)	&&	(state_b_1	==	1'b0)	&&	(state_b==1'b1))		begin			if(cont_sdata	==	4'd11)				cont_sdata	<=	4'd0;			else				cont_sdata	<=	cont_sdata+1;		end	end//*************************************************************************************////--------------------------receive the data from the ps2 mouse-------------------------------------////*************************************************************************************////-------------get the data from ''ps2_data_mouse and put it in the data_buf_in---------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)		begin			data_buf_in	=	11'd0;		end		else if((state_b_1	==	1'b1)&&(ps2_clk_buf[2:0]	==	3'b110))		begin			data_buf_in[0] =	data_buf_in[1];			data_buf_in[1]	=	data_buf_in[2];			data_buf_in[2]	=	data_buf_in[3];			data_buf_in[3]	=	data_buf_in[4];			data_buf_in[4]	=	data_buf_in[5];			data_buf_in[5]	=	data_buf_in[6];			data_buf_in[6]	=	data_buf_in[7];			data_buf_in[7]	=	data_buf_in[8];			data_buf_in[8]	=	data_buf_in[9];			data_buf_in[9]	=	data_buf_in[10];			data_buf_in[10]	=	ps2_data_mouse;		end	end//------------------------------put the data in the right memory---------------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)		begin			memory_1[7:0]		<=	8'd0;			memory_sign[7:0]	<=	8'd0;			memory_xcont[7:0]	<=	8'd0;			memory_ycont[7:0]	<=	8'd0;		end		else if(get_data_en[1:0]	==	2'b10)		begin			case(mmr_state[1:0])			2'b00:	{memory_1[7:0],no_use[0]}		<=	{data_buf_in[8:0]};			2'b01:	{memory_sign[7:0],no_use[1]}	<=	{data_buf_in[8:0]};			2'b10:	{memory_xcont[7:0],no_use[2]}	<=	{data_buf_in[8:0]};			2'b11:	{memory_ycont[7:0],no_use[3]}	<=	{data_buf_in[8:0]};			endcase		end	end//-----------------------make the enable signal of getting data from buffer--------------------------////--------------------part1----------------------------------------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)			cont_rec[3:0]	<=	4'b1111;		else if((state_b_1	==	1'b1)&&(ps2_clk_buf[2:0]	==	3'b001))		begin			if(cont_rec	==	4'b1010)				cont_rec[3:0]	<=	4'b0000;			else				cont_rec[3:0]	<=	cont_rec[3:0]+1;		end	end//--------------------part2------------------------------------------------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)			get_data_en	=	2'b00;		else		begin			get_data_en[1]	=	get_data_en[0];			get_data_en[0]	=	get_data;		end	end//----------------------------the sign of which memory should the data be put in-------------------------////-------------------part1------------------------------------------------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)			mmr_state[1:0]	<=	2'b00;		else if(get_data_en	==	2'b10)			mmr_state	<=	mmr_state_next;	end//---------------------------part2-----------------------------------------------------------------//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)			mmr_state_next	<=	2'b01;		else                          		begin                                         			case(mmr_state)           			2'b00:	mmr_state_next	<=	2'b01;			2'b01:	mmr_state_next	<=	2'b10;			2'b10:	mmr_state_next	<=	2'b11;			2'b11:	mmr_state_next	<=	2'b01;			endcase		end                           	end //*********************************************************************************************************////--------------------------------give the output signal----------------------------------------------////**********************************************************************************************************//	always@(posedge	clk	or	negedge	reset)	begin		if(reset	==	0)		begin			xcont	<=	8'd0;			ycont	<=	8'd0;			lfbut	<=	1'b0;			rgbut	<=	1'b0;		end		else if((get_data_en == 2'b10)&&(mmr_state == 2'b11))		begin			xcont	<=	memory_xcont;			ycont	<=	{data_buf_in[8:1]};			lfbut	<=	memory_sign[0];			rgbut	<=	memory_sign[1];		end		else		begin			xcont	<=	xcont;			ycont	<=	ycont;			lfbut	<=	lfbut;			rgbut	<=	rgbut;		end	endendmodule                                                                   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -