module DES(key,data,clk,rst,hash,match,done,next); 
   input [63:0] key;     	// 64 bit key with parity bit; (56 bits of data) 
   input [63:0] data;    	// 64 bit data 

   input wire     clk; 
   input wire     rst; 

   input wire [63:0] hash;    //  hash value to match
   output reg     match;		// match flag, high if plain-text match is found 
   output reg     done;		// done flag; high when current hash is done computing 
   input wire     next;		// next signal; to start the next computation. 

   reg [27:0] c; 
   reg [27:0] d; 
   reg [47:0] k; 
   reg [31:0] r,r_old; 
   reg [31:0] l; 

   reg [4:0]  state; 
   reg [47:0] x_r;    	// expansion of r 
   reg [31:0] cp_b;    	// concatenation and permutation of b[j] j:1->8 

   reg [63:0] out;    	// result of the hash 

   reg [1:0]  s1r,s2r,s3r,s4r,s5r,s6r,s7r,s8r; //  sbox row m
   reg [3:0]  s1c,s2c,s3c,s4c,s5c,s6c,s7c,s8c; //  sbox col n
   wire [3:0] b1,b2,b3,b4,b5,b6,b7,b8; //  sbox output register

   //instantiate sboxes 
   sbox1 s1(s1r,s1c,b1); 
   sbox2 s2(s2r,s2c,b2); 
   sbox3 s3(s3r,s3c,b3); 
   sbox4 s4(s4r,s4c,b4); 
   sbox5 s5(s5r,s5c,b5); 
   sbox6 s6(s6r,s6c,b6); 
   sbox7 s7(s7r,s7c,b7); 
   sbox8 s8(s8r,s8c,b8); 

   always@(posedge clk or posedge rst) 
     begin 
    if(rst) 
      begin 
          match = 1'b0;	// set the match flag to zero 
         done = 1'b1; 

         c={key[7],key[15],key[23],key[31],key[39],key[47],key[55], //  c0
                key[63],key[6],key[14],key[22],key[30],key[38],key[46], 
                key[54],key[62],key[5],key[13],key[21],key[29],key[37], 
                key[45],key[53],key[61],key[4],key[12],key[20],key[28]}; 

         d={key[1],key[9],key[17],key[25],key[33],key[41],key[49], //  d0
                key[57],key[2],key[10],key[18],key[26],key[34],key[42], 
                key[50],key[58],key[3],key[11],key[19],key[27],key[35], 
                key[43],key[51],key[59],key[36],key[44],key[52],key[60]}; 

         l={data[6],data[14],data[22],data[30],data[38],data[46],data[54],data[62], //  l0
                data[4],data[12],data[20],data[28],data[36],data[44],data[52],data[60], 
                data[2],data[10],data[18],data[26],data[34],data[42],data[50],data[58], 
                data[0],data[8],data[16],data[24],data[32],data[40],data[48],data[56]}; 

         r={data[7],data[15],data[23],data[31],data[39],data[47],data[55],data[63], //  r0
                data[5],data[13],data[21],data[29],data[37],data[45],data[53],data[61], 
                data[3],data[11],data[19],data[27],data[35],data[43],data[51],data[59], 
                data[1],data[9],data[17],data[25],data[33],data[41],data[49],data[57]}; 

         state = 5'd18; 	// go to state 18, wait for next signal 
      end 
    else 
      begin 
         case(state) 
           0:		// stage 0 
    	 begin 
    	    c={c[26:0],c[27]}; //  c1 = CLS(c0,1)
    	    d={d[26:0],d[27]}; //  d1 = CLS(d0,1)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k1=PC-2(c1d1)
    	 
    	    state = 5'd1; 
    	 end 
           1:		// stage 1 
    	 begin 
    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r0)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	 
    	    x_r = x_r ^ k;	// expansion xor k1 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 

    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[26:0],c[27]}; //  c2 = CLS(c1,1)
    	    d={d[26:0],d[27]}; //  d2 = CLS(d1,1)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k2=PC-2(c2d2)

    	    state = 5'd2; 
    	 end //  case: 1
           2:		// stage 2 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	 
    	    r_old=r;		// save R0 
    	    r = cp_b ^ l; 	// xor with L to get R1 
    	    l=r_old;			// L1 = R0 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r1)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k1 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c3 = CLS(c2,2)
    	    d={d[25:0],d[27:26]}; //  d3 = CLS(d2,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k3=PC-2(c3d3)
    	 
    	    state = 5'd3; 
    	 end //  case: 2
           3:    		// stage 3 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R2 
    	    l=r_old;			// L2 = R1 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r2)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c4 = CLS(c3,2)
    	    d={d[25:0],d[27:26]}; //  d4 = CLS(d3,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k4=PC-2(c4d4)
    	 
    	    state = 5'd4; 
    	 end //  case: 3
           4:		// stage 4 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R3 
    	    l=r_old;			// L3 = R2 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r3)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c5 = CLS(c4,2)
    	    d={d[25:0],d[27:26]}; //  d5 = CLS(d4,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k5=PC-2(c5d5)
    	 
    	    state = 5'd5; 
    	 end //  case: 4
           5:		// stage 5 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R4 
    	    l=r_old;			// L4 = R3 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r4)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c6 = CLS(c5,2)
    	    d={d[25:0],d[27:26]}; //  d6 = CLS(d5,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k6=PC-2(c6d6)
    	 
    	    state = 5'd6; 
    	 end //  case: 5
           6:		// stage 6 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R5 
    	    l=r_old;			// L5 = R4 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r5)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c7 = CLS(c6,2)
    	    d={d[25:0],d[27:26]}; //  d7 = CLS(d6,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k7=PC-2(c7d7)
    	 
    	    state = 5'd7; 
    	 end //  case: 6
           7: 		// stage 7 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R6 
    	    l=r_old;			// L6 = R5 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r6)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c8 = CLS(c7,2)
    	    d={d[25:0],d[27:26]}; //  d8 = CLS(d7,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k8=PC-2(c8d8)
    	 
    	    state = 5'd8; 
    	 end //  case: 7
           8:		// stage 8 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R7 
    	    l=r_old;			// L7 = R6 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r7)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[26:0],c[27]}; //  c9 = CLS(c8,1)
    	    d={d[26:0],d[27]}; //  d9 = CLS(d8,1)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k9=PC-2(c9d9)
    	 
    	    state = 5'd9; 
    	 end //  case: 8
           9:		// stage 9 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R8 
    	    l=r_old;			// L8 = R7 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r8)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c10 = CLS(c9,2)
    	    d={d[25:0],d[27:26]}; //  d10 = CLS(d9,2)

    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k10=PC-2(c10d10)
    	 
    	    state = 5'd10; 
    	 end //  case: 9
           10:		// stage 10 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R9 
    	    l=r_old;			// L9 = R8 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r9)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c11 = CLS(c10,2)
    	    d={d[25:0],d[27:26]}; //  d11 = CLS(d10,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k11=PC-2(c11d11)
    	 
    	    state = 5'd11; 
    	 end //  case: 10
           11:		// stage 11 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R10 
    	    l=r_old;			// L10 = R9 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r10)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c12 = CLS(c11,2)
    	    d={d[25:0],d[27:26]}; //  d12 = CLS(d11,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k12=PC-2(c12d12)
    	 
    	    state = 5'd12; 
    	 end //  case: 11
           12:		// stage 12 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R11 
    	    l=r_old;			// L11 = R10 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r11)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c13 = CLS(c12,2)
    	    d={d[25:0],d[27:26]}; //  d13 = CLS(d12,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k13=PC-2(c13d13)
    	 
    	    state = 5'd13; 
    	 end //  case: 12
           13:		// stage 13 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R12 
    	    l=r_old;			// L12 = R11 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r12)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c14 = CLS(c13,2)
    	    d={d[25:0],d[27:26]}; //  d14 = CLS(d13,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k14=PC-2(c14d14)
    	 
    	    state = 5'd14; 
    	 end //  case: 13
           14:		// stage 14 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R13 
    	    l=r_old;			// L13 = R12 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r13)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[25:0],c[27:26]}; //  c15 = CLS(c14,2)
    	    d={d[25:0],d[27:26]}; //  d15 = CLS(d14,2)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k15=PC-2(c15d15)
    	 
    	    state = 5'd15; 
    	 end //  case: 14
           15:		// stage 15 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R14 
    	    l=r_old;			// L14 = R13 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r14)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    c={c[26:0],c[27]}; //  c16 = CLS(c15,1)
    	    d={d[26:0],d[27]}; //  d16 = CLS(d15,1)
    	 
    	    k={c[14],c[11],c[17],c[4],c[27],c[23], 
    	       c[25],c[0],c[13],c[22],c[7],c[18], 
    	       c[5],c[9],c[16],c[24],c[2],c[20], 
    	       c[12],c[21],c[1],c[8],c[15],c[26], 
    	       d[15],d[4],d[25],d[19],d[9],d[1], 
    	       d[26],d[16],d[5],d[11],d[23],d[8], 
    	       d[12],d[7],d[17],d[0],d[22],d[3], 
    	       d[10],d[14],d[6],d[20],d[27],d[24]}; //  k16=PC-2(c16d16)
    	 
    	    state = 5'd16; 
    	 end //  case: 15
           16:		// stage 16 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R15 
    	    l=r_old;			// L15 = R14 

    	    x_r={r[0],r[31],r[30],r[29],r[28],r[27], //  expansion(r15)
    		 r[28],r[27],r[26],r[25],r[24],r[23], 
    		 r[24],r[23],r[22],r[21],r[20],r[19], 
    		 r[20],r[19],r[18],r[17],r[16],r[15], 
    		 r[16],r[15],r[14],r[13],r[12],r[11], 
    		 r[12],r[11],r[10],r[9],r[8],r[7], 
    		 r[8],r[7],r[6],r[5],r[4],r[3], 
    		 r[4],r[3],r[2],r[1],r[0],r[31]}; 
    	    		 
    	    x_r = x_r ^ k;	// expansion xor k 
    	 
    	    s1r = {x_r[47],x_r[42]}; //  initialize the sbox
    	    s2r = {x_r[41],x_r[36]}; 
    	    s3r = {x_r[35],x_r[30]}; 
    	    s4r = {x_r[29],x_r[24]}; 
    	    s5r = {x_r[23],x_r[18]}; 
    	    s6r = {x_r[17],x_r[12]}; 
    	    s7r = {x_r[11],x_r[6]}; 
    	    s8r = {x_r[5],x_r[0]}; 
    	 
    	    s1c = x_r[46:43]; 
    	    s2c = x_r[40:37]; 
    	    s3c = x_r[34:31]; 
    	    s4c = x_r[28:25]; 
    	    s5c = x_r[22:19]; 
    	    s6c = x_r[16:13]; 
    	    s7c = x_r[10:7]; 
    	    s8c = x_r[4:1]; 
    	 
    	    state = 5'd17; 
    	 end //  case: 16
           17:		// stage 17 
    	 begin 
    	    cp_b={b4[0],b2[1],b5[0],b6[3], //  concatenate b's and permute
    		  b8[3],b3[0],b7[0],b5[3], 
    		  b1[3],b4[1],b6[1],b7[2], 
    		  b2[3],b5[2],b8[1],b3[2], 
    		  b1[2],b2[0],b6[0],b4[2], 
    		  b8[0],b7[1],b1[1],b3[3], 
    		  b5[1],b4[3],b8[2],b2[2], 
    		  b6[2],b3[1],b1[0],b7[3]}; 
    	    		 
    	    r_old=r;		// save R 
    	    r = cp_b ^ l; 	// xor with L to get R16 
    	    l=r_old;			// L16 = R15 
    	 
    	 
    	    out = {l[24],r[24],l[16],r[16],l[8],r[8],l[0],r[0], 
    		   l[25],r[25],l[17],r[17],l[9],r[9],l[1],r[1], 
    		   l[26],r[26],l[18],r[18],l[10],r[10],l[2],r[2], 
    		   l[27],r[27],l[19],r[19],l[11],r[11],l[3],r[3], 
    		   l[28],r[28],l[20],r[20],l[12],r[12],l[4],r[4], 
    		   l[29],r[29],l[21],r[21],l[13],r[13],l[5],r[5], 
    		   l[30],r[30],l[22],r[22],l[14],r[14],l[6],r[6], 
    		   l[31],r[31],l[23],r[23],l[15],r[15],l[7],r[7]}; 
    	 
    	    if(out==hash) 
    	      begin 
    		 match=1'b1; 
    	      end 
    	 
    	    state = 5'd18; 
    	    done = 1'b1; //  hash computation done
    	 
    	 end //  case: 17

           18:		// trap here until next signal is received 
    	 begin 
    	    if(next) 
    	      begin 
    		 //prepare next computation 
    		 c={key[7],key[15],key[23],key[31],key[39],key[47],key[55], //  c0
    		    key[63],key[6],key[14],key[22],key[30],key[38],key[46], 
    		    key[54],key[62],key[5],key[13],key[21],key[29],key[37], 
    		    key[45],key[53],key[61],key[4],key[12],key[20],key[28]}; 
    		 
    		 d={key[1],key[9],key[17],key[25],key[33],key[41],key[49], //  d0
    		    key[57],key[2],key[10],key[18],key[26],key[34],key[42], 
    		    key[50],key[58],key[3],key[11],key[19],key[27],key[35], 
    		    key[43],key[51],key[59],key[36],key[44],key[52],key[60]}; 

    		 l={data[6],data[14],data[22],data[30],data[38],data[46],data[54],data[62], //  l0
    		    data[4],data[12],data[20],data[28],data[36],data[44],data[52],data[60], 
    		    data[2],data[10],data[18],data[26],data[34],data[42],data[50],data[58], 
    		    data[0],data[8],data[16],data[24],data[32],data[40],data[48],data[56]}; 
    		 
    		 r={data[7],data[15],data[23],data[31],data[39],data[47],data[55],data[63], //  r0
    		    data[5],data[13],data[21],data[29],data[37],data[45],data[53],data[61], 
    		    data[3],data[11],data[19],data[27],data[35],data[43],data[51],data[59], 
    		    data[1],data[9],data[17],data[25],data[33],data[41],data[49],data[57]}; 
    		 
    		 state = 5'd0; 
    		 done = 1'b0; 
    	      end //  if (next)
    	 end 
         endcase //  case (state)
      end //  else: !if(rst)
     end //  always@ (posedge clk)
endmodule //  DES