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

Subversion Repositories reed_solomon_coder

[/] [reed_solomon_coder/] [trunk/] [RS_encoder.v] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 cau_sse
`timescale 1 ns / 1 ps
2
///////////////////////////////////////////////////////////////////////////////////
3
// Company: University of Hamburg, University of Kiel, Germany
4
// Engineer: Bibin John, Cagil Gümüs, Andreas Bahr
5
// 
6
// Create Date:    14:29:45 12/11/2015 
7
// Design Name: 
8
// Module Name:    RS_encoder 
9
// Project Name: 
10
// Target Devices: 
11
// Tool versions: 
12
// Description: Reed Solomon encoder for 4 bit data
13
// n=9, k=5, 2t=4, 4bits/symbol
14
// primitive polynomial p(x)=x^4+x+1
15
// generator polynomial g(x)=x^4+13x^3+12x^2+8x+7
16
// Dependencies:
17
//
18
// Revision: 
19
// Revision 0.01 - File Created
20
// Additional Comments: 
21
//
22
//////////////////////////////////////////////////////////////////////////////////
23
 
24
module reedSolomon(din, clkinp, reset, enable, valid, dout);
25
 
26
input clkinp, reset, enable;
27
input [19:0] din;
28
output valid;
29
output [15:0] dout;
30
 
31
//output [3:0] z0, z1, z2, z3;
32
 
33
reg [15:0] dout;
34
reg valid;
35
reg[3:0] counter;
36
 
37
//reg [3:0]datainp; //data input to RS encoder
38
 
39
wire [3:0] m0, m1, m2, m3;
40
//wire [3:0] z0, z1, z2, z3;
41
reg [3:0] q0, q1, q2, q3;
42
reg [3:0] fback;
43
 
44
always @(posedge clkinp or negedge reset)
45
begin
46
        if(~reset)
47
        begin
48
                dout <= 0;
49
                valid <=0;
50
                counter<=0;
51
                q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
52
                fback <= 0;
53
        end
54
        else
55
        begin
56
                if(enable==0)
57
                begin
58
                        valid <=0;
59
                        counter<=0;
60
                        q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
61
                        fback <= 0;
62
                end
63
                else
64
                begin if (~valid)
65
                   begin
66
                        counter<=counter+1;
67
                        case(counter)
68
                                4'b0001 :
69
                                        begin
70
                                                fback <= q3 ^ din[19:16];
71
                                        end
72
                                4'b0010 :
73
                                        begin
74
                                                q0 <= m0;
75
                                                q1 <= m1 ^ q0;
76
                                                q2 <= m2 ^ q1;
77
                                                q3 <= m3 ^ q2;
78
                                        end
79
                                4'b0011 :
80
                                        begin
81
                                                fback <= q3 ^ din[15:12];
82
                                        end
83
                                4'b0100 :
84
                                        begin
85
                                                q0 <= m0;
86
                                                q1 <= m1 ^ q0;
87
                                                q2 <= m2 ^ q1;
88
                                                q3 <= m3 ^ q2;
89
                                        end
90
                                4'b0101 :
91
                                        begin
92
                                                fback <= q3 ^ din[11:8];
93
                                        end
94
                                4'b0110 :
95
                                        begin
96
                                                q0 <= m0;
97
                                                q1 <= m1 ^ q0;
98
                                                q2 <= m2 ^ q1;
99
                                                q3 <= m3 ^ q2;
100
                                        end
101
                                4'b0111 :
102
                                        begin
103
                                                fback <= q3 ^ din[7:4];
104
                                        end
105
                                4'b1000 :
106
                                        begin
107
                                                q0 <= m0;
108
                                                q1 <= m1 ^ q0;
109
                                                q2 <= m2 ^ q1;
110
                                                q3 <= m3 ^ q2;
111
                                        end
112
                                4'b1001 :
113
                                        begin
114
                                                fback <= q3 ^ din[3:0];
115
                                        end
116
                                4'b1010 :
117
                                        begin
118
                                                q0 <= m0;
119
                                                q1 <= m1 ^ q0;
120
                                                q2 <= m2 ^ q1;
121
                                                q3 <= m3 ^ q2;
122
                                        end
123
                                4'b1011 :
124
                                        begin
125
                                                dout<={q3,q2,q1,q0};
126
                                                valid <= 1;
127
                                        end
128
                                default :
129
                                        begin
130
                                                q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
131
                                                fback <= 0;
132
                                        end
133
                        endcase
134
                   end
135
                   else
136
                        begin
137
                                q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
138
                                fback <= 0;
139
                        end
140
                end
141
        end
142
end
143
 
144
//coefficients for the generator polynomial
145
//x^4+13x^3+12x^2+8x+7
146
parameter [3:0] gin0=4'd7, gin1=4'd8, gin2=4'd12, gin3=4'd13;
147
 
148
GFMULT u0(clkinp, reset, enable, fback, gin0, m0);
149
GFMULT u1(clkinp, reset, enable, fback, gin1, m1);
150
GFMULT u2(clkinp, reset, enable, fback, gin2, m2);
151
GFMULT u3(clkinp, reset, enable, fback, gin3, m3);
152
endmodule
153
 
154
module GFMULT(clk, reset, enable, a, gin, z);
155
//lookup tables for  multiplication
156
 
157
//4'd7=alpha^10(x^2+x+1)
158
parameter [63:0] mult_gin0 ={4'd0,4'd7,4'd14,4'd9,4'd15,4'd8,4'd1,4'd6,4'd13,4'd10,4'd3,4'd4,4'd2,4'd5,4'd12,4'd11};
159
 //parameter [63:0] mult_gin0 ={0,7,14,9,15,8,1,6,13,10,3,4,2,5,12,11};
160
 
161
//mult_gin0[0]=4'b1111;
162
//4'd8=alpha^3(x^3)
163
parameter [63:0] mult_gin1={4'd0,4'd8,4'd3,4'd11,4'd6,4'd14,4'd5,4'd13,4'd12,4'd4,4'd15,4'd7,4'd10,4'd2,4'd9,4'd1};
164
 // parameter [63:0] mult_gin1={0,8,3,11,6,14,5,13,12,4,15,7,10,2,9,1};
165
 
166
//4'd12=alpha^6(x^3+x^2)
167
parameter [63:0] mult_gin2={4'd0,4'd12,4'd11,4'd7,4'd5,4'd9,4'd14,4'd2,4'd10,4'd6,4'd1,4'd13,4'd15,4'd3,4'd4,4'd8};
168
 // parameter [63:0] mult_gin2={0,12,11,7,5,9,14,2,10,6,1,13,15,3,4,8};
169
 
170
//4'd13=alpha^13(x^3+x^2+1)
171
parameter [63:0] mult_gin3= {4'd0,4'd13,4'd9,4'd4,4'd1,4'd12,4'd8,4'd5,4'd2,4'd15,4'd11,4'd6,4'd3,4'd14,4'd10,4'd7};
172
// parameter [63:0] mult_gin3= {0,13,9,4,1,12,8,5,2,15,11,6,3,14,10,7};
173
input clk, reset, enable;
174
input [3:0] a;
175
input [3:0] gin;
176
reg [5:0] ginp;
177
output [3:0] z;
178
reg [3:0] z;
179
always @(negedge clk or negedge reset)
180
begin
181
        if(~reset)
182
        begin
183
                z <= 4'b0000;
184
        end
185
        else
186
        begin
187
                if(enable==0)
188
                begin
189
                        z <= 4'b0000;
190
                end
191
                else
192
                begin
193
                        if (gin==4'd7)
194
                        begin
195
                        case(a)
196
                        1:begin z<=mult_gin0[59:56]; end
197
                        2:begin z<=mult_gin0[55:52]; end
198
                        3:begin z<=mult_gin0[51:48]; end
199
                        4:begin z<=mult_gin0[47:44];end
200
                        5:begin z<=mult_gin0[43:40];end
201
                        6:begin z<=mult_gin0[39:36];end
202
                        7:begin z<=mult_gin0[35:32];end
203
                        8:begin z<=mult_gin0[31:28];end
204
                        9:begin z<=mult_gin0[27:24];end
205
                        10:begin z<=mult_gin0[23:20];end
206
                        11:begin z<=mult_gin0[19:16];end
207
                        12:begin z<=mult_gin0[15:12];end
208
                        13:begin z<=mult_gin0[11:8];end
209
                        14:begin z<=mult_gin0[7:4];end
210
                        15:begin z<=mult_gin0[3:0];end
211
                        default: begin z<=mult_gin0[63:60];end
212
                        endcase
213
                        end
214
 
215
                        else if(gin==4'd8)
216
                        begin
217
                        case(a)
218
                                1:begin z<=mult_gin1[59:56]; end
219
                                2:begin z<=mult_gin1[55:52]; end
220
                                3:begin z<=mult_gin1[51:48]; end
221
                                4:begin z<=mult_gin1[47:44];end
222
                                5:begin z<=mult_gin1[43:40];end
223
                                6:begin z<=mult_gin1[39:36];end
224
                                7:begin z<=mult_gin1[35:32];end
225
                                8:begin z<=mult_gin1[31:28];end
226
                                9:begin z<=mult_gin1[27:24];end
227
                                10:begin z<=mult_gin1[23:20];end
228
                                11:begin z<=mult_gin1[19:16];end
229
                                12:begin z<=mult_gin1[15:12];end
230
                                13:begin z<=mult_gin1[11:8];end
231
                                14:begin z<=mult_gin1[7:4];end
232
                                15:begin z<=mult_gin1[3:0];end
233
                                default: begin z<=mult_gin1[63:60];end
234
                        endcase
235
                        end
236
 
237
                        else if(gin==4'd12)
238
                        begin
239
                        case(a)
240
                                1:begin z<=mult_gin2[59:56]; end
241
                                2:begin z<=mult_gin2[55:52]; end
242
                                3:begin z<=mult_gin2[51:48]; end
243
                                4:begin z<=mult_gin2[47:44];end
244
                                5:begin z<=mult_gin2[43:40];end
245
                                6:begin z<=mult_gin2[39:36];end
246
                                7:begin z<=mult_gin2[35:32];end
247
                                8:begin z<=mult_gin2[31:28];end
248
                                9:begin z<=mult_gin2[27:24];end
249
                                10:begin z<=mult_gin2[23:20];end
250
                                11:begin z<=mult_gin2[19:16];end
251
                                12:begin z<=mult_gin2[15:12];end
252
                                13:begin z<=mult_gin2[11:8];end
253
                                14:begin z<=mult_gin2[7:4];end
254
                                15:begin z<=mult_gin2[3:0];end
255
                                default: begin z<=mult_gin2[63:60];end
256
                                endcase
257
                        end
258
 
259
                        else if(gin==4'd13)
260
                        begin
261
                        case(a)
262
                                1:begin z<=mult_gin3[59:56]; end
263
                                2:begin z<=mult_gin3[55:52]; end
264
                                3:begin z<=mult_gin3[51:48]; end
265
                                4:begin z<=mult_gin3[47:44];end
266
                                5:begin z<=mult_gin3[43:40];end
267
                                6:begin z<=mult_gin3[39:36];end
268
                                7:begin z<=mult_gin3[35:32];end
269
                                8:begin z<=mult_gin3[31:28];end
270
                                9:begin z<=mult_gin3[27:24];end
271
                                10:begin z<=mult_gin3[23:20];end
272
                                11:begin z<=mult_gin3[19:16];end
273
                                12:begin z<=mult_gin3[15:12];end
274
                                13:begin z<=mult_gin3[11:8];end
275
                                14:begin z<=mult_gin3[7:4];end
276
                                15:begin z<=mult_gin3[3:0];end
277
                                default: begin z<=mult_gin3[63:60];end
278
                                endcase
279
                        end
280
                        else
281
                                begin
282
                                        z<=0;
283
                                end
284
                end
285
 
286
        end
287
end
288
 
289
endmodule

powered by: WebSVN 2.1.0

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