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/] [KESBLOCK.V] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rud_dp
//*******************************************************************//
2
// This Key Equation Solver (KES) block implements reformulated      //
3
// inverse-free Berlekamp-Massey algorithm. The inverse-free         //
4
// Berlekamp-Massey is described by Irving S. Reed, M.T. Smith       //
5
// and T.K. Truong in their paper entitled "VLSI design of           //
6
// inverse-free Berlekamp-Massey (BM) algorithm" in Proc. IEEE,      //
7
// Sept 1991. With the algorithm, inverse/division operation is not  //
8
// needed. Hence, it simplifies the implementation of                //
9
// Berlekamp-Massey algorithm.                                       //
10
// Then, in the paper entitled "High speed architectures for         //
11
// Reed-Solomon Decoders" in IEEE Trans. VLSI Systems, October 2001, //
12
// Dilip P. Sarwate and Naresh R. Shanbhag proposed a reformulated   //
13
// version of the inverse-free algorithm. The reformulated algorithm //
14
// is aimed mainly to reduce critical path delay and also to         //
15
// simplify inverse-free algorithm implementation even more.         //
16
//*******************************************************************//
17
 
18
module KES_block(active_kes, clock1, clock2, reset, syndvalue0, syndvalue1,
19
                syndvalue2, syndvalue3, syndvalue4, syndvalue5, syndvalue6,
20
                syndvalue7, syndvalue8, syndvalue9, syndvalue10, syndvalue11,
21
                lambda0, lambda1, lambda2, lambda3, lambda4, lambda5,
22
                lambda6, homega0, homega1, homega2, homega3, homega4,
23
                homega5, lambda_degree, finish);
24
 
25
input active_kes, clock1, clock2, reset;
26
input [4:0] syndvalue0, syndvalue1, syndvalue2,
27
            syndvalue3, syndvalue4, syndvalue5, syndvalue6, syndvalue7,
28
            syndvalue8, syndvalue9, syndvalue10, syndvalue11;
29
output [4:0] lambda0, lambda1, lambda2, lambda3, lambda4, lambda5, lambda6;
30
output [4:0] homega0, homega1, homega2, homega3, homega4, homega5;
31
output [2:0] lambda_degree;
32
output finish;
33
 
34
wire load, hold, init, iter_control;
35
wire [4:0] delta0, delta1, delta2, delta3, delta4, delta5, delta6,
36
           delta7, delta8, delta9, delta10, delta11, delta12, delta13,
37
           delta14, delta15, delta16, delta17, delta18;
38
wire [4:0] gamma, delta;
39
wire koefcomp1, koefcomp2, koefcomp3, koefcomp4, koefcomp5, koefcomp6;
40
 
41
 
42
PE PE0(delta1, syndvalue0, gamma, delta, clock1, load, init,
43
       hold, iter_control, delta0);
44
PE PE1(delta2, syndvalue1, gamma, delta, clock1, load, init,
45
           hold, iter_control, delta1);
46
PE PE2(delta3, syndvalue2, gamma, delta, clock1, load, init,
47
       hold, iter_control, delta2);
48
PE PE3(delta4, syndvalue3, gamma, delta, clock1, load, init,
49
       hold, iter_control, delta3);
50
PE PE4(delta5, syndvalue4, gamma, delta, clock1, load, init,
51
       hold, iter_control, delta4);
52
PE PE5(delta6, syndvalue5, gamma, delta, clock1, load, init,
53
       hold, iter_control, delta5);
54
PE PE6(delta7, syndvalue6, gamma, delta, clock1, load, init,
55
       hold, iter_control, delta6);
56
PE PE7(delta8, syndvalue7, gamma, delta, clock1, load, init,
57
       hold, iter_control, delta7);
58
PE PE8(delta9, syndvalue8, gamma, delta, clock1, load, init,
59
       hold, iter_control, delta8);
60
PE PE9(delta10, syndvalue9, gamma, delta, clock1, load, init,
61
       hold, iter_control, delta9);
62
PE PE10(delta11, syndvalue10, gamma, delta, clock1, load, init,
63
       hold, iter_control, delta10);
64
PE PE11(delta12, syndvalue11, gamma, delta, clock1, load, init,
65
       hold, iter_control, delta11);
66
PE_12 PE12(delta13, gamma, delta, clock1, load, init,
67
           hold, iter_control, delta12);
68
PE_12 PE13(delta14, gamma, delta, clock1, load, init,
69
           hold, iter_control, delta13);
70
PE_12 PE14(delta15, gamma, delta, clock1, load, init,
71
           hold, iter_control, delta14);
72
PE_12 PE15(delta16, gamma, delta, clock1, load, init,
73
           hold, iter_control, delta15);
74
PE_12 PE16(delta17, gamma, delta, clock1, load, init,
75
           hold, iter_control, delta16);
76
PE_12 PE17(delta18, gamma, delta, clock1, load, init,
77
           hold, iter_control, delta17);
78
PE_18 PE18(delta, clock1, load, init, hold, iter_control,
79
           delta18);
80
control mcontrol(delta0, gamma, active_kes, reset, delta, iter_control,
81
                  finish, load, init, hold, clock1, clock2);
82
 
83
assign homega0 = delta0;
84
assign homega1 = delta1;
85
assign homega2 = delta2;
86
assign homega3 = delta3;
87
assign homega4 = delta4;
88
assign homega5 = delta5;
89
 
90
assign lambda0 = delta6;
91
assign lambda1 = delta7;
92
assign lambda2 = delta8;
93
assign lambda3 = delta9;
94
assign lambda4 = delta10;
95
assign lambda5 = delta11;
96
assign lambda6 = delta12;
97
 
98
// this statements below counts degree of error location polynomial
99
// (lambda)
100
assign koefcomp1 = (lambda1[0]|lambda1[1])|(lambda1[2]|lambda1[3])|
101
                    lambda1[4];
102
assign koefcomp2 = (lambda2[0]|lambda2[1])|(lambda2[2]|lambda2[3])|
103
                    lambda2[4];
104
assign koefcomp3 = (lambda3[0]|lambda3[1])|(lambda3[2]|lambda3[3])|
105
                    lambda3[4];
106
assign koefcomp4 = (lambda4[0]|lambda4[1])|(lambda4[2]|lambda4[3])|
107
                    lambda4[4];
108
assign koefcomp5 = (lambda5[0]|lambda5[1])|(lambda5[2]|lambda5[3])|
109
                    lambda5[4];
110
assign koefcomp6 =  (lambda6[0]|lambda6[1])|(lambda6[2]|lambda6[3])|
111
                    lambda6[4];
112
priority_encoder pencoder(koefcomp1,koefcomp2,koefcomp3,koefcomp4,
113
                          koefcomp5,koefcomp6, lambda_degree);
114
 
115
endmodule
116
 
117
 
118
 
119
//************************************************************//
120
module control(delta0_in, gamma, active_kes, reset, delta0_out,
121
               iter_control, finish, load, init, hold,
122
               clock1, clock2);
123
 
124
input [4:0] delta0_in;
125
input clock1, clock2, active_kes, reset;
126
output [4:0] delta0_out, gamma;
127
output iter_control, finish, load, hold, init;
128
 
129
reg [3:0] cntr;
130
reg load, hold, init, finish;
131
wire [4:0] kr, inv_kr, outadder;
132
wire [4:0] outmux1, outmux2;
133
wire zerodetect, negdetect;
134
 
135
wire [4:0] incr;
136
wire carrybit;
137
 
138
parameter [2:0] st0=0, st1=1, st2=2, st3=3, st4=4, st5=5;
139
reg [2:0] state, nxt_state;
140
 
141
// Counter //
142
always@(posedge clock1)
143
begin
144
    if(load)
145
       cntr <= cntr + 1;
146
    else
147
       cntr <= 4'b0;
148
end
149
 
150
//******//
151
// FSM  //
152
//******//
153
always@(active_kes or cntr or state)
154
begin
155
    case(state)
156
        st0 : begin
157
               if(active_kes)
158
                  nxt_state = st1;
159
               else
160
                  nxt_state = st0;
161
              end
162
        st1 : nxt_state = st2;
163
        st2 : begin
164
               if(cntr == 12)
165
                  nxt_state = st3;
166
               else
167
                  nxt_state = st2;
168
              end
169
        st3 : nxt_state = st4;
170
        st4 : begin
171
              if(active_kes)
172
                 nxt_state = st4;
173
              else
174
                 nxt_state = st0;
175
              end
176
        default: nxt_state = st0;
177
    endcase
178
end
179
 
180
always@(posedge clock2 or negedge reset)
181
begin
182
   if(~reset)
183
      state = st0;
184
   else
185
      state = nxt_state;
186
end
187
 
188
always@(state)
189
begin
190
    case(state)
191
        st0 :  begin     //start state
192
               init = 0;
193
               finish = 0;
194
               load = 0;
195
               hold = 0;
196
               end
197
        st1 :  begin      //initialization state
198
               init = 1;
199
               finish = 0;
200
               load = 0;
201
               hold = 0;
202
               end
203
        st2 :  begin      //computation state
204
               finish = 0;
205
               load = 1;
206
               hold = 0;
207
               init = 0;
208
               end
209
        st3 :  begin      //finish state
210
               finish = 1;
211
               load = 0;
212
               hold = 1;
213
               init = 0;
214
               end
215
        st4 :  begin      //hold output data
216
               finish = 0;
217
               load = 0;
218
               hold = 1;
219
               init = 0;
220
               end
221
        default:  begin
222
                  finish = 0;
223
                  load = 0;
224
                  hold = 0;
225
                  init = 0;
226
                  end
227
    endcase
228
end
229
 
230
assign incr = 1;
231
assign carrybit = 0;
232
 
233
assign zerodetect = (delta0_in[0]|delta0_in[1])|(delta0_in[2]|delta0_in[3])|delta0_in[4];
234
assign negdetect = ~kr[4];
235
assign iter_control = zerodetect & negdetect;
236
assign inv_kr = ~kr;
237
assign delta0_out = delta0_in;
238
 
239
mux2_to_1 multiplexer1(gamma, delta0_in, outmux1, iter_control);
240
mux2_to_1 multiplexer2(outadder, inv_kr, outmux2, iter_control);
241
fulladder adder(kr, incr, carrybit, outadder);
242
regamma reggamma(outmux1, gamma, load, init, clock1);
243
regkr regkr(outmux2, kr, load, init, clock1);
244
 
245
endmodule
246
 
247
 
248
//****************************************//
249
// Full Adder 5 bit                       //
250
// carry bit for MSB cell is discarded    //
251
//****************************************//
252
module fulladder(in1, in2, carryin, out);
253
input [4:0] in1, in2;
254
input carryin;
255
output [4:0] out;
256
 
257
wire carry0, carry1, carry2, carry3;
258
 
259
assign carry0 = ((in1[0] ^ in2[0])&carryin) | (in1[0]&in2[0]);
260
assign carry1 = ((in1[1] ^ in2[1])&carry0) | (in1[1]&in2[1]);
261
assign carry2 = ((in1[2] ^ in2[2])&carry1) | (in1[2]&in2[2]);
262
assign carry3 = ((in1[3] ^ in2[3])&carry2) | (in1[3]&in2[3]);
263
 
264
assign out[0] = in1[0] ^ in2[0] ^ carryin;
265
assign out[1] = in1[1] ^ in2[1] ^ carry0;
266
assign out[2] = in1[2] ^ in2[2] ^ carry1;
267
assign out[3] = in1[3] ^ in2[3] ^ carry2;
268
assign out[4] = in1[4] ^ in2[4] ^ carry3;
269
 
270
endmodule
271
 
272
 
273
//*********************************************//
274
// register for storing gamma with synchronous //
275
// load and initialize                         //
276
//*********************************************//
277
module regamma(datain, dataout, load, initialize, clock);
278
 
279
input [4:0] datain;
280
input load, initialize;
281
input clock;
282
output [4:0] dataout;
283
reg [4:0] out;
284
 
285
always @(posedge clock)
286
begin
287
    if(initialize)
288
       out <= 5'b10000;
289
    else if(load)
290
       out <= datain;
291
    else
292
       out <= 5'b0;
293
end
294
 
295
assign dataout = out;
296
 
297
endmodule
298
 
299
//********************************************//
300
// register for storing k(r) with synchronous //
301
// load and initialize                        //
302
//********************************************//
303
module regkr(datain, dataout, load, initialize, clock);
304
 
305
input [4:0] datain;
306
input load, initialize;
307
input clock;
308
output [4:0] dataout;
309
reg [4:0] out;
310
 
311
always @(posedge clock)
312
begin
313
    if(initialize)
314
       out <= 5'b0;
315
    else if(load)
316
       out <= datain;
317
    else
318
       out <= 5'b0;
319
end
320
 
321
assign dataout = out;
322
 
323
endmodule
324
 
325
 
326
//******************//
327
// Priority Encoder //
328
//******************//
329
module priority_encoder(in1,in2,in3,in4,in5,in6,out);
330
 
331
input in1, in2, in3, in4, in5, in6;
332
output [2:0] out;
333
reg [2:0] out;
334
 
335
always@({in6,in5,in4,in3,in2,in1})
336
begin
337
        if(in6==1)                                        out = 6;
338
        else if(in5==1)  out = 5;
339
        else if(in4==1)  out = 4;
340
        else if(in3==1)  out = 3;
341
        else if(in2==1)  out = 2;
342
        else if(in1==1)  out = 1;
343
        else out = 3'b0;
344
end
345
endmodule
346
 
347
 
348
//****************************************************************//
349
module PE(delta_cflex_in, syndval, gamma, delta, clock, load, init,
350
           hold, iter_control, delta_cflex_out);
351
 
352
input [4:0] delta_cflex_in, syndval;
353
input [4:0] gamma;
354
input [4:0] delta;
355
input clock, load, hold, iter_control, init;
356
output [4:0] delta_cflex_out;
357
 
358
wire [4:0] outmult1, outmult2, outreg1, outreg2, outmux, outadder;
359
 
360
lcpmult multiplier1(delta_cflex_in, gamma, outmult1);
361
lcpmult multiplier2(delta, outreg1, outmult2);
362
register_pe reg1(outadder, syndval, outreg2 , load, init, hold, clock);
363
register_pe reg2(outmux, syndval, outreg1 , load, init, hold, clock);
364
mux2_to_1 multiplexer(outreg1, delta_cflex_in, outmux, iter_control);
365
 
366
assign outadder[4] = outmult2[4] ^ outmult1[4];
367
assign outadder[3] = outmult2[3] ^ outmult1[3];
368
assign outadder[2] = outmult2[2] ^ outmult1[2];
369
assign outadder[1] = outmult2[1] ^ outmult1[1];
370
assign outadder[0] = outmult2[0] ^ outmult1[0];
371
 
372
assign delta_cflex_out = outreg2;
373
 
374
endmodule
375
 
376
//***********************************************************//
377
module PE_12(delta_cflex_in, gamma, delta, clock, load, init,
378
           hold, iter_control, delta_cflex_out);
379
 
380
input [4:0] delta_cflex_in;
381
input [4:0] gamma;
382
input [4:0] delta;
383
input clock, load, hold, iter_control, init;
384
output [4:0] delta_cflex_out;
385
 
386
wire [4:0] outmult1, outmult2, outreg1, outreg2, outmux, outadder;
387
wire [4:0] initdata;
388
 
389
assign initdata = 5'b0;
390
 
391
lcpmult multiplier1(delta_cflex_in, gamma, outmult1);
392
lcpmult multiplier2(delta, outreg1, outmult2);
393
register_pe reg1(outadder, initdata, outreg2 , load, init, hold, clock);
394
register_pe reg2(outmux, initdata, outreg1 , load, init, hold, clock);
395
mux2_to_1 multiplexer(outreg1, delta_cflex_in, outmux, iter_control);
396
 
397
assign outadder[4] = outmult2[4] ^ outmult1[4];
398
assign outadder[3] = outmult2[3] ^ outmult1[3];
399
assign outadder[2] = outmult2[2] ^ outmult1[2];
400
assign outadder[1] = outmult2[1] ^ outmult1[1];
401
assign outadder[0] = outmult2[0] ^ outmult1[0];
402
 
403
assign delta_cflex_out = outreg2;
404
 
405
endmodule
406
 
407
 
408
//******************************************************//
409
module PE_18(delta, clock, load, init, hold, iter_control,
410
             delta_cflex_out);
411
 
412
input [4:0] delta;
413
input clock, load, init, hold, iter_control;
414
output [4:0] delta_cflex_out;
415
 
416
wire [4:0] outmult, outreg1, outreg2, outmux;
417
wire [4:0] initdata;
418
wire [4:0] delta_cflex_19;
419
 
420
assign initdata = 5'b10000;
421
assign delta_cflex_19 = 5'b0;
422
 
423
lcpmult multiplier(delta, outreg1, outmult);
424
register_pe reg1(outmult, initdata, outreg2 , load, init, hold, clock);
425
register_pe reg2(outmux, initdata, outreg1 , load, init, hold, clock);
426
mux2_to_1 multiplexer(outreg1, delta_cflex_19, outmux, iter_control);
427
 
428
assign delta_cflex_out = outreg2;
429
 
430
endmodule
431
 
432
 
433
//*****************************************************//
434
//PE Register with synchronous load, intialize, hold //
435
module register_pe(datain, initdata, dataout, load, initialize, hold, clock);
436
 
437
input [4:0] datain, initdata;
438
input load, hold, initialize;
439
input clock;
440
output [4:0] dataout;
441
reg [4:0] out;
442
 
443
always @(posedge clock)
444
begin
445
    if(initialize)
446
       out <= initdata;
447
    else if(load)
448
       out <= datain;
449
    else if(hold)
450
       out <= out;
451
    else
452
       out <= 5'b0;
453
end
454
 
455
assign dataout = out;
456
 
457
endmodule

powered by: WebSVN 2.1.0

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