//--------------------------------------------------------------------------------------------------
//
// Title       : HomeConfig
// Design      : U4
// Author      : mbari###
// Company     : MBARI
//
//-------------------------------------------------------------------------------------------------
//
// File        : c:\Projects\genosensor\2g\CPLDs\Core\U4\src\HomeConfig.v
// Generated   : Thu Dec 18 09:50:41 2003
// From        : interface description file
// By          : Itf2Vhdl ver. 1.20
//
//-------------------------------------------------------------------------------------------------
//
// Description : 
//
//-------------------------------------------------------------------------------------------------
`timescale 1ps / 1ps

//{{ Section below this comment is automatically maintained
//   and may be overwritten
//{module {HomeConfig}}
module HomeConfig ( sense2 ,HF2 ,Zero1 ,inDATA ,outDATA ,Zero2 ,Reset ,Home_Encoder1 ,Home_Encoder2 ,RDslct ,Sclk ,sense1 ,WRslct ,HF1 );

input Home_Encoder1 ;
wire Home_Encoder1 ;
input [7:0] inDATA ;
wire [7:0] inDATA ;
input Home_Encoder2 ;
wire Home_Encoder2 ;
input Reset ;
wire Reset ;
input RDslct ;
wire RDslct ;
input Sclk ;
wire Sclk ;
input WRslct ;
wire WRslct ;

output sense2 ;
wire sense2 ;
output HF2 ;
wire HF2 ;
output Zero1 ;
wire Zero1 ;
output [7:0] outDATA ;
wire [7:0] outDATA ;
output Zero2 ;
wire Zero2 ;
output sense1 ;
wire sense1 ;
output HF1 ;
wire HF1 ;

//}} End of automatically maintained section

// -- Enter your statements here -- //

reg RF2r;
reg E2r;
reg RF1r;
reg E1r;   

reg sense1r;
reg sense2r;

reg HE1stater;
reg HE1statelastr;
reg HE2stater;
reg HE2statelastr;

reg Hfound1;
reg Hfound2;

reg Zero1r;
reg Zero2r;

assign Zero1 = Zero1r;
assign Zero2 = Zero2r;


//wire HFslct;
//assign HFslct = (!AS & RD & !WR & (ADDR == 8'h04));

//assign outDATA = (!AS & RD & !WR & (ADDR == 8'h07)) ? {1'b0,Hfound2,E2r,RF2r,1'b0,Hfound1,E1r,RF1r} : 8'bz;  
assign outDATA = (RDslct) ? {Hfound2, 3'bz, Hfound1, 3'bz} : 8'bz;
assign HF1 = Hfound1;
assign HF2 = Hfound2;	
assign sense1 = sense1r;
assign sense2 = sense2r;

//so how does this work?  RF means Rising/Falling.  When RF is set to a 1, the routine is looking for a rising
//edge on the Home_Encoder input.  When a 0, then falling.
//The  E register is the enable register.  0 is diabled, 1 is enabled.
//Hfound is home found.  This must begin reset to 0 when it is enabled and will be set to 1 by the routine when home 
//has been found.  		  
//the bits look like this on write {Unused, Hfound2, E2r, RF2r, Unused, Hfound1, E1r, RF1r}
//So to find home on the rising edge of channel 1 write a 00000010.  This enables channel one to reset the counter
//on the rising edge of the home_encoder input.  when home is found the Hfound flag will begin set.
//Currently this is not tied into the interrupt structer, but could be!

always @ (negedge Sclk)
	begin
		HE1stater <= Home_Encoder1;
		HE1statelastr <= HE1stater;
		
		HE2stater <= Home_Encoder2;
		HE2statelastr <= HE2stater;
		
		if (Reset) {sense2r, Hfound2,E2r, RF2r, sense1r, Hfound1, E1r, RF1r} <= 8'b0;
		else if (WRslct) {sense2r, Hfound2, E2r, RF2r, sense1r, Hfound1, E1r, RF1r} <= {inDATA[7:0]};
		else 
			begin
				case ({E1r,RF1r,HE1stater,HE1statelastr,Hfound1})
					5'b10010,
					5'b11100:begin
								Zero1r <= 1'b1;
								Hfound1 <= 1'b1;
							end					
					default 
						begin
							Zero1r <= 1'b0;
							Hfound1 <= Hfound1;
						end
				endcase	
				case ({E2r,RF2r,HE2stater,HE2statelastr,Hfound2})
					5'b10010,
					5'b11100:begin
								Zero2r <= 1'b1;
								Hfound2 <= 1'b1;
							end					
					default 
						begin
							Zero2r <= 1'b0;
							Hfound2 <= Hfound2;
						end
				endcase	
			end
	end
endmodule
