// slider.v -- Interface to Windows slider application
// Ed Doering
// 07/25/2000
//
// Accepts information from parallel port (need more description)
//
/*
Sliders U? (
	// Inputs: 
);
*/

//-------------------------------------------------------------------------------



module Sliders ( 
	// Interface to Windows slider application 

	// Inputs: 
	I$Clock	// Master clock (must be approximately 12MHz)
,
	I$Reset	// Master reset, active high
,
	I$ParallelPort	// Lower six bits of PC parallel port

	
	// Outputs:
	
`ifdef UseSliderA
,
	O$SliderA	// Slider value A
`endif

`ifdef UseSliderB
,
	O$SliderB	// Slider value B
`endif

`ifdef UseSliderC
,
	O$SliderB	// Slider value C
`endif

); 

// Port mode declarations:
input	I$Clock;
input	I$Reset;
input	[5:0]	I$ParallelPort;
`ifdef UseSliderA
output	[`SliderBitsA - 1 : 0]	O$SliderA;
`endif
`ifdef UseSliderB
output	[`SliderBitsB - 1 : 0]	O$SliderB;
`endif
`ifdef UseSliderC
output	[`SliderBitsC - 1 : 0]	O$SliderC;
`endif

// Constant parameter declarations
parameter	p$ShiftRegisterBits	= 16;
`ifdef UseSliderA
parameter	p$SliderAddressA	= `SliderAddressA;
parameter	p$SliderBitsA		= `SliderBitsA;
`endif
`ifdef UseSliderB
parameter	p$SliderAddressB	= `SliderAddressB;
parameter	p$SliderBitsB		= `SliderBitsB;
`endif
`ifdef UseSliderC
parameter	p$SliderAddressC	= `SliderAddressC;
parameter	p$SliderBitsC		= `SliderBitsC
`endif

// Registered variable declarations:
reg	[p$ShiftRegisterBits-1:0]	r$ShiftRegister;
reg	[7:0]	r$ParallelPort;

`ifdef UseSliderA
reg	[`SliderBitsA - 1 : 0]	O$SliderA;
`endif
`ifdef UseSliderB
reg	[`SliderBitsB - 1 : 0]	O$SliderB;
`endif
`ifdef UseSliderC
reg	[`SliderBitsC - 1 : 0]	O$SliderC;
`endif

// Wire variable declarations:
wire	w$MD2PadToBuffer;
wire	w$MD2;
wire	w$MD0PadToBuffer;
wire	w$MD0;
wire	w$SerialClock;
wire	w$LatchData;


//
// Make 8-bit register for parallel port, and synchronize to rising edge of master clock 
//

// Instantiate pads and buffer for mode pins (M2 is bit 7 of parallel port, M0 is bit 6)
MD2 	Mode2_Pad	(.I(w$MD2PadToBuffer));
IBUF	Mode2_Buffer	(.I(w$MD2PadToBuffer), .O(w$MD2));
MD0 	Mode0_Pad	(.I(w$MD0PadToBuffer));
IBUF	Mode0_Buffer	(.I(w$MD0PadToBuffer), .O(w$MD0));

// Combine mode pins with lower parallel port pins into eight bit register
always @ (posedge I$Clock or posedge I$Reset)
	if (I$Reset == 1) 
		r$ParallelPort <= 0;
	else 
		r$ParallelPort <= {w$MD2, w$MD0, I$ParallelPort};
		
// Make simple variable names for signals that will be used as clocking signals below
// (synthesis tool does not like to see a bus bit like 'r$ParallelPort[5]' in the
// sensitivity list)
assign w$SerialClock = r$ParallelPort[5];
assign w$LatchData = r$ParallelPort[7];


//
// Shift register:
//
// NOTE: The current version of the Windows sliders application uses the parallel port pins
// as follows:
//
//	4:0	Address of slider register
//	5	Serial clock
//	6	Serial data
//	7	Latch enable
//
always @ (posedge w$SerialClock or posedge I$Reset)
	if (I$Reset == 1) 
		r$ShiftRegister <= 0;
	else 
		r$ShiftRegister <= {r$ShiftRegister[p$ShiftRegisterBits-2:0],r$ParallelPort[6]};
		
//
// Output registers
//
always @ (posedge w$LatchData or posedge I$Reset)
	if (I$Reset == 1) begin
		`ifdef UseSliderA
			O$SliderA <= 0;
		`endif
		`ifdef UseSliderB
			O$SliderB <= 0;
		`endif
		`ifdef UseSliderC
			O$SliderC <= 0;
		`endif
	end
	else
		casex (I$ParallelPort[4:0])
		`ifdef UseSliderA
			p$SliderAddressA :
			O$SliderA <= r$ShiftRegister[p$SliderBitsA - 1 : 0];
		`endif
		`ifdef UseSliderB
			p$SliderAddressB :
			O$SliderB <= r$ShiftRegister[p$SliderBitsB - 1 : 0];
		`endif
		`ifdef UseSliderC
			p$SliderAddressC :
			O$SliderC <= r$ShiftRegister[p$SliderBitsC - 1 : 0];
		`endif
		endcase


//
// End of description!
//

endmodule