mirror of https://github.com/lnis-uofu/SOFA.git
1413 lines
30 KiB
Verilog
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
|
|
|