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

📄 read_ps2.v

📁 Pong is a mixed schematic, VHDL, Verilog project featuring the PS2 and VGA monitor connections of
💻 V
字号:
////////////////////////////////////////////////////////////////////////////////

// Copyright (c) 1995-2004 Xilinx, Inc.

// All Right Reserved.

////////////////////////////////////////////////////////////////////////////////

//   ____  ____ 

//  /   /\/   / 

// /___/  \  /    Vendor: Xilinx 

// \   \   \/     Version : 7.1i

//  \   \         Application : ISE

//  /   /         Filename : read_ps2

// /___/   /\     Timestamp : 09/20/2004 11:12:50

// \   \  /  \ 

//  \___\/\___\ 

//

//

//Design Name: PONG

//
// This module interprets the scan code from the keyboard and outputs the  
// corresponding signal to move a paddle or serve. 



`timescale 1ns / 1ps



module read_ps2(Clk, 

                PS2_Clk, 

                PS2_Data, 

                Reset,
					 ps2_code, 

                left_dir, 

                right_dir,
					 serve
					 );


	 input Clk;

    input PS2_Clk;

    input PS2_Data;

    input Reset;

   output [1:0] left_dir;

   output [1:0] right_dir;

   output [7:0] ps2_code; 
	output serve;

   	reg [1:0] left_dir;

   	reg [1:0] right_dir;
		reg serve;

 	  	reg read;   
	 	wire data_ready;
		reg stopkey;
		reg state;
		wire trigger;


  PS2_CTRL ps2_ctrl ( 
	.Clk(Clk),
	.DoRead(read),
	.PS2_Clk(PS2_Clk),
	.PS2_Data(PS2_Data),
	.Reset(Reset),
	.Scan_Code(ps2_code),
	.scan_ready(data_ready),
	.trigger(trigger)
	);



   always @(posedge Clk or posedge Reset)
      if (Reset) begin		  	right_dir <= 2'b00;						  // No right paddle movement
		  	left_dir <= 2'b00;						  // No left paddle movement
			serve <= 1'b1;								  // Start with ball being served
			read = 1'b1;								  // Ready to receive scan code
			stopkey <= 1'b0;							  // Stop key code has not been read
			state <= 2'b0;
      end
      else if ((data_ready) | (!read)) begin		 // New key data has arrived
			case (state)
				1'b0 : begin
					if (!stopkey) begin			 // new data is not releasing a key
						case (ps2_code)
			  	   		8'b01110101: begin	  				   // up arrow key
							       right_dir <= 2'b01;	  			//right up			                end
			      		8'b01110010: begin						// down arrow key			                   right_dir <= 2'b10;	  			// right down			                end			      		8'b00011101: begin					   // w key				                   left_dir <= 2'b01;				//	left up			                end			      		8'b00011011: begin						// s key			                   left_dir <= 2'b10;				// left down			                end			      		8'b00101001: begin						// space bar key			                   serve <= 1'b1;					// serve ball			                end
							8'b11110000: begin						// A key has been released			                  stopkey <= 1'b1;	  				// set stopkey bit 
			          			serve <= "0";								                end			      		default: begin			                  right_dir <= 2'b00;	  			                  left_dir <= 2'b00;
									serve <= "0";			               end
						endcase  		   	  // end of case (ps2_code) statement
					  state <= 1'b1;
					end
					else begin	 				  // new data is telling which key was just released
						case (ps2_code)
			  	   		8'b01110101: begin	  				   // up arrow key
							       right_dir <= 2'b00;				// stop right paddle up	motion
								 	 stopkey <= 1'b0;			                end
			      		8'b01110010: begin						// down arrow key			                   right_dir <= 2'b00;	  			// stop right paddle down motion
									 stopkey <= 1'b0;			                end			      		8'b00011101: begin					   // w key				                   left_dir <= 2'b00;				//	stop left paddle up motion
									 stopkey <= 1'b0;			                end			      		8'b00011011: begin						// s key			                   left_dir <= 2'b00;				// stop left paddle down motion
									 stopkey <= 1'b0;			                end
							8'b11100000: begin						// Extended code key			                   stopkey <= 1'b1;			   	// Check next ps2 entry for stop											 			                end			      		8'b00101001: begin						// space bar key			                   serve <= 1'b0;					// stop serve ball
									 stopkey <= 1'b0;			                end
			      		default: begin							end 				
				  	   endcase 									      // end of case (ps2_code) statement
						state <= 1'b1;
					end 
					read = 1'b0;
				end

				1'b1 : begin
					if (!trigger) begin 
						read = 1'b1;									// resets read bit to enable PS2_Ctrl input
				 		state <= 1'b0;
					end
				end				
			endcase
		end	// End of if (read_data) statement

endmodule

⌨️ 快捷键说明

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