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

Subversion Repositories rs_decoder_31_19_6

[/] [rs_decoder_31_19_6/] [trunk/] [SCBLOCK.V] - Rev 4

Compare with Previous | Blame | View Log

//*****************************************************************//
// Syndrome Computation                                            // 
// This block consists mainly of 12 cells. Each cell computes      //
// syndrome value Si, for i=0,...,11.                              //
// At the end of received word block, all cells store the syndrome //
// values, while SC block set its flag (errdetect) if one or more  //
// syndrome values are not zero.                                   //
// Ref.: "High-speed VLSI Architecture for Parallel Reed-Solomon   //
//        Decoder", IEEE Trans. on VLSI, April 2003.               //
//*****************************************************************//
module SCblock(recword, clock1, clock2, active_sc, reset, syndvalue0,
               syndvalue1, syndvalue2, syndvalue3, syndvalue4, 
               syndvalue5, syndvalue6, syndvalue7, syndvalue8, 
               syndvalue9, syndvalue10, syndvalue11, errdetect, 
               en_sccell, evalsynd, holdsynd);

input [4:0] recword;
input clock1, clock2, active_sc, reset, evalsynd, holdsynd, en_sccell;
output [4:0] syndvalue0, syndvalue1, syndvalue2, syndvalue3, syndvalue4, 
             syndvalue5, syndvalue6, syndvalue7, syndvalue8, syndvalue9, 
             syndvalue10, syndvalue11;
output errdetect;

reg errdetect;
reg [1:0] state, nxt_state;
parameter [1:0] st0=0, st1=1, st2=2;

always@(state or active_sc or evalsynd)
begin
    case(state)
        st0:   begin
               if(active_sc)
                  nxt_state <= st1;
               else
                  nxt_state <= st0;
               end
        st1:   begin
               if(evalsynd)
                  nxt_state <= st2;
               else
                  nxt_state <= st1;
               end
        st2:   nxt_state <= st0;
        default: nxt_state <= st0;
    endcase
end

always@(posedge clock2 or negedge reset)
begin
   if(~reset)
      state <= st0;
   else
      state <=  nxt_state;
end
 
always@(state or syndvalue0 or syndvalue1 or syndvalue2 or syndvalue3 or 
        syndvalue4 or syndvalue5 or syndvalue6 or syndvalue7 or syndvalue8 or
        syndvalue9 or syndvalue10 or syndvalue11)
begin
    case(state)
        st0:   errdetect <= 0;
        st1:   errdetect <= 0;
        st2:   begin
               if (syndvalue0 || syndvalue1 || syndvalue2 || syndvalue3 ||
                   syndvalue4 || syndvalue5 || syndvalue6 || syndvalue7 ||
                   syndvalue8 || syndvalue9 || syndvalue10 || syndvalue11)
                  errdetect <= 1;
               else
                  errdetect <= 0;
               end
        default:errdetect = 0;
   endcase
end

syndcell_0 cell_0(recword, clock1, en_sccell, holdsynd, syndvalue0);
syndcell_1 cell_1(recword, clock1, en_sccell, holdsynd, syndvalue1);
syndcell_2 cell_2(recword, clock1, en_sccell, holdsynd, syndvalue2);
syndcell_3 cell_3(recword, clock1, en_sccell, holdsynd, syndvalue3);
syndcell_4 cell_4(recword, clock1, en_sccell, holdsynd, syndvalue4);
syndcell_5 cell_5(recword, clock1, en_sccell, holdsynd, syndvalue5);
syndcell_6 cell_6(recword, clock1, en_sccell, holdsynd, syndvalue6);
syndcell_7 cell_7(recword, clock1, en_sccell, holdsynd, syndvalue7);
syndcell_8 cell_8(recword, clock1, en_sccell, holdsynd, syndvalue8);
syndcell_9 cell_9(recword, clock1, en_sccell, holdsynd, syndvalue9);
syndcell_10 cell_10(recword, clock1, en_sccell, holdsynd, syndvalue10);
syndcell_11 cell_11(recword, clock1, en_sccell, holdsynd, syndvalue11);

endmodule    


//*****************************/
// Syndrome Computation Cells //
//****************************//

//**************************************************//
//syndcell_0 computes R(alpha^19) for 31 clock cycles//
//**************************************************//
module syndcell_0(recword, clock, enable, hold, synvalue0);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue0;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^19
assign outmult[0] = outreg[3] ^ outreg[4];
assign outmult[1] = outreg[0] ^ outreg[4];
assign outmult[2] = (outreg[0] ^ outreg[1]) ^ (outreg[3] ^ outreg[4]);
assign outmult[3] = (outreg[1] ^ outreg[2]) ^ outreg[4];
assign outmult[4] = outreg[2] ^ outreg[3];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue0 = outreg;

endmodule

//**************************************************//
//syndcell_1 computes R(alpha^20) for 31 clock cycles//
//**************************************************//
module syndcell_1(recword, clock, enable, hold, synvalue1);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue1;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^20
assign outmult[0] = outreg[2] ^ outreg[3];
assign outmult[1] = outreg[3] ^ outreg[4];
assign outmult[2] = (outreg[0] ^ outreg[4]) ^ (outreg[2] ^ outreg[3]);
assign outmult[3] = (outreg[0] ^ outreg[1]) ^ (outreg[3] ^ outreg[4]);
assign outmult[4] = (outreg[1] ^ outreg[2]) ^ outreg[4];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue1 = outreg;

endmodule

//**************************************************//
//syndcell_2 computes R(alpha^21) for 31 clock cycles//
//**************************************************//
module syndcell_2(recword, clock, enable, hold, synvalue2);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue2;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^21
assign outmult[0] = (outreg[1] ^ outreg[2]) ^ outreg[4];
assign outmult[1] = outreg[2] ^ outreg[3];
assign outmult[2] = (outreg[1] ^ outreg[2]) ^ outreg[3];
assign outmult[3] = (outreg[0] ^ outreg[2]) ^ (outreg[3] ^ outreg[4]);
assign outmult[4] = (outreg[0] ^ outreg[1]) ^ (outreg[3] ^ outreg[4]);

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue2 = outreg;

endmodule

//**************************************************//
//syndcell_3 computes R(alpha^22) for 31 clock cycles//
//**************************************************//
module syndcell_3(recword, clock, enable, hold, synvalue3);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue3;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^22
assign outmult[0] = (outreg[0] ^ outreg[1]) ^ (outreg[3] ^ outreg[4]);
assign outmult[1] = (outreg[1] ^ outreg[2]) ^ outreg[4];
assign outmult[2] = (outreg[0] ^ outreg[1]) ^ (outreg[2] ^ outreg[4]);
assign outmult[3] = (outreg[1] ^ outreg[2]) ^ outreg[3];
assign outmult[4] = (outreg[0] ^ outreg[2]) ^ (outreg[3] ^ outreg[4]);

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue3 = outreg;

endmodule

//***************************************************//
//syndcell_4 computes R(alpha^23) for 31 clock cycles//
//**************************************************//
module syndcell_4(recword, clock, enable, hold, synvalue4);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue4;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^23
assign outmult[0] = (outreg[0] ^ outreg[2]) ^ (outreg[3] ^ outreg[4]);
assign outmult[1] = (outreg[0] ^ outreg[1]) ^ (outreg[3] ^ outreg[4]);
assign outmult[2] = (outreg[0] ^ outreg[1]) ^ outreg[3];
assign outmult[3] = (outreg[0] ^ outreg[1]) ^ (outreg[2] ^ outreg[4]);
assign outmult[4] = (outreg[1] ^ outreg[2]) ^ outreg[3];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue4 = outreg;

endmodule

//***************************************************//
//syndcell_5 computes R(alpha^24) for 31 clock cycles//
//***************************************************//
module syndcell_5(recword, clock, enable, hold, synvalue5);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue5;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^24
assign outmult[0] = (outreg[1] ^ outreg[2]) ^ outreg[3];
assign outmult[1] = (outreg[0] ^ outreg[2]) ^ (outreg[3] ^ outreg[4]);
assign outmult[2] = (outreg[0] ^ outreg[2]) ^ outreg[4];
assign outmult[3] = (outreg[0] ^ outreg[1]) ^ outreg[3];
assign outmult[4] = (outreg[0] ^ outreg[1]) ^ (outreg[2] ^ outreg[4]);

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue5 = outreg;

endmodule

//***************************************************//
//syndcell_6 computes R(alpha^25) for 31 clock cycles//
//***************************************************//
module syndcell_6(recword, clock, enable, hold, synvalue6);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue6;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^25
assign outmult[0] = (outreg[0] ^ outreg[1]) ^ (outreg[2] ^ outreg[4]);
assign outmult[1] = (outreg[1] ^ outreg[2]) ^ outreg[3];
assign outmult[2] = outreg[1] ^ outreg[3];
assign outmult[3] = (outreg[0] ^ outreg[2]) ^ outreg[4];
assign outmult[4] = (outreg[0] ^ outreg[1]) ^ outreg[3];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue6 = outreg;

endmodule

//***************************************************//
//syndcell_7 computes R(alpha^26) for 31 clock cycles//
//***************************************************//
module syndcell_7(recword, clock, enable, hold, synvalue7);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue7;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^26
assign outmult[0] = (outreg[0] ^ outreg[1]) ^ outreg[3];
assign outmult[1] = (outreg[0] ^ outreg[1]) ^ (outreg[2] ^ outreg[4]);
assign outmult[2] = outreg[0] ^ outreg[2];
assign outmult[3] = outreg[1] ^ outreg[3];
assign outmult[4] = (outreg[0] ^ outreg[2]) ^ outreg[4];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue7 = outreg;

endmodule

//***************************************************//
//syndcell_8 computes R(alpha^27) for 31 clock cycles//
//***************************************************//
module syndcell_8(recword, clock, enable, hold, synvalue8);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue8;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^27
assign outmult[0] = (outreg[0] ^ outreg[2]) ^ outreg[4];
assign outmult[1] = (outreg[0] ^ outreg[1]) ^ outreg[3];
assign outmult[2] = outreg[1];
assign outmult[3] = outreg[0] ^ outreg[2];
assign outmult[4] = outreg[1] ^ outreg[3];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue8 = outreg;

endmodule

//***************************************************//
//syndcell_9 computes R(alpha^28) for 31 clock cycles//
//***************************************************//
module syndcell_9(recword, clock, enable, hold, synvalue9);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue9;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^28
assign outmult[0] = outreg[1] ^ outreg[3];
assign outmult[1] = (outreg[0] ^ outreg[2]) ^ outreg[4];
assign outmult[2] = outreg[0];
assign outmult[3] = outreg[1];
assign outmult[4] = outreg[0] ^ outreg[2];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue9 = outreg;

endmodule

//****************************************************//
//syndcell_10 computes R(alpha^29) for 31 clock cycles//
//****************************************************//
module syndcell_10(recword, clock, enable, hold, synvalue10);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue10;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^29
assign outmult[0] = outreg[0] ^ outreg[2];
assign outmult[1] = outreg[1] ^ outreg[3];
assign outmult[2] = outreg[4];
assign outmult[3] = outreg[0];
assign outmult[4] = outreg[1];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue10 = outreg;

endmodule

//****************************************************//
//syndcell_11 computes R(alpha^30) for 31 clock cycles//
//****************************************************//
module syndcell_11(recword, clock, enable, hold, synvalue11);

input [0:4] recword;
input clock;
input enable, hold;
output [0:4] synvalue11;

wire [0:4] outreg;
wire [0:4] outadder;
wire [0:4] outmult;

//multiply recword with constant alpha^30
assign outmult[0] = outreg[1];
assign outmult[1] = outreg[0] ^ outreg[2];
assign outmult[2] = outreg[3];
assign outmult[3] = outreg[4];
assign outmult[4] = outreg[0];

register5_wlh register5bit(outadder, outreg, enable, hold, clock);
gfadder   adder(recword, outmult, outadder);
assign synvalue11 = outreg;

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.