SOFA/BENCHMARK/rs_decoder/rtl/rs_decoder.v

1413 lines
30 KiB
Verilog

// -------------------------------------------------------------------------
//Reed-Solomon decoder
//Copyright (C) Wed May 22 09:59:27 2002
//by Ming-Han Lei(hendrik@humanistic.org)
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// --------------------------------------------------------------------------
module rs_decoder_top(x, error, with_error, enable, valid, k, clk, clrn);
input enable, clk, clrn;
input [4:0] k, x;
output [4:0] error;
wire [4:0] error;
output with_error, valid;
reg valid;
wire with_error;
wire [4:0] s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;
wire [4:0] lambda, omega, alpha;
reg [3:0] count;
reg [12:0] phase;
wire [4:0] D0, D1, DI;
//reg [4:0] D, D2;
wire [4:0] D, D2;
reg [4:0] u, length0, length2;
wire [4:0] length1, length3;
reg syn_enable, syn_init, syn_shift, berl_enable;
reg chien_search, chien_load, shorten;
always @ (chien_search or shorten)
valid = chien_search & ~shorten;
wire bit1;
assign bit1 = syn_shift&phase[0];
rsdec_syn x0 (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, u, syn_enable, bit1, syn_init, clk, clrn);
rsdec_berl x1 (lambda, omega, s0, s11, s10, s9, s8, s7, s6, s5, s4, s3, s2, s1, D0, D2, count, phase[0], phase[12], berl_enable, clk, clrn);
rsdec_chien x2 (error, alpha, lambda, omega, D1, DI, chien_search, chien_load, shorten, clk, clrn);
inverse x3 (DI, D);
always @ (posedge clk)// or negedge clrn)
begin
if (~clrn)
begin
syn_enable <= 0;
syn_shift <= 0;
berl_enable <= 0;
chien_search <= 1;
chien_load <= 0;
length0 <= 0;
length2 <= 31 - k;
count <= -1;
phase <= 1;
u <= 0;
shorten <= 1;
syn_init <= 0;
end
else
begin
if (enable & ~syn_enable & ~syn_shift)
begin
syn_enable <= 1;
syn_init <= 1;
end
else if (syn_enable)
begin
length0 <= length1;
syn_init <= 0;
if (length1 == k)
begin
syn_enable <= 0;
syn_shift <= 1;
berl_enable <= 1;
end
end
else if (berl_enable & with_error)
begin
if (phase[0])
begin
count <= count + 1;
if (count == 11)
begin
syn_shift <= 0;
length0 <= 0;
chien_load <= 1;
length2 <= length0;
end
end
phase <= {phase[11:0], phase[12]};
end
else if (berl_enable & ~with_error)
if (&count)
begin
syn_shift <= 0;
length0 <= 0;
berl_enable <= 0;
end
else
phase <= {phase[11:0], phase[12]};
else if (chien_load & phase[12])
begin
berl_enable <= 0;
chien_load <= 0;
chien_search <= 1;
count <= -1;
phase <= 1;
end
else if (chien_search)
begin
length2 <= length3;
if (length3 == 0)
chien_search <= 0;
end
else if (enable) u <= x;
else if (shorten == 1 && length2 == 0)
shorten <= 0;
end
end
// always @ (chien_search or D0 or D1)
// if (chien_search) D = D1;
// else D = D0;
assign D = chien_search ? D1 : D0;
// always @ (DI or alpha or chien_load)
// if (chien_load) D2 = alpha;
// else D2 = DI;
assign D2 = chien_load ? alpha : DI;
assign length1 = length0 + 1;
assign length3 = length2 - 1;
// always @ (syn_shift or s0 or s1 or s2 or s3 or s4 or s5 or s6 or s7 or s8 or s9 or s10 or s11)
// if (syn_shift && (s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 | s8 | s9 | s10 | s11)!= 0)
// with_error = 1;
// else with_error = 0;
wire temp;
assign temp = syn_shift && (s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 | s8 | s9 | s10 | s11);
assign with_error = temp != 0 ? 1'b1 : 1'b0;
endmodule
// -------------------------------------------------------------------------
//The inverse lookup table for Galois field
//Copyright (C) Tue Apr 2 17:21:59 2002
//by Ming-Han Lei(hendrik@humanistic.org)
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// --------------------------------------------------------------------------
module inverse(y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
case (x) // synopsys full_case parallel_case
1: y = 1; // 0 -> 31
2: y = 18; // 1 -> 30
4: y = 9; // 2 -> 29
8: y = 22; // 3 -> 28
16: y = 11; // 4 -> 27
5: y = 23; // 5 -> 26
10: y = 25; // 6 -> 25
20: y = 30; // 7 -> 24
13: y = 15; // 8 -> 23
26: y = 21; // 9 -> 22
17: y = 24; // 10 -> 21
7: y = 12; // 11 -> 20
14: y = 6; // 12 -> 19
28: y = 3; // 13 -> 18
29: y = 19; // 14 -> 17
31: y = 27; // 15 -> 16
27: y = 31; // 16 -> 15
19: y = 29; // 17 -> 14
3: y = 28; // 18 -> 13
6: y = 14; // 19 -> 12
12: y = 7; // 20 -> 11
24: y = 17; // 21 -> 10
21: y = 26; // 22 -> 9
15: y = 13; // 23 -> 8
30: y = 20; // 24 -> 7
25: y = 10; // 25 -> 6
23: y = 5; // 26 -> 5
11: y = 16; // 27 -> 4
22: y = 8; // 28 -> 3
9: y = 4; // 29 -> 2
18: y = 2; // 30 -> 1
endcase
endmodule
// -------------------------------------------------------------------------
//Berlekamp circuit for Reed-Solomon decoder
//Copyright (C) Tue Apr 2 17:21:42 2002
//by Ming-Han Lei(hendrik@humanistic.org)
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// --------------------------------------------------------------------------
module rsdec_berl (lambda_out, omega_out, syndrome0, syndrome1, syndrome2, syndrome3, syndrome4, syndrome5, syndrome6, syndrome7, syndrome8, syndrome9, syndrome10, syndrome11,
D, DI, count, phase0, phase12, enable, clk, clrn);
input clk, clrn, enable, phase0, phase12;
input [4:0] syndrome0;
input [4:0] syndrome1;
input [4:0] syndrome2;
input [4:0] syndrome3;
input [4:0] syndrome4;
input [4:0] syndrome5;
input [4:0] syndrome6;
input [4:0] syndrome7;
input [4:0] syndrome8;
input [4:0] syndrome9;
input [4:0] syndrome10;
input [4:0] syndrome11;
input [4:0] DI;
input [3:0] count;
output [4:0] lambda_out;
output [4:0] omega_out;
reg [4:0] lambda_out;
reg [4:0] omega_out;
output [4:0] D;
reg [4:0] D;
reg init, delta;
reg [2:0] L;
reg [4:0] lambda0;
reg [4:0] lambda1;
reg [4:0] lambda2;
reg [4:0] lambda3;
reg [4:0] lambda4;
reg [4:0] lambda5;
reg [4:0] lambda6;
reg [4:0] lambda7;
reg [4:0] lambda8;
reg [4:0] lambda9;
reg [4:0] lambda10;
reg [4:0] lambda11;
reg [4:0] B0;
reg [4:0] B1;
reg [4:0] B2;
reg [4:0] B3;
reg [4:0] B4;
reg [4:0] B5;
reg [4:0] B6;
reg [4:0] B7;
reg [4:0] B8;
reg [4:0] B9;
reg [4:0] B10;
reg [4:0] omega0;
reg [4:0] omega1;
reg [4:0] omega2;
reg [4:0] omega3;
reg [4:0] omega4;
reg [4:0] omega5;
reg [4:0] omega6;
reg [4:0] omega7;
reg [4:0] omega8;
reg [4:0] omega9;
reg [4:0] omega10;
reg [4:0] omega11;
reg [4:0] A0;
reg [4:0] A1;
reg [4:0] A2;
reg [4:0] A3;
reg [4:0] A4;
reg [4:0] A5;
reg [4:0] A6;
reg [4:0] A7;
reg [4:0] A8;
reg [4:0] A9;
reg [4:0] A10;
wire [4:0] tmp0;
wire [4:0] tmp1;
wire [4:0] tmp2;
wire [4:0] tmp3;
wire [4:0] tmp4;
wire [4:0] tmp5;
wire [4:0] tmp6;
wire [4:0] tmp7;
wire [4:0] tmp8;
wire [4:0] tmp9;
wire [4:0] tmp10;
wire [4:0] tmp11;
always @ (tmp1) lambda_out = tmp1;
always @ (tmp3) omega_out = tmp3;
always @ (L or D or count)
// delta = (D != 0 && 2*L <= i);
if (D != 0 && count >= {L, 1'b0}) delta = 1;
else delta = 0;
rsdec_berl_multiply x0 (tmp0, B10, D, lambda0, syndrome0, phase0);
rsdec_berl_multiply x1 (tmp1, lambda11, DI, lambda1, syndrome1, phase0);
rsdec_berl_multiply x2 (tmp2, A10, D, lambda2, syndrome2, phase0);
rsdec_berl_multiply x3 (tmp3, omega11, DI, lambda3, syndrome3, phase0);
multiply x4 (tmp4, lambda4, syndrome4);
multiply x5 (tmp5, lambda5, syndrome5);
multiply x6 (tmp6, lambda6, syndrome6);
multiply x7 (tmp7, lambda7, syndrome7);
multiply x8 (tmp8, lambda8, syndrome8);
multiply x9 (tmp9, lambda9, syndrome9);
multiply x10 (tmp10, lambda10, syndrome10);
multiply x11 (tmp11, lambda11, syndrome11);
always @ (posedge clk)// or negedge clrn)
begin
// for (j = t-1; j >=0; j--)
// if (j != 0) lambda[j] += D * B[j-1];
/* if (~clrn)
begin
lambda0 <= 0;
lambda1 <= 0;
lambda2 <= 0;
lambda3 <= 0;
lambda4 <= 0;
lambda5 <= 0;
lambda6 <= 0;
lambda7 <= 0;
lambda8 <= 0;
lambda9 <= 0;
lambda10 <= 0;
lambda11 <= 0;
B0 <= 0;
B1 <= 0;
B2 <= 0;
B3 <= 0;
B4 <= 0;
B5 <= 0;
B6 <= 0;
B7 <= 0;
B8 <= 0;
B9 <= 0;
B10 <= 0;
omega0 <= 0;
omega1 <= 0;
omega2 <= 0;
omega3 <= 0;
omega4 <= 0;
omega5 <= 0;
omega6 <= 0;
omega7 <= 0;
omega8 <= 0;
omega9 <= 0;
omega10 <= 0;
omega11 <= 0;
A0 <= 0;
A1 <= 0;
A2 <= 0;
A3 <= 0;
A4 <= 0;
A5 <= 0;
A6 <= 0;
A7 <= 0;
A8 <= 0;
A9 <= 0;
A10 <= 0;
// for (j = 0; j < 12; j = j + 1) lambda[j] <= 0;
// for (j = 0; j < 11; j = j + 1) B[j] <= 0;
// for (j = 0; j < 12; j = j + 1) omega[j] <= 0;
// for (j = 0; j < 11; j = j + 1) A[j] <= 0;
end
else*/ if (~enable)
begin
lambda0 <= 1;
lambda1 <= 0;
lambda2 <= 0;
lambda3 <= 0;
lambda4 <= 0;
lambda5 <= 0;
lambda6 <= 0;
lambda7 <= 0;
lambda8 <= 0;
lambda9 <= 0;
lambda10 <= 0;
lambda11 <= 0;
//for (j = 1; j < 12; j = j +1) lambda[j] <= 0;
B0 <= 1;
B1 <= 0;
B2 <= 0;
B3 <= 0;
B4 <= 0;
B5 <= 0;
B6 <= 0;
B7 <= 0;
B8 <= 0;
B9 <= 0;
B10 <= 0;
//for (j = 1; j < 11; j = j +1) B[j] <= 0;
omega0 <= 1;
omega1 <= 0;
omega2 <= 0;
omega3 <= 0;
omega4 <= 0;
omega5 <= 0;
omega6 <= 0;
omega7 <= 0;
omega8 <= 0;
omega9 <= 0;
omega10 <= 0;
omega11 <= 0;
//for (j = 1; j < 12; j = j +1) omega[j] <= 0;
A0 <= 0;
A1 <= 0;
A2 <= 0;
A3 <= 0;
A4 <= 0;
A5 <= 0;
A6 <= 0;
A7 <= 0;
A8 <= 0;
A9 <= 0;
A10 <= 0;
//for (j = 0; j < 11; j = j + 1) A[j] <= 0;
end
else
begin
if (~phase0)
begin
if (~phase12) lambda0 <= lambda11 ^ tmp0;
else lambda0 <= lambda11;
//for (j = 1; j < 12; j = j + 1)
//lambda[j] <= lambda[j-1];
lambda1 <= lambda0;
lambda2 <= lambda1;
lambda3 <= lambda2;
lambda4 <= lambda3;
lambda5 <= lambda4;
lambda6 <= lambda5;
lambda7 <= lambda6;
lambda8 <= lambda7;
lambda9 <= lambda8;
lambda10 <= lambda9;
lambda11 <= lambda10;
// end
// for (j = t-1; j >=0; j--)
// if (delta) B[j] = lambda[j] *DI;
// else if (j != 0) B[j] = B[j-1];
// else B[j] = 0;
// if (~phase0)
// begin
if (delta) B0 <= tmp1;
else if (~phase12) B0 <= B10;
else B0 <= 0;
//for (j = 1; j < 11; j = j + 1)
// B[j] <= B[j-1];
B1 <= B0;
B2 <= B1;
B3 <= B2;
B4 <= B3;
B5 <= B4;
B6 <= B5;
B7 <= B6;
B8 <= B7;
B9 <= B8;
B10 <= B9;
// end
// for (j = t-1; j >=0; j--)
// if (j != 0) omega[j] += D * A[j-1];
// if (~phase0)
// begin
if (~phase12) omega0 <= omega11 ^ tmp2;
else omega0 <= omega11;
//for (j = 1; j < 12; j = j + 1)
// omega[j] <= omega[j-1];
omega1 <= omega0;
omega2 <= omega1;
omega3 <= omega2;
omega4 <= omega3;
omega5 <= omega4;
omega6 <= omega5;
omega7 <= omega6;
omega8 <= omega7;
omega9 <= omega8;
omega10 <= omega9;
omega11 <= omega10;
// end
// for (j = t-1; j >=0; j--)
// if (delta) A[j] = omega[j] *DI;
// else if (j != 0) A[j] = A[j-1];
// else A[j] = 0;
// if (~phase0)
// begin
if (delta) A0 <= tmp3;
else if (~phase12) A0 <= A10;
//for (j = 1; j < 11; j = j + 1)
// A[j] <= A[j-1];
A1 <= A0;
A2 <= A1;
A3 <= A2;
A4 <= A3;
A5 <= A4;
A6 <= A5;
A7 <= A6;
A8 <= A7;
A9 <= A8;
A10 <= A9;
// end
end
end
end
always @ (posedge clk)// or negedge clrn)
begin
if (~clrn)
begin
L <= 0;
D <= 0;
end
else
begin
// if (delta) L = i - L + 1;
if ((phase0 & delta) && (count != -1)) L <= count - L + 1;
//for (D = j = 0; j < t; j = j + 1)
// D += lambda[j] * syndrome[t-j-1];
if (phase0)
D <= tmp0 ^ tmp1 ^ tmp2 ^ tmp3 ^ tmp4 ^ tmp5 ^ tmp6 ^ tmp7 ^ tmp8 ^ tmp9 ^ tmp10 ^ tmp11;
end
end
endmodule
module rsdec_berl_multiply (y, a, b, c, d, e);
input [4:0] a, b, c, d;
input e;
output [4:0] y;
wire [4:0] y;
reg [4:0] p, q;
always @ (a or c or e)
if (e) p = c;
else p = a;
always @ (b or d or e)
if (e) q = d;
else q = b;
multiply x0 (y, p, q);
endmodule
module multiply (y, a, b);
input [4:0] a, b;
output [4:0] y;
reg [9:0] tempy;
wire [4:0] y;
assign y = tempy[4:0];
always @(a or b)
begin
tempy = a * b;
end
/*
always @ (a or b)
begin
y[0] = (a[0] & b[0]) ^ (a[1] & b[4]) ^ (a[2] & b[3]) ^ (a[3] & b[2]) ^ (a[4] & b[1]) ^ (a[4] & b[4]);
y[1] = (a[0] & b[1]) ^ (a[1] & b[0]) ^ (a[2] & b[4]) ^ (a[3] & b[3]) ^ (a[4] & b[2]);
y[2] = (a[0] & b[2]) ^ (a[1] & b[1]) ^ (a[1] & b[4]) ^ (a[2] & b[0]) ^ (a[2] & b[3]) ^ (a[3] & b[2]) ^ (a[3] & b[4]) ^ (a[4] & b[1]) ^ (a[4] & b[3]) ^ (a[4] & b[4]);
y[3] = (a[0] & b[3]) ^ (a[1] & b[2]) ^ (a[2] & b[1]) ^ (a[2] & b[4]) ^ (a[3] & b[0]) ^ (a[3] & b[3]) ^ (a[4] & b[2]) ^ (a[4] & b[4]);
y[4] = (a[0] & b[4]) ^ (a[1] & b[3]) ^ (a[2] & b[2]) ^ (a[3] & b[1]) ^ (a[3] & b[4]) ^ (a[4] & b[0]) ^ (a[4] & b[3]);
endi
*/
endmodule
// -------------------------------------------------------------------------
//Chien-Forney search circuit for Reed-Solomon decoder
//Copyright (C) Tue Apr 2 17:21:51 2002
//by Ming-Han Lei(hendrik@humanistic.org)
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// --------------------------------------------------------------------------
module rsdec_chien_scale0 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0];
y[1] = x[1];
y[2] = x[2];
y[3] = x[3];
y[4] = x[4];
end
endmodule
module rsdec_chien_scale1 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[4];
y[1] = x[0];
y[2] = x[1] ^ x[4];
y[3] = x[2];
y[4] = x[3];
end
endmodule
module rsdec_chien_scale2 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[3];
y[1] = x[4];
y[2] = x[0] ^ x[3];
y[3] = x[1] ^ x[4];
y[4] = x[2];
end
endmodule
module rsdec_chien_scale3 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[2];
y[1] = x[3];
y[2] = x[2] ^ x[4];
y[3] = x[0] ^ x[3];
y[4] = x[1] ^ x[4];
end
endmodule
module rsdec_chien_scale4 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[1] ^ x[4];
y[1] = x[2];
y[2] = x[1] ^ x[3] ^ x[4];
y[3] = x[2] ^ x[4];
y[4] = x[0] ^ x[3];
end
endmodule
module rsdec_chien_scale5 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[3];
y[1] = x[1] ^ x[4];
y[2] = x[0] ^ x[2] ^ x[3];
y[3] = x[1] ^ x[3] ^ x[4];
y[4] = x[2] ^ x[4];
end
endmodule
module rsdec_chien_scale6 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[2] ^ x[4];
y[1] = x[0] ^ x[3];
y[2] = x[1] ^ x[2];
y[3] = x[0] ^ x[2] ^ x[3];
y[4] = x[1] ^ x[3] ^ x[4];
end
endmodule
module rsdec_chien_scale7 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[1] ^ x[3] ^ x[4];
y[1] = x[2] ^ x[4];
y[2] = x[0] ^ x[1] ^ x[4];
y[3] = x[1] ^ x[2];
y[4] = x[0] ^ x[2] ^ x[3];
end
endmodule
module rsdec_chien_scale8 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[2] ^ x[3];
y[1] = x[1] ^ x[3] ^ x[4];
y[2] = x[0] ^ x[3] ^ x[4];
y[3] = x[0] ^ x[1] ^ x[4];
y[4] = x[1] ^ x[2];
end
endmodule
module rsdec_chien_scale9 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[1] ^ x[2];
y[1] = x[0] ^ x[2] ^ x[3];
y[2] = x[2] ^ x[3] ^ x[4];
y[3] = x[0] ^ x[3] ^ x[4];
y[4] = x[0] ^ x[1] ^ x[4];
end
endmodule
module rsdec_chien_scale10 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[1] ^ x[4];
y[1] = x[1] ^ x[2];
y[2] = x[1] ^ x[2] ^ x[3] ^ x[4];
y[3] = x[2] ^ x[3] ^ x[4];
y[4] = x[0] ^ x[3] ^ x[4];
end
endmodule
module rsdec_chien_scale11 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[3] ^ x[4];
y[1] = x[0] ^ x[1] ^ x[4];
y[2] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4];
y[3] = x[1] ^ x[2] ^ x[3] ^ x[4];
y[4] = x[2] ^ x[3] ^ x[4];
end
endmodule
module rsdec_chien (error, alpha, lambda, omega, even, D, search, load, shorten, clk, clrn);
input clk, clrn, load, search, shorten;
input [4:0] D;
input [4:0] lambda;
input [4:0] omega;
output [4:0] even, error;
output [4:0] alpha;
reg [4:0] even, error;
reg [4:0] alpha;
wire [4:0] scale0;
wire [4:0] scale1;
wire [4:0] scale2;
wire [4:0] scale3;
wire [4:0] scale4;
wire [4:0] scale5;
wire [4:0] scale6;
wire [4:0] scale7;
wire [4:0] scale8;
wire [4:0] scale9;
wire [4:0] scale10;
wire [4:0] scale11;
wire [4:0] scale12;
wire [4:0] scale13;
wire [4:0] scale14;
wire [4:0] scale15;
wire [4:0] scale16;
wire [4:0] scale17;
wire [4:0] scale18;
wire [4:0] scale19;
wire [4:0] scale20;
wire [4:0] scale21;
wire [4:0] scale22;
wire [4:0] scale23;
reg [4:0] data0;
reg [4:0] data1;
reg [4:0] data2;
reg [4:0] data3;
reg [4:0] data4;
reg [4:0] data5;
reg [4:0] data6;
reg [4:0] data7;
reg [4:0] data8;
reg [4:0] data9;
reg [4:0] data10;
reg [4:0] data11;
reg [4:0] a0;
reg [4:0] a1;
reg [4:0] a2;
reg [4:0] a3;
reg [4:0] a4;
reg [4:0] a5;
reg [4:0] a6;
reg [4:0] a7;
reg [4:0] a8;
reg [4:0] a9;
reg [4:0] a10;
reg [4:0] a11;
reg [4:0] l0;
reg [4:0] l1;
reg [4:0] l2;
reg [4:0] l3;
reg [4:0] l4;
reg [4:0] l5;
reg [4:0] l6;
reg [4:0] l7;
reg [4:0] l8;
reg [4:0] l9;
reg [4:0] l10;
reg [4:0] l11;
reg [4:0] o0;
reg [4:0] o1;
reg [4:0] o2;
reg [4:0] o3;
reg [4:0] o4;
reg [4:0] o5;
reg [4:0] o6;
reg [4:0] o7;
reg [4:0] o8;
reg [4:0] o9;
reg [4:0] o10;
reg [4:0] o11;
reg [4:0] odd, numerator;
wire [4:0] tmp;
rsdec_chien_scale0 x0 (scale0, data0);
rsdec_chien_scale1 x1 (scale1, data1);
rsdec_chien_scale2 x2 (scale2, data2);
rsdec_chien_scale3 x3 (scale3, data3);
rsdec_chien_scale4 x4 (scale4, data4);
rsdec_chien_scale5 x5 (scale5, data5);
rsdec_chien_scale6 x6 (scale6, data6);
rsdec_chien_scale7 x7 (scale7, data7);
rsdec_chien_scale8 x8 (scale8, data8);
rsdec_chien_scale9 x9 (scale9, data9);
rsdec_chien_scale10 x10 (scale10, data10);
rsdec_chien_scale11 x11 (scale11, data11);
rsdec_chien_scale0 x12 (scale12, o0);
rsdec_chien_scale1 x13 (scale13, o1);
rsdec_chien_scale2 x14 (scale14, o2);
rsdec_chien_scale3 x15 (scale15, o3);
rsdec_chien_scale4 x16 (scale16, o4);
rsdec_chien_scale5 x17 (scale17, o5);
rsdec_chien_scale6 x18 (scale18, o6);
rsdec_chien_scale7 x19 (scale19, o7);
rsdec_chien_scale8 x20 (scale20, o8);
rsdec_chien_scale9 x21 (scale21, o9);
rsdec_chien_scale10 x22 (scale22, o10);
rsdec_chien_scale11 x23 (scale23, o11);
always @ (shorten or a0 or l0)
if (shorten) data0 = a0;
else data0 = l0;
always @ (shorten or a1 or l1)
if (shorten) data1 = a1;
else data1 = l1;
always @ (shorten or a2 or l2)
if (shorten) data2 = a2;
else data2 = l2;
always @ (shorten or a3 or l3)
if (shorten) data3 = a3;
else data3 = l3;
always @ (shorten or a4 or l4)
if (shorten) data4 = a4;
else data4 = l4;
always @ (shorten or a5 or l5)
if (shorten) data5 = a5;
else data5 = l5;
always @ (shorten or a6 or l6)
if (shorten) data6 = a6;
else data6 = l6;
always @ (shorten or a7 or l7)
if (shorten) data7 = a7;
else data7 = l7;
always @ (shorten or a8 or l8)
if (shorten) data8 = a8;
else data8 = l8;
always @ (shorten or a9 or l9)
if (shorten) data9 = a9;
else data9 = l9;
always @ (shorten or a10 or l10)
if (shorten) data10 = a10;
else data10 = l10;
always @ (shorten or a11 or l11)
if (shorten) data11 = a11;
else data11 = l11;
always @ (posedge clk)// or negedge clrn)
begin
if (~clrn)
begin
l0 <= 0;
l1 <= 0;
l2 <= 0;
l3 <= 0;
l4 <= 0;
l5 <= 0;
l6 <= 0;
l7 <= 0;
l8 <= 0;
l9 <= 0;
l10 <= 0;
l11 <= 0;
o0 <= 0;
o1 <= 0;
o2 <= 0;
o3 <= 0;
o4 <= 0;
o5 <= 0;
o6 <= 0;
o7 <= 0;
o8 <= 0;
o9 <= 0;
o10 <= 0;
o11 <= 0;
a0 <= 1;
a1 <= 1;
a2 <= 1;
a3 <= 1;
a4 <= 1;
a5 <= 1;
a6 <= 1;
a7 <= 1;
a8 <= 1;
a9 <= 1;
a10 <= 1;
a11 <= 1;
end
else if (shorten)
begin
a0 <= scale0;
a1 <= scale1;
a2 <= scale2;
a3 <= scale3;
a4 <= scale4;
a5 <= scale5;
a6 <= scale6;
a7 <= scale7;
a8 <= scale8;
a9 <= scale9;
a10 <= scale10;
a11 <= scale11;
end
else if (search)
begin
l0 <= scale0;
l1 <= scale1;
l2 <= scale2;
l3 <= scale3;
l4 <= scale4;
l5 <= scale5;
l6 <= scale6;
l7 <= scale7;
l8 <= scale8;
l9 <= scale9;
l10 <= scale10;
l11 <= scale11;
o0 <= scale12;
o1 <= scale13;
o2 <= scale14;
o3 <= scale15;
o4 <= scale16;
o5 <= scale17;
o6 <= scale18;
o7 <= scale19;
o8 <= scale20;
o9 <= scale21;
o10 <= scale22;
o11 <= scale23;
end
else if (load)
begin
l0 <= lambda;
l1 <= l0;
l2 <= l1;
l3 <= l2;
l4 <= l3;
l5 <= l4;
l6 <= l5;
l7 <= l6;
l8 <= l7;
l9 <= l8;
l10 <= l9;
l11 <= l10;
o0 <= omega;
o1 <= o0;
o2 <= o1;
o3 <= o2;
o4 <= o3;
o5 <= o4;
o6 <= o5;
o7 <= o6;
o8 <= o7;
o9 <= o8;
o10 <= o9;
o11 <= o10;
a0 <= a11;
a1 <= a0;
a2 <= a1;
a3 <= a2;
a4 <= a3;
a5 <= a4;
a6 <= a5;
a7 <= a6;
a8 <= a7;
a9 <= a8;
a10 <= a9;
a11 <= a10;
end
end
always @ (l0 or l2 or l4 or l6 or l8 or l10)
even = l0 ^ l2 ^ l4 ^ l6 ^ l8 ^ l10;
always @ (l1 or l3 or l5 or l7 or l9 or l11)
odd = l1 ^ l3 ^ l5 ^ l7 ^ l9 ^ l11;
always @ (o0 or o1 or o2 or o3 or o4 or o5 or o6 or o7 or o8 or o9 or o10 or o11)
numerator = o0 ^ o1 ^ o2 ^ o3 ^ o4 ^ o5 ^ o6 ^ o7 ^ o8 ^ o9 ^ o10 ^ o11;
multiply m0 (tmp, numerator, D);
always @ (even or odd or tmp)
if (even == odd) error = tmp;
else error = 0;
always @ (a11) alpha = a11;
endmodule
// -------------------------------------------------------------------------
//Syndrome generator circuit in Reed-Solomon Decoder
//Copyright (C) Tue Apr 2 17:22:07 2002
//by Ming-Han Lei(hendrik@humanistic.org)
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// --------------------------------------------------------------------------
module rsdec_syn_m0 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[4];
y[1] = x[0];
y[2] = x[1] ^ x[4];
y[3] = x[2];
y[4] = x[3];
end
endmodule
module rsdec_syn_m1 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[3];
y[1] = x[4];
y[2] = x[0] ^ x[3];
y[3] = x[1] ^ x[4];
y[4] = x[2];
end
endmodule
module rsdec_syn_m2 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[2];
y[1] = x[3];
y[2] = x[2] ^ x[4];
y[3] = x[0] ^ x[3];
y[4] = x[1] ^ x[4];
end
endmodule
module rsdec_syn_m3 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[1] ^ x[4];
y[1] = x[2];
y[2] = x[1] ^ x[3] ^ x[4];
y[3] = x[2] ^ x[4];
y[4] = x[0] ^ x[3];
end
endmodule
module rsdec_syn_m4 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[3];
y[1] = x[1] ^ x[4];
y[2] = x[0] ^ x[2] ^ x[3];
y[3] = x[1] ^ x[3] ^ x[4];
y[4] = x[2] ^ x[4];
end
endmodule
module rsdec_syn_m5 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[2] ^ x[4];
y[1] = x[0] ^ x[3];
y[2] = x[1] ^ x[2];
y[3] = x[0] ^ x[2] ^ x[3];
y[4] = x[1] ^ x[3] ^ x[4];
end
endmodule
module rsdec_syn_m6 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[1] ^ x[3] ^ x[4];
y[1] = x[2] ^ x[4];
y[2] = x[0] ^ x[1] ^ x[4];
y[3] = x[1] ^ x[2];
y[4] = x[0] ^ x[2] ^ x[3];
end
endmodule
module rsdec_syn_m7 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[2] ^ x[3];
y[1] = x[1] ^ x[3] ^ x[4];
y[2] = x[0] ^ x[3] ^ x[4];
y[3] = x[0] ^ x[1] ^ x[4];
y[4] = x[1] ^ x[2];
end
endmodule
module rsdec_syn_m8 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[1] ^ x[2];
y[1] = x[0] ^ x[2] ^ x[3];
y[2] = x[2] ^ x[3] ^ x[4];
y[3] = x[0] ^ x[3] ^ x[4];
y[4] = x[0] ^ x[1] ^ x[4];
end
endmodule
module rsdec_syn_m9 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[1] ^ x[4];
y[1] = x[1] ^ x[2];
y[2] = x[1] ^ x[2] ^ x[3] ^ x[4];
y[3] = x[2] ^ x[3] ^ x[4];
y[4] = x[0] ^ x[3] ^ x[4];
end
endmodule
module rsdec_syn_m10 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[0] ^ x[3] ^ x[4];
y[1] = x[0] ^ x[1] ^ x[4];
y[2] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4];
y[3] = x[1] ^ x[2] ^ x[3] ^ x[4];
y[4] = x[2] ^ x[3] ^ x[4];
end
endmodule
module rsdec_syn_m11 (y, x);
input [4:0] x;
output [4:0] y;
reg [4:0] y;
always @ (x)
begin
y[0] = x[2] ^ x[3] ^ x[4];
y[1] = x[0] ^ x[3] ^ x[4];
y[2] = x[0] ^ x[1] ^ x[2] ^ x[3];
y[3] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4];
y[4] = x[1] ^ x[2] ^ x[3] ^ x[4];
end
endmodule
module rsdec_syn (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, u, enable, shift, init, clk, clrn);
input [4:0] u;
input clk, clrn, shift, init, enable;
output [4:0] y0;
output [4:0] y1;
output [4:0] y2;
output [4:0] y3;
output [4:0] y4;
output [4:0] y5;
output [4:0] y6;
output [4:0] y7;
output [4:0] y8;
output [4:0] y9;
output [4:0] y10;
output [4:0] y11;
reg [4:0] y0;
reg [4:0] y1;
reg [4:0] y2;
reg [4:0] y3;
reg [4:0] y4;
reg [4:0] y5;
reg [4:0] y6;
reg [4:0] y7;
reg [4:0] y8;
reg [4:0] y9;
reg [4:0] y10;
reg [4:0] y11;
wire [4:0] scale0;
wire [4:0] scale1;
wire [4:0] scale2;
wire [4:0] scale3;
wire [4:0] scale4;
wire [4:0] scale5;
wire [4:0] scale6;
wire [4:0] scale7;
wire [4:0] scale8;
wire [4:0] scale9;
wire [4:0] scale10;
wire [4:0] scale11;
rsdec_syn_m0 m0 (scale0, y0);
rsdec_syn_m1 m1 (scale1, y1);
rsdec_syn_m2 m2 (scale2, y2);
rsdec_syn_m3 m3 (scale3, y3);
rsdec_syn_m4 m4 (scale4, y4);
rsdec_syn_m5 m5 (scale5, y5);
rsdec_syn_m6 m6 (scale6, y6);
rsdec_syn_m7 m7 (scale7, y7);
rsdec_syn_m8 m8 (scale8, y8);
rsdec_syn_m9 m9 (scale9, y9);
rsdec_syn_m10 m10 (scale10, y10);
rsdec_syn_m11 m11 (scale11, y11);
always @ (posedge clk)// or negedge clrn)
begin
if (~clrn)
begin
y0 <= 0;
y1 <= 0;
y2 <= 0;
y3 <= 0;
y4 <= 0;
y5 <= 0;
y6 <= 0;
y7 <= 0;
y8 <= 0;
y9 <= 0;
y10 <= 0;
y11 <= 0;
end
else if (init)
begin
y0 <= u;
y1 <= u;
y2 <= u;
y3 <= u;
y4 <= u;
y5 <= u;
y6 <= u;
y7 <= u;
y8 <= u;
y9 <= u;
y10 <= u;
y11 <= u;
end
else if (enable)
begin
y0 <= scale0 ^ u;
y1 <= scale1 ^ u;
y2 <= scale2 ^ u;
y3 <= scale3 ^ u;
y4 <= scale4 ^ u;
y5 <= scale5 ^ u;
y6 <= scale6 ^ u;
y7 <= scale7 ^ u;
y8 <= scale8 ^ u;
y9 <= scale9 ^ u;
y10 <= scale10 ^ u;
y11 <= scale11 ^ u;
end
else if (shift)
begin
y0 <= y1;
y1 <= y2;
y2 <= y3;
y3 <= y4;
y4 <= y5;
y5 <= y6;
y6 <= y7;
y7 <= y8;
y8 <= y9;
y9 <= y10;
y10 <= y11;
y11 <= y0;
end
end
endmodule