OpenCores
URL https://opencores.org/ocsvn/unconfuser/unconfuser/trunk

Subversion Repositories unconfuser

[/] [unconfuser/] [trunk/] [unConfuser.v] - Rev 2

Compare with Previous | Blame | View Log

/***************************************************************************************/
/*                                                                                                                                                    */
/* Author:- Pratik Mahajan                                                                                                               */
/* Create Date:- Spring 2009						                                                               */
/* Project Name:- Unconfuser for 32 bit data					                                              */
/* Target Devices: ASIC 							                                                              */	
/*Project Description: To build an unconfuser for 32 bit confused data with around 700                     */ 
/* bits of confusion                                                                                                                         */
 
module unConfuser(Clk, Reset, PushIn, Din, Caddr, Cdata, Cpush, PushOut, StopIn, Dout, inMdin, inAddrw, inWrite, inMdout, inAddrr, opMdin, opAddrw, opWrite, opMdout, opAddrr);
 
/*Port list for unConfuser */
   input[7:0] Din, Cdata;
   input[6:0] Caddr;
   output[7:0] Dout;
   input PushIn, Clk, Reset, StopIn, Cpush;
   output PushOut;
 
/* Port list for Fifo and memory interfacing */
   output inWrite, opWrite;
   output [7:0] inMdin, opMdin;
   output [15:0] inAddrr, inAddrw, opAddrr, opAddrw;
   input [7:0] inMdout, opMdout;
 
/*/Variables and parameters declaration*/
/*Registers being used for CRCs*/
   reg[159:0] rDataPad0;
   reg[160:0] rDataPad1;
   reg[161:0] rDataPad2;
   reg[162:0] rDataPad3;
   reg[31:0]  rDataInjector;
   reg[39:0]  rDataPadSel;
   reg[31:0]  rDataCDATA;
 
/*Wires/Nets Representing combinational logic (XORing) - i.e. (D input to F/F)*/
   wire[159:0] wXorPad0FW, wXorPad0BW, wXorPad0, wLoadPad0;
   wire[160:0] wXorPad1FW, wXorPad1BW, wXorPad1, wLoadPad1;
   wire[161:0] wXorPad2FW, wXorPad2BW, wXorPad2, wLoadPad2;
   wire[162:0] wXorPad3FW, wXorPad3BW, wXorPad3, wLoadPad3;
   wire[39:0]  wXorPadSelFW, wXorPadSelBW, wXorPadSel, wLoadPadSel;
   wire[31:0]  wXorCDATAFW, wXorCDATABW, wXorCDATABW0, wXorCDATA; //---> Forward moving CDATA is Never been used
   wire[31:0]  wXorInjectorFW, wXorInjectorBW, wXorInjector, wLoadInjector;   //---> Backword moving injector is Never been used
 
 
/*Control signals for controlling CRCs*/   
   reg rIdle, rDirection, rIdleInjector, rIdleCDATA, rIsBW;
 
/*Internal signals for design like PRN select lines for pad select MUX etc.*/
   wire[4:0] wSelectPadBit;
   wire[5:0] wPadAmount;
   wire wPRN;
   reg rPRN;
   reg rDataOut;
/*Variables used in for loops and etc*/
   integer unConfuserCnt, ipFifoLoadCnt, opFifoLoadCnt, PadCounter, injectorCounter;
   reg[2:0] nextState;
   reg[5:0] rPadAmount;
 
/*FIFO signals declaration*/
   wire inPull, inEmpty, inWrite, opWrite;
   wire[7:0] inDout, inMdin, inMdout;
   wire[15:0] inAddrw, inAddrr; 
   wire opPull, opPush, opEmpty, opFull;
   wire[7:0] wopDin, opMdin, opMdout;
   wire[15:0] opAddrw, opAddrr;
   reg[7:0] opDin;
 
/*Parameters representing Polynomials for all CRCs*/
 
/* X^160+X^139+X^119+X^98+X^79+X^40+X^20+1     -> Pad0 polynomial*/
   parameter [159:0] pPolyPad0 = 160'H00000800_00800004_00008000_00000100_00100001;
 
/*  X161+X140+X121+X100+X80+X60+X40+X20+1                 -> Pad1 polynomial*/
   parameter [160:0] pPolyPad1 = 161'H0_00001000_02000010_00010000_10000100_00100001;
 
/*  X162+X141+X121+X100 +X80+X60+X40+X20+1                -> Pad2 polynomial*/
   parameter [161:0] pPolyPad2 = 162'H0_00002000_02000010_00010000_10000100_00100001;
 
/*  X163+X142+X122+X102+X82+X61+X41+X20+1                 -> Pad3 polynomial*/
   parameter [162:0] pPolyPad3 = 162'H0_00004000_04000040_00040000_20000200_00100001;
 
/* X32+X27+X21+X16+X10+X5+1                               -> Injector polynomial*/
   parameter [31:0]  pPolyInjector = 32'H0821_0421;
 
/* X40+X34+X27+X19+X12+X6+1                               -> PadSelect Polynomial*/
   parameter [39:0] pPolyPadSel = 40'H04_0808_1041;
 
/* X32+X31+X29+X28+X26+X25+X24+X22+X21+X13+X11+X9+X8+X5+1 -> CRC (unConfuser) polynomial*/
   parameter [31:0] pPolyCDATA = 32'HB760_2B21;
 
/*Parameters for State Machine*/
   parameter stateReset     = 3'b000;
   parameter stateLoadPads  = 3'b001;
   parameter stateLoad      = 3'b010;
   parameter stateStepFW    = 3'b011;
   parameter stateStepBW    = 3'b100;
   parameter stateCDATABW   = 3'b101;
   parameter stateLoadOut   = 3'b110;
   parameter stateFinalFW   = 3'b111;
 
/* Forward and Backward flags as parameters*/
   parameter pFW 	    = 1'b1;
   parameter pBW 	    = 1'b0;
 
/*Instatiate input and output fifos*/
   fifooneflag ipfifo (Clk, Reset, PushIn, Din, inPull, inEmpty, inDout, inAddrw, inMdin, inWrite, inAddrr, inMdout);
   assign inPull 	  = (inEmpty == 1'b0 && nextState == stateLoad); //When CDATA is begin loaded
   fifotwoflag opfifo (Clk, Reset, opPush, opFull, opDin, opPull, opEmpty, Dout, opAddrw, opMdin, opWrite, opAddrr, opMdout);
   assign opPush 	  = (opFull == 1'b0 && rDataOut == 1'b1);             //when not full
   assign opPull 	  = (StopIn == 1'b0);
 
   assign PushOut 	  = (opEmpty == 1'b0);
   assign wopDin 	  = (opPush==1'b1 && opFifoLoadCnt==1) ? rDataCDATA[31:24] :
                            ((opPush==1'b1 && opFifoLoadCnt==2) ? rDataCDATA[23:16] :
			    ((opPush==1'b1 && opFifoLoadCnt==3) ? rDataCDATA[15:8]  :
			    ((opPush==1'b1 && opFifoLoadCnt==4) ? rDataCDATA[7:0] : opDin)));
 
			 /*Logic starts here*/
			 /*All CRC going forward :-*/
   assign wXorPad0FW 	  = {rDataPad0[158:0],1'b0}   ^ (rDataPad0[159] ? pPolyPad0  : 160'h0);
   assign wXorPad1FW 	  = {rDataPad1[159:0],1'b0}   ^ (rDataPad1[160] ? pPolyPad1  : 161'h0);
   assign wXorPad2FW 	  = {rDataPad2[160:0],1'b0}   ^ (rDataPad2[161] ? pPolyPad2  : 162'h0);
   assign wXorPad3FW 	  = {rDataPad3[161:0],1'b0}   ^ (rDataPad3[162] ? pPolyPad3  : 163'h0);
   assign wXorPadSelFW 	  = {rDataPadSel[38:0],1'b0}  ^ (rDataPadSel[39]? pPolyPadSel : 40'h0);
/*CDATA will never move forward*/
   assign wXorCDATAFW 	  = {rDataCDATA[30:0],1'b0}   ^ (rDataCDATA[31] ? pPolyCDATA : 32'h0);
   assign wXorInjectorFW  = {rDataInjector[30:0],1'b0}^ (rDataInjector[31] ? pPolyInjector : 32'h0);
 
/*All CRC going Backword*/
   assign wXorPad0BW[158:0]    = {rDataPad0[159:1]}   ^ (rDataPad0[0] ? pPolyPad0[159:1]  : 159'h0); assign wXorPad0BW[159] = rDataPad0[0];
   assign wXorPad1BW[159:0]    = {rDataPad1[160:1]}   ^ (rDataPad1[0] ? pPolyPad1[160:1]  : 160'h0); assign wXorPad1BW[160] = rDataPad1[0];
   assign wXorPad2BW[160:0]    = {rDataPad2[161:1]}   ^ (rDataPad2[0] ? pPolyPad2[161:1]  : 161'h0); assign wXorPad2BW[161] = rDataPad2[0];
   assign wXorPad3BW[161:0]    = {rDataPad3[162:1]}   ^ (rDataPad3[0] ? pPolyPad3[162:1]  : 162'h0); assign wXorPad3BW[162] = rDataPad3[0];
   assign wXorPadSelBW[38:0]   = {rDataPadSel[39:1]}  ^ (rDataPadSel[0]? pPolyPadSel[39:1]: 39'h0); assign wXorPadSelBW[39]= rDataPadSel[0];
   assign wXorCDATABW[30:0]    = {rDataCDATA[31:1]}   ^ ((rDataCDATA[0] ^ wPRN) ? pPolyCDATA[31:1] : 31'h0); assign wXorCDATABW[31] = (rDataCDATA[0] ^ wPRN); /*We need datain(wPRN) input to provide PRN from MUX*/
   assign wXorCDATABW0[30:0]   = {rDataCDATA[31:1]}   ^ (rDataCDATA[0] ? pPolyCDATA[31:1] : 31'h0); assign wXorCDATABW0[31] = rDataCDATA[0];
/*Injector Backward never need to be used*/
   assign wXorInjectorBW[30:0] = {rDataInjector[31:1]}^ (rDataInjector[0] ? pPolyInjector[31:1] : 31'h0); assign wXorInjectorBW[31] = rDataInjector[0]; 
 
/*Chosing out of Reset, Idle, Forward or Backward Condition Make RESET asynchronous*/
   assign wXorPad0 	   = Cpush ? wLoadPad0 : (rIdle ? rDataPad0 : (rDirection ? wXorPad0FW : wXorPad0BW));
   assign wXorPad1 	   = Cpush ? wLoadPad1 : (rIdle ? rDataPad1 : (rDirection ? wXorPad1FW : wXorPad1BW));
   assign wXorPad2 	   = Cpush ? wLoadPad2 : (rIdle ? rDataPad2 : (rDirection ? wXorPad2FW : wXorPad2BW));
   assign wXorPad3 	   = Cpush ? wLoadPad3 : (rIdle ? rDataPad3 : (rDirection ? wXorPad3FW : wXorPad3BW));
   assign wXorPadSel 	   = Cpush ? wLoadPadSel : (rIdle ? rDataPadSel : (rDirection ? wXorPadSelFW : wXorPadSelBW));
   assign wXorCDATA 	   = rIdleCDATA ? rDataCDATA : (rIsBW ? wXorCDATABW0 : wXorCDATABW);            //Direction will always be Backward
   assign wXorInjector 	   = Cpush ? wLoadInjector : (rIdleInjector ? rDataInjector : wXorInjectorFW );             //Direction will always be Forward
 
/*Implementation of configuration register for loading each register*/
   //loadPad0:
     assign wLoadPad0 	   = {Caddr=='d19 ? Cdata : rDataPad0[159:152],
                         Caddr=='d18 ? Cdata : rDataPad0[151:144],
                         Caddr=='d17 ? Cdata : rDataPad0[143:136],
                         Caddr=='d16 ? Cdata : rDataPad0[135:128],
                         Caddr=='d15 ? Cdata : rDataPad0[127:120],
                         Caddr=='d14 ? Cdata : rDataPad0[119:112],
                         Caddr=='d13 ? Cdata : rDataPad0[111:104],
                         Caddr=='d12 ? Cdata : rDataPad0[103:96],
                         Caddr=='d11 ? Cdata : rDataPad0[95:88],
                         Caddr=='d10 ? Cdata : rDataPad0[87:80],
                         Caddr=='d09 ? Cdata : rDataPad0[79:72],
                         Caddr=='d08 ? Cdata : rDataPad0[71:64],
                         Caddr=='d07 ? Cdata : rDataPad0[63:56],
                         Caddr=='d06 ? Cdata : rDataPad0[55:48],
                         Caddr=='d05 ? Cdata : rDataPad0[47:40],
                         Caddr=='d04 ? Cdata : rDataPad0[39:32],
                         Caddr=='d03 ? Cdata : rDataPad0[31:24],
                         Caddr=='d02 ? Cdata : rDataPad0[23:16],
                         Caddr=='d01 ? Cdata : rDataPad0[15:08],
                         Caddr=='d00 ? Cdata : rDataPad0[07:00]};
 
   //loadPad1:
     assign wLoadPad1 	   = {Caddr=='d41 ? Cdata[0] : rDataPad1[160],
                         Caddr=='d40 ? Cdata : rDataPad1[159:152],
                         Caddr=='d39 ? Cdata : rDataPad1[151:144],
                         Caddr=='d38 ? Cdata : rDataPad1[143:136],
                         Caddr=='d37 ? Cdata : rDataPad1[135:128],
                         Caddr=='d36 ? Cdata : rDataPad1[127:120],
                         Caddr=='d35 ? Cdata : rDataPad1[119:112],
                         Caddr=='d34 ? Cdata : rDataPad1[111:104],
                         Caddr=='d33 ? Cdata : rDataPad1[103:96],
                         Caddr=='d32 ? Cdata : rDataPad1[95:88],
                         Caddr=='d31 ? Cdata : rDataPad1[87:80],
                         Caddr=='d30 ? Cdata : rDataPad1[79:72],
                         Caddr=='d29 ? Cdata : rDataPad1[71:64],
                         Caddr=='d28 ? Cdata : rDataPad1[63:56],
                         Caddr=='d27 ? Cdata : rDataPad1[55:48],
                         Caddr=='d26 ? Cdata : rDataPad1[47:40],
                         Caddr=='d25 ? Cdata : rDataPad1[39:32],
                         Caddr=='d24 ? Cdata : rDataPad1[31:24],
                         Caddr=='d23 ? Cdata : rDataPad1[23:16],
                         Caddr=='d22 ? Cdata : rDataPad1[15:08],
                         Caddr=='d21 ? Cdata : rDataPad1[07:00]};
 
   //loadPad2:
     assign wLoadPad2 	   = {Caddr=='d62 ? Cdata[1:0] : rDataPad2[161:160],
                         Caddr=='d61 ? Cdata : rDataPad2[159:152],
                         Caddr=='d60 ? Cdata : rDataPad2[151:144],
                         Caddr=='d59 ? Cdata : rDataPad2[143:136],
                         Caddr=='d58 ? Cdata : rDataPad2[135:128],
                         Caddr=='d57 ? Cdata : rDataPad2[127:120],
                         Caddr=='d56 ? Cdata : rDataPad2[119:112],
                         Caddr=='d55 ? Cdata : rDataPad2[111:104],
                         Caddr=='d54 ? Cdata : rDataPad2[103:96],
                         Caddr=='d53 ? Cdata : rDataPad2[95:88],
                         Caddr=='d52 ? Cdata : rDataPad2[87:80],
                         Caddr=='d51 ? Cdata : rDataPad2[79:72],
                         Caddr=='d50 ? Cdata : rDataPad2[71:64],
                         Caddr=='d49 ? Cdata : rDataPad2[63:56],
                         Caddr=='d48 ? Cdata : rDataPad2[55:48],
                         Caddr=='d47 ? Cdata : rDataPad2[47:40],
                         Caddr=='d46 ? Cdata : rDataPad2[39:32],
                         Caddr=='d45 ? Cdata : rDataPad2[31:24],
                         Caddr=='d44 ? Cdata : rDataPad2[23:16],
                         Caddr=='d43 ? Cdata : rDataPad2[15:08],
                         Caddr=='d42 ? Cdata : rDataPad2[07:00]};
 
   //loadPad3:
     assign wLoadPad3 	   = {Caddr=='d83 ? Cdata[2:0] : rDataPad3[162:160],
                         Caddr=='d82 ? Cdata : rDataPad3[159:152],
                         Caddr=='d81 ? Cdata : rDataPad3[151:144],
                         Caddr=='d80 ? Cdata : rDataPad3[143:136],
                         Caddr=='d79 ? Cdata : rDataPad3[135:128],
                         Caddr=='d78 ? Cdata : rDataPad3[127:120],
                         Caddr=='d77 ? Cdata : rDataPad3[119:112],
                         Caddr=='d76 ? Cdata : rDataPad3[111:104],
                         Caddr=='d75 ? Cdata : rDataPad3[103:96],
                         Caddr=='d74 ? Cdata : rDataPad3[95:88],
                         Caddr=='d73 ? Cdata : rDataPad3[87:80],
                         Caddr=='d72 ? Cdata : rDataPad3[79:72],
                         Caddr=='d71 ? Cdata : rDataPad3[71:64],
                         Caddr=='d70 ? Cdata : rDataPad3[63:56],
                         Caddr=='d69 ? Cdata : rDataPad3[55:48],
                         Caddr=='d68 ? Cdata : rDataPad3[47:40],
                         Caddr=='d67 ? Cdata : rDataPad3[39:32],
                         Caddr=='d66 ? Cdata : rDataPad3[31:24],
                         Caddr=='d65 ? Cdata : rDataPad3[23:16],
                         Caddr=='d64 ? Cdata : rDataPad3[15:08],
                         Caddr=='d63 ? Cdata : rDataPad3[07:00]};
 
   //loadInjector:
     assign wLoadInjector  = {
                         Caddr=='d87 ? Cdata : rDataInjector[31:24],
                         Caddr=='d86 ? Cdata : rDataInjector[23:16],
                         Caddr=='d85 ? Cdata : rDataInjector[15:08],
                         Caddr=='d84 ? Cdata : rDataInjector[07:00]};
 
 
   //loadPadSel:
     assign wLoadPadSel    = {
                         Caddr=='d92 ? Cdata : rDataPadSel[39:32],
                         Caddr=='d91 ? Cdata : rDataPadSel[31:24],
                         Caddr=='d90 ? Cdata : rDataPadSel[23:16],
                         Caddr=='d89 ? Cdata : rDataPadSel[15:08],
                         Caddr=='d88 ? Cdata : rDataPadSel[07:00]};
 
/*Logic for generating PRN by selcting pad values with the help of pad select*/
   assign wSelectPadBit    = {rDataPadSel[31], rDataPadSel[3], rDataPadSel[5], rDataPadSel[19], rDataPadSel[8]};
   assign wPadAmount 	   = {1'b1, rDataInjector[30], rDataInjector[5], rDataInjector[9], rDataInjector[2], rDataInjector[27]};  
 
assign wPRN =
      (wSelectPadBit == 5'd00) ? rDataPad1[15] :
      (wSelectPadBit == 5'd01) ? rDataPad0[37] :
      (wSelectPadBit == 5'd02) ? rDataPad2[73] :
      (wSelectPadBit == 5'd03) ? rDataPad3[99] :
      (wSelectPadBit == 5'd04) ? rDataPad0[121] :
      (wSelectPadBit == 5'd05) ? rDataPad1[130] :
      (wSelectPadBit == 5'd06) ? rDataPad3[15] :
      (wSelectPadBit == 5'd07) ? rDataPad2[9] :
      (wSelectPadBit == 5'd08) ? rDataPad3[97] :
      (wSelectPadBit == 5'd09) ? rDataPad2[140] :
      (wSelectPadBit == 5'd10) ? rDataPad1[4] :
      (wSelectPadBit == 5'd11) ? rDataPad0[88] :
      (wSelectPadBit == 5'd12) ? rDataPad0[33] :
      (wSelectPadBit == 5'd13) ? rDataPad1[75] :
      (wSelectPadBit == 5'd14) ? rDataPad2[35] :
      (wSelectPadBit == 5'd15) ? rDataPad3[155] :
      (wSelectPadBit == 5'd16) ? rDataPad2[28] :
      (wSelectPadBit == 5'd17) ? rDataPad1[150] :
      (wSelectPadBit == 5'd18) ? rDataPad3[29] :
      (wSelectPadBit == 5'd19) ? rDataPad0[144] :
      (wSelectPadBit == 5'd20) ? rDataPad0[127] :
      (wSelectPadBit == 5'd21) ? rDataPad1[125] :
      (wSelectPadBit == 5'd22) ? rDataPad2[0] :
      (wSelectPadBit == 5'd23) ? rDataPad3[5] : 
      (wSelectPadBit == 5'd24) ? rDataPad0[110] :
      (wSelectPadBit == 5'd25) ? rDataPad3[87] :
      (wSelectPadBit == 5'd26) ? rDataPad1[19] :
      (wSelectPadBit == 5'd27) ? rDataPad2[82] :
      (wSelectPadBit == 5'd28) ? rDataPad0[48] :
      (wSelectPadBit == 5'd29) ? rDataPad1[47] :
      (wSelectPadBit == 5'd30) ? rDataPad2[46] :
                                 rDataPad3[51];
 
always @(posedge Clk or posedge Reset) begin
  if(Reset == 1'b1) begin
     rDataPad0 	    <= 'b0;
     rDataPad1 	    <= 'b0;
     rDataPad2 	    <= 'b0;
     rDataPad3 	    <= 'b0;
     rDataPadSel    <= 'b0;
     rDataCDATA     <= 'b0;
     rDataInjector  <= 'b0;
     nextState <= stateReset;
  end
  else 
  begin
      rDataPad0     <= wXorPad0;
      rDataPad1     <= wXorPad1;
      rDataPad2     <= wXorPad2;
      rDataPad3     <= wXorPad3;
      rDataPadSel   <= wXorPadSel;
      rDataCDATA    <= wXorCDATA;
      rDataInjector <= wXorInjector;
      opDin         <= wopDin;
/*State Machine code*/
 
    case(nextState)
 
      stateReset: begin
	 rIdle 	       <= 1'b1;
	 rIdleInjector <= 1'b1;
	 rIdleCDATA    <= 1'b1;
	 rIsBW 	       <= 1'b0;
	 rDataOut      <= 1'b0;
	 nextState     <= stateLoadPads;
      end
 
      stateLoadPads: begin
	 rIdle 		  <= 1'b1;
	 rIdleInjector 	  <= 1'b1;
	 rIdleCDATA 	  <= 1'b1;
	 rIsBW	  	  <= 1'b0;
	 if(inEmpty == 1'b1)
	   nextState 	  <= stateLoadPads;
	 else begin
	    ipFifoLoadCnt  = 0;
	    nextState 	  <= stateLoad;
	 end
 
	 end
 
       stateLoad: begin
	  rIdle 	<= 1'b1;
	  rIdleInjector <= 1'b1;
	  rIdleCDATA 	<= 1'b1;
	  rIsBW 	<= 1'b0;
	  rPadAmount 	<= wPadAmount;
	  if(inEmpty == 1'b0) begin
	     case(ipFifoLoadCnt)
	       0: rDataCDATA[31:24] <= inDout;
	       1: rDataCDATA[23:16] <= inDout;
	       2: rDataCDATA[15:8]  <= inDout;
	       3: rDataCDATA[7:0]   <= inDout;
	     endcase // case (ipFifoLoadCnt)
	  ipFifoLoadCnt = ipFifoLoadCnt+1;
	  end
	  if(ipFifoLoadCnt == 4) begin
	    nextState     <= stateStepFW;
	    PadCounter     = 0;
	    injectorCounter= 0;
	    rIdle 	  <= 1'b0;
	    rDirection    <= 1'b1;
	    rIdleCDATA    <= 1'b1;
	    rIdleInjector <= 1'b0;
	    rIsBW	  <= 1'b0;
	  end
	  else
	    nextState <= stateLoad;
 
       end // case: (stateLoad)
 
      stateStepFW: begin
	 ipFifoLoadCnt 	= 0;
	 rIdle 	       <= 1'b0;
	 rDirection    <= 1'b1;
	 rIdleCDATA    <= 1'b1;
	 rIsBW	       <= 1'b0;
	 unConfuserCnt 	= 0;
	 if(PadCounter == rPadAmount-1) begin
	   nextState   <= stateStepBW;
	   rDirection  <= 1'b0;
	   rIsBW       <= 1'b1;
	   rPRN        <= 1'b0;
//	   rIdleCDATA  <= 1'b0;
	   PadCounter   = PadCounter-1;
	 end
	 else
	   nextState   <= stateStepFW;
	 if(injectorCounter >= 38) begin
	   rIdleInjector <= 1'b1;
 	 end
	 else rIdleInjector <= 1'b0;
 	 PadCounter 	= PadCounter+1;
	 injectorCounter= injectorCounter+1;
      end // case: (stateStepFW)
 
      stateStepBW: begin
	 rIdle 	       <= 1'b0;
 	 if(PadCounter == rPadAmount-1) begin
	  rIsBW        <= 1'b0;
	  rPRN	       <= 1'b0;
	 end
	 else begin
	  rIsBW	       <= 1'b0;
	  rPRN 	       <= wPRN;
 	 end
	 if(injectorCounter >= 38) begin
	  rIdleInjector <= 1'b1;
	  //injectorCounter = injectorCounter+1;
	 end
	 else begin
	  rIdleInjector <= 1'b0;
	  injectorCounter= injectorCounter+1;
	 end
	 rDirection    <= 1'b0;
	 rIsBW 	       <= 1'b0;
	 rIdleCDATA  <= 1'b0;
	 PadCounter = PadCounter - 1;
	 unConfuserCnt 	   = unConfuserCnt+1;
	 if(PadCounter == -1) begin
	    nextState 	  <= stateCDATABW;
	    opFifoLoadCnt  = 0;
	    rIdle         <= 1'b1;
	    rIdleInjector <= 1'b1;
	    rIdleCDATA    <= 1'b0;
 	    rIsBW 	  <= 1'b0;
	 end
	 else
	   nextState 	  <= stateStepBW;
      end // case: (stateStepBW)
 
      stateCDATABW: begin
         rIdle         <= 1'b1;
	 rIdleCDATA    <= 1'b1;
	 rIdleInjector <= 1'b1;
	 rIsBW         <= 1'b0;
	 nextState     <= stateLoadOut;
      end
 
      stateLoadOut: begin
	 rIdle 	       <= 1'b1;
	 rIdleCDATA    <= 1'b1;
	 rIdleInjector <= 1'b1;
	 rIsBW 	       <= 1'b0;
	 rDataOut      <= 1'b1;
	 if(opFull == 1'b0)
	   opFifoLoadCnt = opFifoLoadCnt+1;
 
	 if(opFifoLoadCnt == 4) begin
 	  rIdle        <= 1'b0;
	  rDirection   <= 1'b1;
	  PadCounter    = 0;
	  rIdleCDATA   <= 1'b1;
  	  rIdleInjector<= 1'b1;
	  nextState    <= stateFinalFW;
	 end 
      end // case: (stateLoadOut)
 
      stateFinalFW: begin
	 rIdle 	       <= 1'b0;
	 rDirection    <= 1'b1;
	 rIdleCDATA    <= 1'b1;
	 rIdleInjector <= 1'b1;
	 rDataOut      <= 1'b0;
	 if(PadCounter == rPadAmount-2) begin
	  if(inEmpty == 1'b1)
	   nextState   <= stateLoadPads;
	  else begin
	   ipFifoLoadCnt = 0;
	   nextState    <= stateLoad; end
	 end
	 else
	   nextState   <= stateFinalFW;
	PadCounter = PadCounter+1;
       end
      default: $display("Wrong CHoice");
 
    endcase // case (nextState)
   end
 end // always @ (posedge Clk or wReset)
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.