module LM_search 
  ( 
    CLOCK_27,//	27 MHz 
    KEY,	//	Pushbutton[3:0] 
    SW,	//	Toggle Switch[17:0] 
    HEX0,	//	Seven Segment Digit 0 
    HEX1,	//	Seven Segment Digit 1 
    HEX2,	//	Seven Segment Digit 2 
    HEX3,	//	Seven Segment Digit 3 
    HEX4,	//	Seven Segment Digit 4 
    HEX5,	//	Seven Segment Digit 5 
    HEX6,	//	Seven Segment Digit 6 
    HEX7,	//	Seven Segment Digit 7 
    ////////////////////	LCD Module 16X2		//////////////// 
    LCD_ON,	//	LCD Power ON/OFF 
    LCD_BLON,//	LCD Back Light ON/OFF 
    LCD_RW,	//	LCD Read/Write Select, 0 = Write, 1 = Read 
    LCD_EN,	//	LCD Enable 
    LCD_RS,	//	LCD Command/Data Select, 0 = Command, 1 = Data 
    LCD_DATA,//	LCD Data bus 8 bits 
    ////////////////////	USB JTAG link	//////////////////// 
    TDI,  	// CPLD -> FPGA (data in) 
    TCK,  	// CPLD -> FPGA (clk) 
    TCS,  	// CPLD -> FPGA (CS) 
    TDO,  	// FPGA -> CPLD (data out) 
    TD_RESET//	TV Decoder Reset 
    ); 

   input    		CLOCK_27;	//	27 MHz 
   input [3:0]     		KEY;		//	Pushbutton[3:0] 
   input [17:0]     	SW;		//	Toggle Switch[17:0] 
   output [6:0]     	HEX0;		//	Seven Segment Digit 0 
   output [6:0]     	HEX1;		//	Seven Segment Digit 1 
   output [6:0]     	HEX2;		//	Seven Segment Digit 2 
   output [6:0]     	HEX3;		//	Seven Segment Digit 3 
   output [6:0]     	HEX4;		//	Seven Segment Digit 4 
   output [6:0]     	HEX5;		//	Seven Segment Digit 5 
   output [6:0]     	HEX6;		//	Seven Segment Digit 6 
   output [6:0]     	HEX7;		//	Seven Segment Digit 7 
   inout [7:0]     		LCD_DATA;	//	LCD Data bus 8 bits 
   output    		LCD_ON;		//	LCD Power ON/OFF 
   output    		LCD_BLON;	//	LCD Back Light ON/OFF 
   output    		LCD_RW;		//	LCD Read/Write Select, 0 = Write, 1 = Read 
   output    		LCD_EN;		//	LCD Enable 
   output    		LCD_RS;		//	LCD Command/Data Select, 0 = Command, 1 = Data 
   input      		TDI;		// CPLD -> FPGA (data in) 
   input      		TCK;		// CPLD -> FPGA (clk) 
   input      		TCS;		// CPLD -> FPGA (CS) 
   output     		TDO;		// FPGA -> CPLD (data out) 
   output    		TD_RESET;	//	TV Decoder Reset 

   //     Turn off all HEX
   assign    HEX0		=	7'hFF; 
   assign    HEX1		=	7'hFF; 
   assign    HEX2		=	7'hFF; 
   assign    HEX3		=	7'hFF; 
   assign    HEX4		=	7'hFF; 
   assign    HEX5		=	7'hFF; 
   assign    HEX6		=	7'hFF; 
   assign    HEX7		=	7'hFF; 
   //  Turn on LCD
   assign    LCD_ON		=	1'b1; 
   assign    LCD_BLON	=	1'b1; 


   //Activate the 27MHz oscillator 
   assign  TD_RESET        =       1'b1; 


   wire [63:0]     		hash; //hash to look for  
   wire [55:0]     		plain_txt;	//the decoded key!!!  
   wire [63:0]     		key[39:0];		// wires distributing the generated keys 
   wire [63:0]     		data; //constant data for DES: KGS!@#$% 
   wire [39:0]     		match; //individual match signals from each DES unit 
   wire [39:0]     		done; //done signal from each DES unit 


   wire     		sys_clk,sys_rst; //clk & rst for DES 
   wire     		signal_done; 
   wire     		signal_next; //start next calculation  
   wire     		signal_match; //indicate that key has been FOUND 


   assign signal_done = &done;    //  AND all the bits of done
   assign signal_match = | match; 
   assign data = {8'h4B,8'h47,8'h53,8'h21, //  KGS!@#$%
                  8'h40,8'h23,8'h24,8'h25}; 
   assign sys_clk=CLOCK_27; 


   //Main Controller & LCD Driver 
   controller u1(CLOCK_27,~(SW[17]& ~KEY[0]),LCD_DATA,LCD_RW,LCD_EN,LCD_RS, 
    	 KEY[3:0],SW[0],hash,plain_txt,signal_match,sys_rst); 
   //SW[17] & ~KEY[0] is LCD reset 


   //Key Generator 
   key_gen40 key_gen40(sys_clk,sys_rst,signal_done,signal_next, 
    	       match, 
    	       plain_txt, 
    	       key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],key[9], 
    	       key[10],key[11],key[12],key[13],key[14],key[15],key[16],key[17],key[18],key[19], 
    	       key[20],key[21],key[22],key[23],key[24],key[25],key[26],key[27],key[28],key[29], 
    	       key[30],key[31],key[32],key[33],key[34],key[35],key[36],key[37],key[38],key[39]);	 


   //DES--40 Instances 
   DES crypto0(key[0],data,sys_clk,sys_rst,hash,match[0],done[0],signal_next); 
   DES crypto1(key[1],data,sys_clk,sys_rst,hash,match[1],done[1],signal_next); 
   DES crypto2(key[2],data,sys_clk,sys_rst,hash,match[2],done[2],signal_next); 
   DES crypto3(key[3],data,sys_clk,sys_rst,hash,match[3],done[3],signal_next); 
   DES crypto4(key[4],data,sys_clk,sys_rst,hash,match[4],done[4],signal_next); 
   DES crypto5(key[5],data,sys_clk,sys_rst,hash,match[5],done[5],signal_next); 
   DES crypto6(key[6],data,sys_clk,sys_rst,hash,match[6],done[6],signal_next); 
   DES crypto7(key[7],data,sys_clk,sys_rst,hash,match[7],done[7],signal_next); 
   DES crypto8(key[8],data,sys_clk,sys_rst,hash,match[8],done[8],signal_next); 
   DES crypto9(key[9],data,sys_clk,sys_rst,hash,match[9],done[9],signal_next); 
   DES crypto10(key[10],data,sys_clk,sys_rst,hash,match[10],done[10],signal_next); 
   DES crypto11(key[11],data,sys_clk,sys_rst,hash,match[11],done[11],signal_next); 
   DES crypto12(key[12],data,sys_clk,sys_rst,hash,match[12],done[12],signal_next); 
   DES crypto13(key[13],data,sys_clk,sys_rst,hash,match[13],done[13],signal_next); 
   DES crypto14(key[14],data,sys_clk,sys_rst,hash,match[14],done[14],signal_next); 
   DES crypto15(key[15],data,sys_clk,sys_rst,hash,match[15],done[15],signal_next); 
   DES crypto16(key[16],data,sys_clk,sys_rst,hash,match[16],done[16],signal_next); 
   DES crypto17(key[17],data,sys_clk,sys_rst,hash,match[17],done[17],signal_next); 
   DES crypto18(key[18],data,sys_clk,sys_rst,hash,match[18],done[18],signal_next); 
   DES crypto19(key[19],data,sys_clk,sys_rst,hash,match[19],done[19],signal_next); 
   DES crypto20(key[20],data,sys_clk,sys_rst,hash,match[20],done[20],signal_next); 
   DES crypto21(key[21],data,sys_clk,sys_rst,hash,match[21],done[21],signal_next); 
   DES crypto22(key[22],data,sys_clk,sys_rst,hash,match[22],done[22],signal_next); 
   DES crypto23(key[23],data,sys_clk,sys_rst,hash,match[23],done[23],signal_next); 
   DES crypto24(key[24],data,sys_clk,sys_rst,hash,match[24],done[24],signal_next); 
   DES crypto25(key[25],data,sys_clk,sys_rst,hash,match[25],done[25],signal_next); 
   DES crypto26(key[26],data,sys_clk,sys_rst,hash,match[26],done[26],signal_next); 
   DES crypto27(key[27],data,sys_clk,sys_rst,hash,match[27],done[27],signal_next); 
   DES crypto28(key[28],data,sys_clk,sys_rst,hash,match[28],done[28],signal_next); 
   DES crypto29(key[29],data,sys_clk,sys_rst,hash,match[29],done[29],signal_next); 
   DES crypto30(key[30],data,sys_clk,sys_rst,hash,match[30],done[30],signal_next); 
   DES crypto31(key[31],data,sys_clk,sys_rst,hash,match[31],done[31],signal_next); 
   DES crypto32(key[32],data,sys_clk,sys_rst,hash,match[32],done[32],signal_next); 
   DES crypto33(key[33],data,sys_clk,sys_rst,hash,match[33],done[33],signal_next); 
   DES crypto34(key[34],data,sys_clk,sys_rst,hash,match[34],done[34],signal_next); 
   DES crypto35(key[35],data,sys_clk,sys_rst,hash,match[35],done[35],signal_next); 
   DES crypto36(key[36],data,sys_clk,sys_rst,hash,match[36],done[36],signal_next); 
   DES crypto37(key[37],data,sys_clk,sys_rst,hash,match[37],done[37],signal_next); 
   DES crypto38(key[38],data,sys_clk,sys_rst,hash,match[38],done[38],signal_next); 
   DES crypto39(key[39],data,sys_clk,sys_rst,hash,match[39],done[39],signal_next); 


endmodule