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

Subversion Repositories dvb_s2_ldpc_decoder

[/] [dvb_s2_ldpc_decoder/] [trunk/] [rtl/] [ldpc_iocontrol.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jcorley
//-------------------------------------------------------------------------
2
//
3
// File name    :  ldpc_iocontrol.v
4
// Title        :
5
//              :
6
// Purpose      : Variable node holder/message calculator.  Loads llr
7
//              : data serially
8
//
9
// ----------------------------------------------------------------------
10
// Revision History :
11
// ----------------------------------------------------------------------
12
//   Ver  :| Author   :| Mod. Date   :| Changes Made:
13
//   v1.0  | JTC      :| 2008/07/02  :|
14
// ----------------------------------------------------------------------
15
`timescale 1ns/10ps
16
 
17
module ldpc_iocontrol #(
18
  parameter FOLDFACTOR     = 4,
19
  parameter LOG2FOLDFACTOR = 2,
20
  parameter LASTSHIFTWIDTH = 3,
21
  parameter NUMINSTANCES   = 180
22
)(
23
  input clk,
24
  input rst,
25
 
26
  // start command, completion indicator
27
  input      start,
28
  input[4:0] mode,
29
  input[5:0] iter_limit,
30
  output     done,
31
 
32
  // common control outputs
33
  output iteration,
34
  output first_iteration,
35
  output disable_vn,
36
  output disable_cn,
37
 
38
  // control VN's
39
  output                     we_vnmsg,
40
  output[7:0]                addr_vn,
41
  output[LOG2FOLDFACTOR-1:0] addr_vn_lo,
42
 
43
  // control shuffler
44
  output                     first_half,
45
  output[1:0]                shift0,
46
  output[2:0]                shift1,
47
  output[LASTSHIFTWIDTH-1:0] shift2,
48
 
49
  // control CN's
50
  output                     cn_we,
51
  output                     cn_rd,
52
  output[7:0]                addr_cn,
53
  output[LOG2FOLDFACTOR-1:0] addr_cn_lo,
54
 
55
  // ROM
56
  output[12:0]                  romaddr,
57
  input[8+5+LASTSHIFTWIDTH-1:0] romdata
58
);
59
 
60
localparam DONT_SHIFT = 0; // useful for debugging
61
 
62
/*********************************
63
 * State Machine 1               *
64
 * Controls the decoding process *
65
 *********************************/
66
localparam S_IDLE            = 0;
67
localparam S_PREPDECODE0     = 1;
68
localparam S_PREPDECODE1     = 2;
69
localparam S_FETCHCMD0       = 3;
70
localparam S_FETCHCMD1       = 4;
71
localparam S_STOREMSG        = 5;
72
localparam S_STOREPARITYMSG  = 6;
73
localparam S_STORESHIFTEDPARITY = 7;
74
localparam S_FINISHPIPE0     = 8;
75
localparam S_FINISHPIPE1     = 9;
76
localparam S_FINISHPIPE2     = 10;
77
localparam S_FINISHPIPE3     = 11;
78
localparam S_FINISHPIPE4     = 12;
79
localparam S_FINISHPIPE5     = 13;
80
localparam S_FINISHPIPE6     = 14;
81
localparam S_RESTART         = 15;
82
 
83
localparam TURNAROUND_WAITSTATES = 11;
84
 
85
reg[3:0] state;
86
 
87
reg[7:0] cn_count;
88
reg[7:0] vn_count;
89
reg[7:0] ta_count;
90
 
91
reg[12:0] romaddr_int;
92
reg[12:0] start_addr;
93
reg[12:0] turnaround_addr;
94
reg[4:0]  group_depth;
95
reg       turnaround;
96
reg       turnaround_next;
97
reg       last_group;
98
reg       first_group;
99
reg       last_group_next;
100
reg       n64k;
101
reg[7:0]  q;
102
reg[4:0]  count;
103
reg[5:0]  iter_count;
104
reg       done_int;
105
reg       first_iteration_int;
106
reg       iteration_int;
107
 
108
reg first_half_int;
109
 
110
reg[3:0] wait_count;
111
 
112
assign romaddr           = romaddr_int;
113
assign first_iteration   = first_iteration_int;
114
assign done              = done_int;
115
assign first_half        = first_half_int;
116
assign iteration         = iteration_int;
117
 
118
// synchronous state machine
119
always @( posedge rst, posedge clk )
120
  if( rst )
121
  begin
122
    state               <= S_IDLE;
123
    done_int            <= 0;
124
    iter_count          <= 0;
125
    romaddr_int         <= 0;
126
    first_iteration_int <= 0;
127
    iteration_int       <= 0;
128
    count               <= 0;
129
    cn_count            <= 0;
130
    vn_count            <= 0;
131
    first_half_int      <= 0;
132
    romaddr_int         <= 0;
133
    start_addr          <= 0;
134
    turnaround_addr     <= 0;
135
    q                   <= 0;
136
    turnaround          <= 0;
137
    turnaround_next     <= 0;
138
    last_group          <= 0;
139
    first_group         <= 0;
140
    n64k                <= 0;
141
    last_group_next     <= 0;
142
    group_depth         <= 0;
143
    wait_count          <= 0;
144
  end
145
  else
146
  begin
147
    // defaults
148
    done_int <= 0;
149
 
150
    case( state )
151
    // wait for start to prepare jump to offset, "mode"
152
    S_IDLE:
153
    begin
154
      if( start )
155
        state <= S_PREPDECODE0;
156
 
157
      romaddr_int      <= 0;
158
      romaddr_int[4:0] <= mode;
159
 
160
      iter_count    <= iter_limit;
161
      iteration_int <= 0;
162
 
163
      first_iteration_int <= 1;
164
      first_half_int      <= 1;
165
      cn_count            <= 0;
166
      vn_count            <= 0;
167
      ta_count            <= 0;
168
 
169
      first_group <= 1;
170
 
171
      done_int <= 1;
172
    end
173
 
174
    // "mode" is a pointer to a pointer - jump to mode**
175
    S_PREPDECODE0:
176
      state <= S_PREPDECODE1;
177
 
178
    S_PREPDECODE1:
179
    begin
180
      state <= S_FETCHCMD0;
181
 
182
      n64k <= romdata[16];
183
 
184
      romaddr_int     <= romdata[12:0];
185
      start_addr      <= romdata[12:0];
186
      turnaround_addr <= romdata[12:0];
187
    end
188
 
189
    // interpret code from ROM
190
    S_FETCHCMD0:
191
    begin
192
      state <= S_FETCHCMD1;
193
 
194
      if( n64k )
195
        vn_count <= 179;
196
      else
197
        vn_count <= 44;
198
    end
199
 
200
    S_FETCHCMD1:
201
    begin
202
      state <= S_STORESHIFTEDPARITY;
203
 
204
      romaddr_int <= romaddr_int + 1;
205
 
206
      turnaround  <= romdata[14];
207
      last_group  <= romdata[13];
208
      group_depth <= romdata[12:8];
209
      q           <= romdata[7:0];
210
      count       <= 0;
211
    end
212
 
213
    // write shifted set of parity bits
214
    S_STORESHIFTEDPARITY:
215
    begin
216
      state <= S_STOREMSG;
217
 
218
      romaddr_int <= romaddr_int + 1;
219
      wait_count  <= TURNAROUND_WAITSTATES;
220
      first_group <= 0;
221
    end
222
 
223
    // Write messages
224
    S_STOREMSG:
225
    begin
226
      if( count==group_depth )
227
        state <= S_STOREPARITYMSG;
228
 
229
      romaddr_int <= romaddr_int + (count!=group_depth);
230
 
231
      count    <= count + 1;
232
      vn_count <= q + cn_count;
233
    end
234
 
235
    // write parity bits to CN
236
    S_STOREPARITYMSG:
237
    begin
238
      if( last_group || turnaround )
239
        state <= S_FINISHPIPE0;
240
      else
241
        state <= S_STORESHIFTEDPARITY;
242
 
243
      if( !last_group && !turnaround )
244
      begin
245
        cn_count    <= cn_count + 1;
246
        romaddr_int <= romaddr_int + 1;
247
 
248
        turnaround  <= romdata[14];
249
        last_group  <= romdata[13];
250
        group_depth <= romdata[12:8];
251
        q           <= romdata[7:0];
252
        count       <= 0;
253
      end
254
    end
255
 
256
    // need waitstates between phases to let the pipeline clear out
257
    S_FINISHPIPE0:
258
    begin
259
      if( wait_count==0 )
260
      begin
261
        if( last_group && (iter_count==0) && !first_half_int )
262
        begin
263
          state    <= S_IDLE;
264
          done_int <= 1;
265
        end
266
        else
267
          state <= S_RESTART;
268
      end
269
 
270
      wait_count  <= wait_count - 1;
271
 
272
      if( wait_count==0 )
273
      begin
274
        turnaround  <= romdata[14];
275
        last_group  <= romdata[13];
276
        group_depth <= romdata[12:8];
277
        q           <= romdata[7:0];
278
        count       <= 0;
279
 
280
        cn_count    <= ta_count;
281
        romaddr_int <= turnaround_addr;
282
 
283
        ta_count        <= cn_count    + 1;
284
        turnaround_addr <= romaddr_int;
285
 
286
        if( last_group && !first_half_int )
287
        begin
288
          cn_count            <= 0;
289
          iteration_int       <= iteration_int ^ ~first_half_int;
290
          first_iteration_int <= 0;
291
          romaddr_int         <= start_addr;
292
          iter_count          <= iter_count - 1;
293
 
294
          ta_count        <= 0;
295
          turnaround_addr <= start_addr;
296
        end
297
      end
298
    end
299
 
300
    S_RESTART:
301
    begin
302
      state <= S_FETCHCMD1;
303
 
304
      if( cn_count==0 )
305
      begin
306
        first_group <= 1;
307
        if( n64k )
308
          vn_count <= 179;
309
        else
310
          vn_count <= 44;
311
      end
312
 
313
      first_half_int <= ~first_half_int;
314
    end
315
 
316
    default: ;
317
    endcase
318
  end
319
 
320
  // asynchronous portion of state machine
321
  reg we;
322
  reg matchpar;
323
  reg last_step;
324
 
325
  always @( * )
326
  begin
327
    // defaults
328
    we        <= 0;
329
    matchpar  <= 0;
330
    last_step <= 0;
331
 
332
    case( state )
333
      // Write messages
334
      S_STOREMSG:
335
        we <= 1;
336
 
337
      // write parity bits to CN's
338
      S_STOREPARITYMSG:
339
      begin
340
        we       <= 1;
341
        matchpar <= 1;
342
      end
343
 
344
      // write parity bits to next CN location
345
      S_STORESHIFTEDPARITY:
346
      begin
347
        we <= 1;
348
 
349
        if( first_group )
350
          last_step <= 1;
351
        else
352
          matchpar  <= 1;
353
      end
354
 
355
      default: ;
356
    endcase
357
  end
358
 
359
/********************************
360
 * State Machine Helper         *
361
 * Adds delays to we and to the *
362
 * addresses for vn and cn      *
363
 ********************************/
364
// determine undelayed controls
365
wire[7:0]                  orig_cn_addr;
366
wire[7:0]                  orig_vn_addr;
367
wire[5+LASTSHIFTWIDTH-1:0] orig_shiftval;
368
wire                       orig_we_vnmsg;
369
wire                       orig_cn_we;
370
wire                       orig_cn_rd;
371
wire                       orig_disable;
372
 
373
assign orig_vn_addr  = ( matchpar || last_step ) ? vn_count
374
                       : romdata[8+5+LASTSHIFTWIDTH-1:5+LASTSHIFTWIDTH];
375
assign orig_cn_addr  = cn_count;
376
assign orig_shiftval = DONT_SHIFT                     ? 0 :
377
                       matchpar                       ? 0 :
378
                       (first_half_int && last_step)  ? 1 :
379
                       (~first_half_int && last_step) ? NUMINSTANCES-1 :
380
                       first_half_int                 ? romdata[5+LASTSHIFTWIDTH-1:0] :
381
                                                        NUMINSTANCES - romdata[5+LASTSHIFTWIDTH-1:0];
382
assign orig_we_vnmsg = we & ~first_half_int;
383
assign orig_cn_we    = we & first_half_int;
384
assign orig_cn_rd    = we & ~first_half_int;
385
assign orig_disable  = last_step;
386
 
387
// add delays to compensate for latencies in external modules
388
localparam LOCAL_DELAY   = 1;  // Local register delays everything by 1
389
localparam RAM_LATENCY   = 2;  // RAM registers address in and data out
390
localparam VN_PIPES      = 3;
391
localparam SHUFFLE_PIPES = 3;
392
localparam CN_PIPES      = 2;
393
localparam MAX_PIPES     = VN_PIPES > CN_PIPES ? VN_PIPES : CN_PIPES;
394
 
395
localparam SHUFFLE_PREPSTAGES = 1; // we'll use 1 pipe locally to calculate shift addresses
396
localparam DISABLE_PREPSTAGES = 1; // disable needs 1 local pipe to sort out upstream/downstream
397
 
398
localparam LATENCY_VN_DEST  = LOCAL_DELAY + RAM_LATENCY + SHUFFLE_PIPES + CN_PIPES;
399
localparam LATENCY_CN_DEST  = LOCAL_DELAY + RAM_LATENCY + SHUFFLE_PIPES + VN_PIPES;
400
localparam LATENCY_CNVN_MAX = LOCAL_DELAY + RAM_LATENCY + SHUFFLE_PIPES + MAX_PIPES;
401
 
402
localparam LATENCY_DISABLE_DL = LATENCY_CN_DEST - DISABLE_PREPSTAGES;
403
localparam LATENCY_DISABLE_UL = LATENCY_VN_DEST - DISABLE_PREPSTAGES;
404
 
405
localparam LATENCY_SHIFTVALS_DL  = LOCAL_DELAY + RAM_LATENCY + VN_PIPES - SHUFFLE_PREPSTAGES;
406
localparam LATENCY_SHIFTVALS_UL  = LOCAL_DELAY + RAM_LATENCY + CN_PIPES - SHUFFLE_PREPSTAGES;
407
localparam LATENCY_SHIFTVALS_MAX = LOCAL_DELAY + RAM_LATENCY + MAX_PIPES - SHUFFLE_PREPSTAGES;
408
 
409
// for code neatness, all shift registers are the same length.  Rely on synthesizer to
410
// remove unused registers
411
reg[7:0]                  cn_addr_del[0:LATENCY_CNVN_MAX-1];
412
reg[7:0]                  vn_addr_del[0:LATENCY_CNVN_MAX-1];
413
reg[5+LASTSHIFTWIDTH-1:0] shiftval_del[0:LATENCY_CNVN_MAX-1];
414
reg                       we_vnmsg_del[0:LATENCY_CNVN_MAX-1];
415
reg                       cn_we_del[0:LATENCY_CNVN_MAX-1];
416
reg                       cn_rd_del[0:LATENCY_CNVN_MAX-1];
417
reg                       disable_vn_del[0:LATENCY_CNVN_MAX-1];
418
reg                       disable_cn_del[0:LATENCY_CNVN_MAX-1];
419
 
420
wire[5+LASTSHIFTWIDTH-1:0] shiftval_int;
421
 
422
integer loopvar;
423
 
424
assign we_vnmsg   = we_vnmsg_del[LATENCY_VN_DEST-1];
425
assign cn_we      = cn_we_del[LATENCY_CN_DEST-1];
426
assign cn_rd      = cn_rd_del[LATENCY_CN_DEST-1];
427
assign addr_vn    = vn_addr_del[LATENCY_VN_DEST-1];
428
assign addr_cn    = cn_addr_del[LATENCY_CN_DEST-1];
429
assign disable_vn = disable_vn_del[LATENCY_VN_DEST-1];
430
assign disable_cn = disable_cn_del[LATENCY_CN_DEST-1];
431
 
432
assign shiftval_int = shiftval_del[LATENCY_SHIFTVALS_MAX-1];
433
 
434
always @( posedge rst, posedge clk )
435
  if( rst )
436
    for( loopvar=0; loopvar<LATENCY_CNVN_MAX; loopvar=loopvar+1 )
437
    begin
438
      cn_addr_del[loopvar]    <= 0;
439
      vn_addr_del[loopvar]    <= 0;
440
      shiftval_del[loopvar]   <= 0;
441
      we_vnmsg_del[loopvar]   <= 0;
442
      cn_we_del[loopvar]      <= 0;
443
      cn_rd_del[loopvar]      <= 0;
444
      disable_vn_del[loopvar] <= 0;
445
      disable_cn_del[loopvar] <= 0;
446
    end
447
  else
448
  begin
449
    cn_addr_del[0]    <= orig_cn_addr;
450
    vn_addr_del[0]    <= orig_vn_addr;
451
    shiftval_del[0]   <= orig_shiftval;
452
    we_vnmsg_del[0]   <= orig_we_vnmsg;
453
    cn_we_del[0]      <= orig_cn_we;
454
    cn_rd_del[0]      <= orig_cn_rd;
455
    disable_vn_del[0] <= orig_disable;
456
    disable_cn_del[0] <= orig_disable;
457
 
458
    for( loopvar=1; loopvar<LATENCY_CNVN_MAX; loopvar=loopvar+1 )
459
    begin
460
      cn_addr_del[loopvar]    <= cn_addr_del[loopvar-1];
461
      vn_addr_del[loopvar]    <= vn_addr_del[loopvar-1];
462
      shiftval_del[loopvar]   <= shiftval_del[loopvar-1];
463
      we_vnmsg_del[loopvar]   <= we_vnmsg_del[loopvar-1];
464
      cn_we_del[loopvar]      <= cn_we_del[loopvar-1];
465
      cn_rd_del[loopvar]      <= cn_rd_del[loopvar-1];
466
      disable_vn_del[loopvar] <= disable_vn_del[loopvar-1];
467
      disable_cn_del[loopvar] <= disable_cn_del[loopvar-1];
468
    end
469
 
470
    // need some muxes in the middle of the shift registers because of different
471
    // latencies for upstream and downstream messages
472
    if( first_half )
473
    begin
474
      vn_addr_del[LATENCY_VN_DEST-1]    <= orig_vn_addr;
475
      we_vnmsg_del[LATENCY_VN_DEST-1]   <= orig_we_vnmsg;
476
      disable_vn_del[LATENCY_VN_DEST-1] <= orig_disable;
477
    end
478
    if( !first_half )
479
    begin
480
      cn_addr_del[LATENCY_CN_DEST-1]    <= orig_cn_addr;
481
      cn_we_del[LATENCY_CN_DEST-1]      <= orig_cn_we;
482
      cn_rd_del[LATENCY_CN_DEST-1]      <= orig_cn_rd;
483
      disable_cn_del[LATENCY_CN_DEST-1] <= orig_disable;
484
    end
485
 
486
    if( first_half )
487
      shiftval_del[LATENCY_SHIFTVALS_MAX-1] <= shiftval_del[LATENCY_SHIFTVALS_DL-2];
488
    if( !first_half )
489
      shiftval_del[LATENCY_SHIFTVALS_MAX-1] <= shiftval_del[LATENCY_SHIFTVALS_UL-2];
490
  end
491
 
492
wire[1:0]               shift0_int;
493
reg[1:0]                shift0_reg;
494
wire[2:0]               shift1_int;
495
reg[2:0]                shift1_reg;
496
reg[LASTSHIFTWIDTH-1:0] shift2_reg;
497
 
498
assign shift0 = shift0_reg;
499
assign shift1 = shift1_reg;
500
assign shift2 = shift2_reg;
501
 
502
reg[8:0]                rem0;
503
reg[LASTSHIFTWIDTH-1:0] rem1;
504
 
505
generate
506
  if( FOLDFACTOR==1 )
507
  begin: case360
508
    assign shift0_int = shiftval_int > 269 ? 3
509
                      : shiftval_int > 179 ? 2
510
                      : shiftval_int > 89  ? 1
511
                      :                      0;
512
 
513
    assign shift1_int = rem0 > 83 ? 7
514
                      : rem0 > 71 ? 6
515
                      : rem0 > 59 ? 5
516
                      : rem0 > 47 ? 4
517
                      : rem0 > 35 ? 3
518
                      : rem0 > 23 ? 2
519
                      : rem0 > 11 ? 1
520
                      :             0;
521
  end
522
  if( FOLDFACTOR==2 )
523
  begin: case180
524
    assign shift0_int = shiftval_int > 134 ? 3
525
                      : shiftval_int > 89  ? 2
526
                      : shiftval_int > 44  ? 1
527
                      :                      0;
528
 
529
 
530
    assign shift1_int = rem0 > 41 ? 7
531
                      : rem0 > 35 ? 6
532
                      : rem0 > 29 ? 5
533
                      : rem0 > 23 ? 4
534
                      : rem0 > 17 ? 3
535
                      : rem0 > 11 ? 2
536
                      : rem0 > 5  ? 1
537
                      :             0;
538
  end
539
  if( FOLDFACTOR==3 )
540
  begin: case120
541
    assign shift0_int = shiftval_int > 89 ? 3
542
                      : shiftval_int > 59 ? 2
543
                      : shiftval_int > 29 ? 1
544
                      :                     0;
545
 
546
    assign shift1_int = rem0 > 26 ? 7
547
                      : rem0 > 22 ? 6
548
                      : rem0 > 18 ? 5
549
                      : rem0 > 15 ? 4
550
                      : rem0 > 11 ? 3
551
                      : rem0 > 7  ? 2
552
                      : rem0 > 3  ? 1
553
                      :             0;
554
  end
555
  if( FOLDFACTOR==4 )
556
  begin: case90
557
    assign shift0_int = shiftval_int > 66 ? 3
558
                      : shiftval_int > 44 ? 2
559
                      : shiftval_int > 22 ? 1
560
                      :                     0;
561
 
562
    assign shift1_int = rem0 > 20 ? 7
563
                      : rem0 > 17 ? 6
564
                      : rem0 > 14 ? 5
565
                      : rem0 > 11 ? 4
566
                      : rem0 > 8  ? 3
567
                      : rem0 > 5  ? 2
568
                      : rem0 > 2  ? 1
569
                      :             0;
570
  end
571
endgenerate
572
 
573
always @( posedge rst, posedge clk )
574
  if( rst )
575
  begin
576
    shift0_reg            <= 0;
577
    shift1_reg            <= 0;
578
    shift2_reg            <= 0;
579
    rem0                  <= 0;
580
    rem1                  <= 0;
581
  end
582
  else
583
  begin
584
    // shift0 needs to be inverted (this arithmetic should be optimized out)
585
    shift0_reg <= shift0_int;
586
    shift1_reg <= shift1_int;
587
    shift2_reg <= rem1;
588
 
589
    // calculate remainders after first two shifts
590
    if( FOLDFACTOR==1 )
591
      rem0 <= shift0_int==3 ? shiftval_int-270
592
            : shift0_int==2 ? shiftval_int-180
593
            : shift0_int==1 ? shiftval_int-90
594
            :                 shiftval_int;
595
    if( FOLDFACTOR==2 )
596
      rem0 <= shift0_int==3 ? shiftval_int-135
597
            : shift0_int==2 ? shiftval_int-90
598
            : shift0_int==1 ? shiftval_int-45
599
            :                 shiftval_int;
600
    if( FOLDFACTOR==3 )
601
      rem0 <= shift0_int==3 ? shiftval_int-90
602
            : shift0_int==2 ? shiftval_int-60
603
            : shift0_int==1 ? shiftval_int-30
604
            :                 shiftval_int;
605
    if( FOLDFACTOR==4 )
606
      rem0 <= shift0_int==3 ? shiftval_int-67
607
            : shift0_int==2 ? shiftval_int-45
608
            : shift0_int==1 ? shiftval_int-23
609
            :                 shiftval_int;
610
 
611
    if( FOLDFACTOR==1 )
612
      rem1 <= shift1_int==7 ? rem0-84
613
            : shift1_int==6 ? rem0-72
614
            : shift1_int==5 ? rem0-60
615
            : shift1_int==4 ? rem0-48
616
            : shift1_int==3 ? rem0-36
617
            : shift1_int==2 ? rem0-24
618
            : shift1_int==1 ? rem0-12
619
            :                 rem0;
620
    if( FOLDFACTOR==3 )
621
      rem1 <= shift1_int==7 ? rem0-52
622
            : shift1_int==6 ? rem0-45
623
            : shift1_int==5 ? rem0-37
624
            : shift1_int==4 ? rem0-30
625
            : shift1_int==3 ? rem0-22
626
            : shift1_int==2 ? rem0-15
627
            : shift1_int==1 ? rem0-7
628
            :                 rem0;
629
    if( FOLDFACTOR==4 )
630
      rem1 <= shift1_int==7 ? rem0-21
631
            : shift1_int==6 ? rem0-18
632
            : shift1_int==5 ? rem0-15
633
            : shift1_int==4 ? rem0-12
634
            : shift1_int==3 ? rem0-9
635
            : shift1_int==2 ? rem0-6
636
            : shift1_int==1 ? rem0-3
637
            :                 rem0;
638
  end
639
endmodule

powered by: WebSVN 2.1.0

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