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

Subversion Repositories tcp_socket

[/] [tcp_socket/] [trunk/] [chips2/] [chips/] [compiler/] [fpu.py] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 jondawson
divider = """//IEEE Floating Point Divider (Single Precision)
2
//Copyright (C) Jonathan P Dawson 2013
3
//2013-12-12
4
//
5
module divider(
6
        input_a,
7
        input_b,
8
        input_a_stb,
9
        input_b_stb,
10
        output_z_ack,
11
        clk,
12
        rst,
13
        output_z,
14
        output_z_stb,
15
        input_a_ack,
16
        input_b_ack);
17
 
18
  input     clk;
19
  input     rst;
20
 
21
  input     [31:0] input_a;
22
  input     input_a_stb;
23
  output    input_a_ack;
24
 
25
  input     [31:0] input_b;
26
  input     input_b_stb;
27
  output    input_b_ack;
28
 
29
  output    [31:0] output_z;
30
  output    output_z_stb;
31
  input     output_z_ack;
32
 
33
  reg       s_output_z_stb;
34
  reg       [31:0] s_output_z;
35
  reg       s_input_a_ack;
36
  reg       s_input_b_ack;
37
 
38
  reg       [3:0] state;
39
  parameter get_a         = 4'd0,
40
            get_b         = 4'd1,
41
            unpack        = 4'd2,
42
            special_cases = 4'd3,
43
            normalise_a   = 4'd4,
44
            normalise_b   = 4'd5,
45
            divide_0      = 4'd6,
46
            divide_1      = 4'd7,
47
            divide_2      = 4'd8,
48
            divide_3      = 4'd9,
49
            normalise_1   = 4'd10,
50
            normalise_2   = 4'd11,
51
            round         = 4'd12,
52
            pack          = 4'd13,
53
            put_z         = 4'd14;
54
 
55
  reg       [31:0] a, b, z;
56
  reg       [23:0] a_m, b_m, z_m;
57
  reg       [9:0] a_e, b_e, z_e;
58
  reg       a_s, b_s, z_s;
59
  reg       guard, round_bit, sticky;
60
  reg       [50:0] quotient, divisor, dividend, remainder;
61
  reg       [5:0] count;
62
 
63
  always @(posedge clk)
64
  begin
65
 
66
    case(state)
67
 
68
      get_a:
69
      begin
70
        s_input_a_ack <= 1;
71
        if (s_input_a_ack && input_a_stb) begin
72
          a <= input_a;
73
          s_input_a_ack <= 0;
74
          state <= get_b;
75
        end
76
      end
77
 
78
      get_b:
79
      begin
80
        s_input_b_ack <= 1;
81
        if (s_input_b_ack && input_b_stb) begin
82
          b <= input_b;
83
          s_input_b_ack <= 0;
84
          state <= unpack;
85
        end
86
      end
87
 
88
      unpack:
89
      begin
90
        a_m <= a[22 : 0];
91
        b_m <= b[22 : 0];
92
        a_e <= a[30 : 23] - 127;
93
        b_e <= b[30 : 23] - 127;
94
        a_s <= a[31];
95
        b_s <= b[31];
96
        state <= special_cases;
97
      end
98
 
99
      special_cases:
100
      begin
101
        //if a is NaN or b is NaN return NaN
102
        if ((a_e == 128 && a_m != 0) || (b_e == 128 && b_m != 0)) begin
103
          z[31] <= 1;
104
          z[30:23] <= 255;
105
          z[22] <= 1;
106
          z[21:0] <= 0;
107
          state <= put_z;
108
          //if a is inf and b is inf return NaN
109
        end else if ((a_e == 128) && (b_e == 128)) begin
110
          z[31] <= 1;
111
          z[30:23] <= 255;
112
          z[22] <= 1;
113
          z[21:0] <= 0;
114
          state <= put_z;
115
        //if a is inf return inf
116
        end else if (a_e == 128) begin
117
          z[31] <= a_s ^ b_s;
118
          z[30:23] <= 255;
119
          z[22:0] <= 0;
120
          state <= put_z;
121
           //if b is zero return NaN
122
          if ($signed(b_e == -127) && (b_m == 0)) begin
123
            z[31] <= 1;
124
            z[30:23] <= 255;
125
            z[22] <= 1;
126
            z[21:0] <= 0;
127
            state <= put_z;
128
          end
129
        //if b is inf return zero
130
        end else if (b_e == 128) begin
131
          z[31] <= a_s ^ b_s;
132
          z[30:23] <= 0;
133
          z[22:0] <= 0;
134
          state <= put_z;
135
        //if a is zero return zero
136
        end else if (($signed(a_e) == -127) && (a_m == 0)) begin
137
          z[31] <= a_s ^ b_s;
138
          z[30:23] <= 0;
139
          z[22:0] <= 0;
140
          state <= put_z;
141
           //if b is zero return NaN
142
          if (($signed(b_e) == -127) && (b_m == 0)) begin
143
            z[31] <= 1;
144
            z[30:23] <= 255;
145
            z[22] <= 1;
146
            z[21:0] <= 0;
147
            state <= put_z;
148
          end
149
        //if b is zero return inf
150
        end else if (($signed(b_e) == -127) && (b_m == 0)) begin
151
          z[31] <= a_s ^ b_s;
152
          z[30:23] <= 255;
153
          z[22:0] <= 0;
154
          state <= put_z;
155
        end else begin
156
          //Denormalised Number
157
          if ($signed(a_e) == -127) begin
158
            a_e <= -126;
159
          end else begin
160
            a_m[23] <= 1;
161
          end
162
          //Denormalised Number
163
          if ($signed(b_e) == -127) begin
164
            b_e <= -126;
165
          end else begin
166
            b_m[23] <= 1;
167
          end
168
          state <= normalise_a;
169
        end
170
      end
171
 
172
      normalise_a:
173
      begin
174
        if (a_m[23]) begin
175
          state <= normalise_b;
176
        end else begin
177
          a_m <= a_m << 1;
178
          a_e <= a_e - 1;
179
        end
180
      end
181
 
182
      normalise_b:
183
      begin
184
        if (b_m[23]) begin
185
          state <= divide_0;
186
        end else begin
187
          b_m <= b_m << 1;
188
          b_e <= b_e - 1;
189
        end
190
      end
191
 
192
      divide_0:
193
      begin
194
        z_s <= a_s ^ b_s;
195
        z_e <= a_e - b_e;
196
        quotient <= 0;
197
        remainder <= 0;
198
        count <= 0;
199
        dividend <= a_m << 27;
200
        divisor <= b_m;
201
        state <= divide_1;
202
      end
203
 
204
      divide_1:
205
      begin
206
        quotient <= quotient << 1;
207
        remainder <= remainder << 1;
208
        remainder[0] <= dividend[50];
209
        dividend <= dividend << 1;
210
        state <= divide_2;
211
      end
212
 
213
      divide_2:
214
      begin
215
        if (remainder >= divisor) begin
216
          quotient[0] <= 1;
217
          remainder <= remainder - divisor;
218
        end
219
        if (count == 49) begin
220
          state <= divide_3;
221
        end else begin
222
          count <= count + 1;
223
          state <= divide_1;
224
        end
225
      end
226
 
227
      divide_3:
228
      begin
229
        z_m <= quotient[26:3];
230
        guard <= quotient[2];
231
        round_bit <= quotient[1];
232
        sticky <= quotient[0] | (remainder != 0);
233
        state <= normalise_1;
234
      end
235
 
236
      normalise_1:
237
      begin
238
        if (z_m[23] == 0 && $signed(z_e) > -126) begin
239
          z_e <= z_e - 1;
240
          z_m <= z_m << 1;
241
          z_m[0] <= guard;
242
          guard <= round_bit;
243
          round_bit <= 0;
244
        end else begin
245
          state <= normalise_2;
246
        end
247
      end
248
 
249
      normalise_2:
250
      begin
251
        if ($signed(z_e) < -126) begin
252
          z_e <= z_e + 1;
253
          z_m <= z_m >> 1;
254
          guard <= z_m[0];
255
          round_bit <= guard;
256
          sticky <= sticky | round_bit;
257
        end else begin
258
          state <= round;
259
        end
260
      end
261
 
262
      round:
263
      begin
264
        if (guard && (round_bit | sticky | z_m[0])) begin
265
          z_m <= z_m + 1;
266
          if (z_m == 24'hffffff) begin
267
            z_e <=z_e + 1;
268
          end
269
        end
270
        state <= pack;
271
      end
272
 
273
      pack:
274
      begin
275
        z[22 : 0] <= z_m[22:0];
276
        z[30 : 23] <= z_e[7:0] + 127;
277
        z[31] <= z_s;
278
        if ($signed(z_e) == -126 && z_m[23] == 0) begin
279
          z[30 : 23] <= 0;
280
        end
281
        //if overflow occurs, return inf
282
        if ($signed(z_e) > 127) begin
283
          z[22 : 0] <= 0;
284
          z[30 : 23] <= 255;
285
          z[31] <= z_s;
286
        end
287
        state <= put_z;
288
      end
289
 
290
      put_z:
291
      begin
292
        s_output_z_stb <= 1;
293
        s_output_z <= z;
294
        if (s_output_z_stb && output_z_ack) begin
295
          s_output_z_stb <= 0;
296
          state <= get_a;
297
        end
298
      end
299
 
300
    endcase
301
 
302
    if (rst == 1) begin
303
      state <= get_a;
304
      s_input_a_ack <= 0;
305
      s_input_b_ack <= 0;
306
      s_output_z_stb <= 0;
307
    end
308
 
309
  end
310
  assign input_a_ack = s_input_a_ack;
311
  assign input_b_ack = s_input_b_ack;
312
  assign output_z_stb = s_output_z_stb;
313
  assign output_z = s_output_z;
314
 
315
endmodule
316
 
317
"""
318
multiplier = """//IEEE Floating Point Multiplier (Single Precision)
319
//Copyright (C) Jonathan P Dawson 2013
320
//2013-12-12
321
module multiplier(
322
        input_a,
323
        input_b,
324
        input_a_stb,
325
        input_b_stb,
326
        output_z_ack,
327
        clk,
328
        rst,
329
        output_z,
330
        output_z_stb,
331
        input_a_ack,
332
        input_b_ack);
333
 
334
  input     clk;
335
  input     rst;
336
 
337
  input     [31:0] input_a;
338
  input     input_a_stb;
339
  output    input_a_ack;
340
 
341
  input     [31:0] input_b;
342
  input     input_b_stb;
343
  output    input_b_ack;
344
 
345
  output    [31:0] output_z;
346
  output    output_z_stb;
347
  input     output_z_ack;
348
 
349
  reg       s_output_z_stb;
350
  reg       [31:0] s_output_z;
351
  reg       s_input_a_ack;
352
  reg       s_input_b_ack;
353
 
354
  reg       [3:0] state;
355
  parameter get_a         = 4'd0,
356
            get_b         = 4'd1,
357
            unpack        = 4'd2,
358
            special_cases = 4'd3,
359
            normalise_a   = 4'd4,
360
            normalise_b   = 4'd5,
361
            multiply_0    = 4'd6,
362
            multiply_1    = 4'd7,
363
            normalise_1   = 4'd8,
364
            normalise_2   = 4'd9,
365
            round         = 4'd10,
366
            pack          = 4'd11,
367
            put_z         = 4'd12;
368
 
369
  reg       [31:0] a, b, z;
370
  reg       [23:0] a_m, b_m, z_m;
371
  reg       [9:0] a_e, b_e, z_e;
372
  reg       a_s, b_s, z_s;
373
  reg       guard, round_bit, sticky;
374
  reg       [49:0] product;
375
 
376
  always @(posedge clk)
377
  begin
378
 
379
    case(state)
380
 
381
      get_a:
382
      begin
383
        s_input_a_ack <= 1;
384
        if (s_input_a_ack && input_a_stb) begin
385
          a <= input_a;
386
          s_input_a_ack <= 0;
387
          state <= get_b;
388
        end
389
      end
390
 
391
      get_b:
392
      begin
393
        s_input_b_ack <= 1;
394
        if (s_input_b_ack && input_b_stb) begin
395
          b <= input_b;
396
          s_input_b_ack <= 0;
397
          state <= unpack;
398
        end
399
      end
400
 
401
      unpack:
402
      begin
403
        a_m <= a[22 : 0];
404
        b_m <= b[22 : 0];
405
        a_e <= a[30 : 23] - 127;
406
        b_e <= b[30 : 23] - 127;
407
        a_s <= a[31];
408
        b_s <= b[31];
409
        state <= special_cases;
410
      end
411
 
412
      special_cases:
413
      begin
414
        //if a is NaN or b is NaN return NaN
415
        if ((a_e == 128 && a_m != 0) || (b_e == 128 && b_m != 0)) begin
416
          z[31] <= 1;
417
          z[30:23] <= 255;
418
          z[22] <= 1;
419
          z[21:0] <= 0;
420
          state <= put_z;
421
        //if a is inf return inf
422
        end else if (a_e == 128) begin
423
          z[31] <= a_s ^ b_s;
424
          z[30:23] <= 255;
425
          z[22:0] <= 0;
426
          state <= put_z;
427
           //if b is zero return NaN
428
          if ($signed(b_e == -127) && (b_m == 0)) begin
429
            z[31] <= 1;
430
            z[30:23] <= 255;
431
            z[22] <= 1;
432
            z[21:0] <= 0;
433
            state <= put_z;
434
          end
435
        //if b is inf return inf
436
        end else if (b_e == 128) begin
437
          z[31] <= a_s ^ b_s;
438
          z[30:23] <= 255;
439
          z[22:0] <= 0;
440
          state <= put_z;
441
        //if a is zero return zero
442
        end else if (($signed(a_e) == -127) && (a_m == 0)) begin
443
          z[31] <= a_s ^ b_s;
444
          z[30:23] <= 0;
445
          z[22:0] <= 0;
446
          state <= put_z;
447
        //if b is zero return zero
448
        end else if (($signed(b_e) == -127) && (b_m == 0)) begin
449
          z[31] <= a_s ^ b_s;
450
          z[30:23] <= 0;
451
          z[22:0] <= 0;
452
          state <= put_z;
453
        end else begin
454
          //Denormalised Number
455
          if ($signed(a_e) == -127) begin
456
            a_e <= -126;
457
          end else begin
458
            a_m[23] <= 1;
459
          end
460
          //Denormalised Number
461
          if ($signed(b_e) == -127) begin
462
            b_e <= -126;
463
          end else begin
464
            b_m[23] <= 1;
465
          end
466
          state <= normalise_a;
467
        end
468
      end
469
 
470
      normalise_a:
471
      begin
472
        if (a_m[23]) begin
473
          state <= normalise_b;
474
        end else begin
475
          a_m <= a_m << 1;
476
          a_e <= a_e - 1;
477
        end
478
      end
479
 
480
      normalise_b:
481
      begin
482
        if (b_m[23]) begin
483
          state <= multiply_0;
484
        end else begin
485
          b_m <= b_m << 1;
486
          b_e <= b_e - 1;
487
        end
488
      end
489
 
490
      multiply_0:
491
      begin
492
        z_s <= a_s ^ b_s;
493
        z_e <= a_e + b_e + 1;
494
        product <= a_m * b_m * 4;
495
        state <= multiply_1;
496
      end
497
 
498
      multiply_1:
499
      begin
500
        z_m <= product[49:26];
501
        guard <= product[25];
502
        round_bit <= product[24];
503
        sticky <= (product[23:0] != 0);
504
        state <= normalise_1;
505
      end
506
 
507
      normalise_1:
508
      begin
509
        if (z_m[23] == 0) begin
510
          z_e <= z_e - 1;
511
          z_m <= z_m << 1;
512
          z_m[0] <= guard;
513
          guard <= round_bit;
514
          round_bit <= 0;
515
        end else begin
516
          state <= normalise_2;
517
        end
518
      end
519
 
520
      normalise_2:
521
      begin
522
        if ($signed(z_e) < -126) begin
523
          z_e <= z_e + 1;
524
          z_m <= z_m >> 1;
525
          guard <= z_m[0];
526
          round_bit <= guard;
527
          sticky <= sticky | round_bit;
528
        end else begin
529
          state <= round;
530
        end
531
      end
532
 
533
      round:
534
      begin
535
        if (guard && (round_bit | sticky | z_m[0])) begin
536
          z_m <= z_m + 1;
537
          if (z_m == 24'hffffff) begin
538
            z_e <=z_e + 1;
539
          end
540
        end
541
        state <= pack;
542
      end
543
 
544
      pack:
545
      begin
546
        z[22 : 0] <= z_m[22:0];
547
        z[30 : 23] <= z_e[7:0] + 127;
548
        z[31] <= z_s;
549
        if ($signed(z_e) == -126 && z_m[23] == 0) begin
550
          z[30 : 23] <= 0;
551
        end
552
        //if overflow occurs, return inf
553
        if ($signed(z_e) > 127) begin
554
          z[22 : 0] <= 0;
555
          z[30 : 23] <= 255;
556
          z[31] <= z_s;
557
        end
558
        state <= put_z;
559
      end
560
 
561
      put_z:
562
      begin
563
        s_output_z_stb <= 1;
564
        s_output_z <= z;
565
        if (s_output_z_stb && output_z_ack) begin
566
          s_output_z_stb <= 0;
567
          state <= get_a;
568
        end
569
      end
570
 
571
    endcase
572
 
573
    if (rst == 1) begin
574
      state <= get_a;
575
      s_input_a_ack <= 0;
576
      s_input_b_ack <= 0;
577
      s_output_z_stb <= 0;
578
    end
579
 
580
  end
581
  assign input_a_ack = s_input_a_ack;
582
  assign input_b_ack = s_input_b_ack;
583
  assign output_z_stb = s_output_z_stb;
584
  assign output_z = s_output_z;
585
 
586
endmodule
587
 
588
"""
589
adder = """//IEEE Floating Point Adder (Single Precision)
590
//Copyright (C) Jonathan P Dawson 2013
591
//2013-12-12
592
 
593
module adder(
594
        input_a,
595
        input_b,
596
        input_a_stb,
597
        input_b_stb,
598
        output_z_ack,
599
        clk,
600
        rst,
601
        output_z,
602
        output_z_stb,
603
        input_a_ack,
604
        input_b_ack);
605
 
606
  input     clk;
607
  input     rst;
608
 
609
  input     [31:0] input_a;
610
  input     input_a_stb;
611
  output    input_a_ack;
612
 
613
  input     [31:0] input_b;
614
  input     input_b_stb;
615
  output    input_b_ack;
616
 
617
  output    [31:0] output_z;
618
  output    output_z_stb;
619
  input     output_z_ack;
620
 
621
  reg       s_output_z_stb;
622
  reg       [31:0] s_output_z;
623
  reg       s_input_a_ack;
624
  reg       s_input_b_ack;
625
 
626
  reg       [3:0] state;
627
  parameter get_a         = 4'd0,
628
            get_b         = 4'd1,
629
            unpack        = 4'd2,
630
            special_cases = 4'd3,
631
            align         = 4'd4,
632
            add_0         = 4'd5,
633
            add_1         = 4'd6,
634
            normalise_1   = 4'd7,
635
            normalise_2   = 4'd8,
636
            round         = 4'd9,
637
            pack          = 4'd10,
638
            put_z         = 4'd11;
639
 
640
  reg       [31:0] a, b, z;
641
  reg       [26:0] a_m, b_m;
642
  reg       [23:0] z_m;
643
  reg       [9:0] a_e, b_e, z_e;
644
  reg       a_s, b_s, z_s;
645
  reg       guard, round_bit, sticky;
646
  reg       [27:0] sum;
647
 
648
  always @(posedge clk)
649
  begin
650
 
651
    case(state)
652
 
653
      get_a:
654
      begin
655
        s_input_a_ack <= 1;
656
        if (s_input_a_ack && input_a_stb) begin
657
          a <= input_a;
658
          s_input_a_ack <= 0;
659
          state <= get_b;
660
        end
661
      end
662
 
663
      get_b:
664
      begin
665
        s_input_b_ack <= 1;
666
        if (s_input_b_ack && input_b_stb) begin
667
          b <= input_b;
668
          s_input_b_ack <= 0;
669
          state <= unpack;
670
        end
671
      end
672
 
673
      unpack:
674
      begin
675
        a_m <= {a[22 : 0], 3'd0};
676
        b_m <= {b[22 : 0], 3'd0};
677
        a_e <= a[30 : 23] - 127;
678
        b_e <= b[30 : 23] - 127;
679
        a_s <= a[31];
680
        b_s <= b[31];
681
        state <= special_cases;
682
      end
683
 
684
      special_cases:
685
      begin
686
        //if a is NaN or b is NaN return NaN
687
        if ((a_e == 128 && a_m != 0) || (b_e == 128 && b_m != 0)) begin
688
          z[31] <= 1;
689
          z[30:23] <= 255;
690
          z[22] <= 1;
691
          z[21:0] <= 0;
692
          state <= put_z;
693
        //if a is inf return inf
694
        end else if (a_e == 128) begin
695
          z[31] <= a_s;
696
          z[30:23] <= 255;
697
          z[22:0] <= 0;
698
          state <= put_z;
699
        //if b is inf return inf
700
        end else if (b_e == 128) begin
701
          z[31] <= b_s;
702
          z[30:23] <= 255;
703
          z[22:0] <= 0;
704
          state <= put_z;
705
        //if a is zero return b
706
        end else if ((($signed(a_e) == -127) && (a_m == 0)) && (($signed(b_e) == -127) && (b_m == 0))) begin
707
          z[31] <= a_s & b_s;
708
          z[30:23] <= b_e[7:0] + 127;
709
          z[22:0] <= b_m[26:3];
710
          state <= put_z;
711
        //if a is zero return b
712
        end else if (($signed(a_e) == -127) && (a_m == 0)) begin
713
          z[31] <= b_s;
714
          z[30:23] <= b_e[7:0] + 127;
715
          z[22:0] <= b_m[26:3];
716
          state <= put_z;
717
        //if b is zero return a
718
        end else if (($signed(b_e) == -127) && (b_m == 0)) begin
719
          z[31] <= a_s;
720
          z[30:23] <= a_e[7:0] + 127;
721
          z[22:0] <= a_m[26:3];
722
          state <= put_z;
723
        end else begin
724
          //Denormalised Number
725
          if ($signed(a_e) == -127) begin
726
            a_e <= -126;
727
          end else begin
728
            a_m[26] <= 1;
729
          end
730
          //Denormalised Number
731
          if ($signed(b_e) == -127) begin
732
            b_e <= -126;
733
          end else begin
734
            b_m[26] <= 1;
735
          end
736
          state <= align;
737
        end
738
      end
739
 
740
      align:
741
      begin
742
        if ($signed(a_e) > $signed(b_e)) begin
743
          b_e <= b_e + 1;
744
          b_m <= b_m >> 1;
745
          b_m[0] <= b_m[0] | b_m[1];
746
        end else if ($signed(a_e) < $signed(b_e)) begin
747
          a_e <= a_e + 1;
748
          a_m <= a_m >> 1;
749
          a_m[0] <= a_m[0] | a_m[1];
750
        end else begin
751
          state <= add_0;
752
        end
753
      end
754
 
755
      add_0:
756
      begin
757
        z_e <= a_e;
758
        if (a_s == b_s) begin
759
          sum <= a_m + b_m;
760
          z_s <= a_s;
761
        end else begin
762
          if (a_m >= b_m) begin
763
            sum <= a_m - b_m;
764
            z_s <= a_s;
765
          end else begin
766
            sum <= b_m - a_m;
767
            z_s <= b_s;
768
          end
769
        end
770
        state <= add_1;
771
      end
772
 
773
      add_1:
774
      begin
775
        if (sum[27]) begin
776
          z_m <= sum[27:4];
777
          guard <= sum[3];
778
          round_bit <= sum[2];
779
          sticky <= sum[1] | sum[0];
780
          z_e <= z_e + 1;
781
        end else begin
782
          z_m <= sum[26:3];
783
          guard <= sum[2];
784
          round_bit <= sum[1];
785
          sticky <= sum[0];
786
        end
787
        state <= normalise_1;
788
      end
789
 
790
      normalise_1:
791
      begin
792
        if (z_m[23] == 0 && $signed(z_e) > -126) begin
793
          z_e <= z_e - 1;
794
          z_m <= z_m << 1;
795
          z_m[0] <= guard;
796
          guard <= round_bit;
797
          round_bit <= 0;
798
        end else begin
799
          state <= normalise_2;
800
        end
801
      end
802
 
803
      normalise_2:
804
      begin
805
        if ($signed(z_e) < -126) begin
806
          z_e <= z_e + 1;
807
          z_m <= z_m >> 1;
808
          guard <= z_m[0];
809
          round_bit <= guard;
810
          sticky <= sticky | round_bit;
811
        end else begin
812
          state <= round;
813
        end
814
      end
815
 
816
      round:
817
      begin
818
        if (guard && (round_bit | sticky | z_m[0])) begin
819
          z_m <= z_m + 1;
820
          if (z_m == 24'hffffff) begin
821
            z_e <=z_e + 1;
822
          end
823
        end
824
        state <= pack;
825
      end
826
 
827
      pack:
828
      begin
829
        z[22 : 0] <= z_m[22:0];
830
        z[30 : 23] <= z_e[7:0] + 127;
831
        z[31] <= z_s;
832
        if ($signed(z_e) == -126 && z_m[23] == 0) begin
833
          z[30 : 23] <= 0;
834
        end
835
        //if overflow occurs, return inf
836
        if ($signed(z_e) > 127) begin
837
          z[22 : 0] <= 0;
838
          z[30 : 23] <= 255;
839
          z[31] <= z_s;
840
        end
841
        state <= put_z;
842
      end
843
 
844
      put_z:
845
      begin
846
        s_output_z_stb <= 1;
847
        s_output_z <= z;
848
        if (s_output_z_stb && output_z_ack) begin
849
          s_output_z_stb <= 0;
850
          state <= get_a;
851
        end
852
      end
853
 
854
    endcase
855
 
856
    if (rst == 1) begin
857
      state <= get_a;
858
      s_input_a_ack <= 0;
859
      s_input_b_ack <= 0;
860
      s_output_z_stb <= 0;
861
    end
862
 
863
  end
864
  assign input_a_ack = s_input_a_ack;
865
  assign input_b_ack = s_input_b_ack;
866
  assign output_z_stb = s_output_z_stb;
867
  assign output_z = s_output_z;
868
 
869
endmodule
870
 
871
"""
872
int_to_float = """//Integer to IEEE Floating Point Converter (Single Precision)
873
//Copyright (C) Jonathan P Dawson 2013
874
//2013-12-12
875
module int_to_float(
876
        input_a,
877
        input_a_stb,
878
        output_z_ack,
879
        clk,
880
        rst,
881
        output_z,
882
        output_z_stb,
883
        input_a_ack);
884
 
885
  input     clk;
886
  input     rst;
887
 
888
  input     [31:0] input_a;
889
  input     input_a_stb;
890
  output    input_a_ack;
891
 
892
  output    [31:0] output_z;
893
  output    output_z_stb;
894
  input     output_z_ack;
895
 
896
  reg       s_output_z_stb;
897
  reg       [31:0] s_output_z;
898
  reg       s_input_a_ack;
899
  reg       s_input_b_ack;
900
 
901
  reg       [2:0] state;
902
  parameter get_a         = 3'd0,
903
            convert_0     = 3'd1,
904
            convert_1     = 3'd2,
905
            convert_2     = 3'd3,
906
            round         = 3'd4,
907
            pack          = 3'd5,
908
            put_z         = 3'd6;
909
 
910
  reg [31:0] a, z, value;
911
  reg [23:0] z_m;
912
  reg [7:0] z_r;
913
  reg [7:0] z_e;
914
  reg z_s;
915
  reg guard, round_bit, sticky;
916
 
917
  always @(posedge clk)
918
  begin
919
 
920
    case(state)
921
 
922
      get_a:
923
      begin
924
        s_input_a_ack <= 1;
925
        if (s_input_a_ack && input_a_stb) begin
926
          a <= input_a;
927
          s_input_a_ack <= 0;
928
          state <= convert_0;
929
        end
930
      end
931
 
932
      convert_0:
933
      begin
934
        if ( a == 0 ) begin
935
          z_s <= 0;
936
          z_m <= 0;
937
          z_e <= -127;
938
          state <= pack;
939
        end else begin
940
          value <= a[31] ? -a : a;
941
          z_s <= a[31];
942
          state <= convert_1;
943
        end
944
      end
945
 
946
      convert_1:
947
      begin
948
        z_e <= 31;
949
        z_m <= value[31:8];
950
        z_r <= value[7:0];
951
        state <= convert_2;
952
      end
953
 
954
      convert_2:
955
      begin
956
        if (!z_m[23]) begin
957
          z_e <= z_e - 1;
958
          z_m <= z_m << 1;
959
          z_m[0] <= z_r[7];
960
          z_r <= z_r << 1;
961
        end else begin
962
          guard <= z_r[7];
963
          round_bit <= z_r[6];
964
          sticky <= z_r[5:0] != 0;
965
          state <= round;
966
        end
967
      end
968
 
969
      round:
970
      begin
971
        if (guard && (round_bit || sticky || z_m[0])) begin
972
          z_m <= z_m + 1;
973
          if (z_m == 24'hffffff) begin
974
            z_e <=z_e + 1;
975
          end
976
        end
977
        state <= pack;
978
      end
979
 
980
      pack:
981
      begin
982
        z[22 : 0] <= z_m[22:0];
983
        z[30 : 23] <= z_e + 127;
984
        z[31] <= z_s;
985
        state <= put_z;
986
      end
987
 
988
      put_z:
989
      begin
990
        s_output_z_stb <= 1;
991
        s_output_z <= z;
992
        if (s_output_z_stb && output_z_ack) begin
993
          s_output_z_stb <= 0;
994
          state <= get_a;
995
        end
996
      end
997
 
998
    endcase
999
 
1000
    if (rst == 1) begin
1001
      state <= get_a;
1002
      s_input_a_ack <= 0;
1003
      s_output_z_stb <= 0;
1004
    end
1005
 
1006
  end
1007
  assign input_a_ack = s_input_a_ack;
1008
  assign output_z_stb = s_output_z_stb;
1009
  assign output_z = s_output_z;
1010
 
1011
endmodule
1012
 
1013
"""
1014
float_to_int = """//IEEE Floating Point to Integer Converter (Single Precision)
1015
//Copyright (C) Jonathan P Dawson 2013
1016
//2013-12-12
1017
module float_to_int(
1018
        input_a,
1019
        input_a_stb,
1020
        output_z_ack,
1021
        clk,
1022
        rst,
1023
        output_z,
1024
        output_z_stb,
1025
        input_a_ack);
1026
 
1027
  input     clk;
1028
  input     rst;
1029
 
1030
  input     [31:0] input_a;
1031
  input     input_a_stb;
1032
  output    input_a_ack;
1033
 
1034
  output    [31:0] output_z;
1035
  output    output_z_stb;
1036
  input     output_z_ack;
1037
 
1038
  reg       s_output_z_stb;
1039
  reg       [31:0] s_output_z;
1040
  reg       s_input_a_ack;
1041
 
1042
  reg       [2:0] state;
1043
  parameter get_a         = 3'd0,
1044
            special_cases = 3'd1,
1045
            unpack        = 3'd2,
1046
            convert       = 3'd3,
1047
            put_z         = 3'd4;
1048
 
1049
  reg [31:0] a_m, a, z;
1050
  reg [8:0] a_e;
1051
  reg a_s;
1052
 
1053
  always @(posedge clk)
1054
  begin
1055
 
1056
    case(state)
1057
 
1058
      get_a:
1059
      begin
1060
        s_input_a_ack <= 1;
1061
        if (s_input_a_ack && input_a_stb) begin
1062
          a <= input_a;
1063
          s_input_a_ack <= 0;
1064
          state <= unpack;
1065
        end
1066
      end
1067
 
1068
      unpack:
1069
      begin
1070
        a_m[31:8] <= {1'b1, a[22 : 0]};
1071
        a_m[7:0] <= 0;
1072
        a_e <= a[30 : 23] - 127;
1073
        a_s <= a[31];
1074
        state <= special_cases;
1075
      end
1076
 
1077
      special_cases:
1078
      begin
1079
        if ($signed(a_e) == -127) begin
1080
          z <= 0;
1081
          state <= put_z;
1082
        end else if ($signed(a_e) > 31) begin
1083
          z <= 32'h80000000;
1084
          state <= put_z;
1085
        end else begin
1086
          state <= convert;
1087
        end
1088
      end
1089
 
1090
      convert:
1091
      begin
1092
        if ($signed(a_e) < 31) begin
1093
          a_e <= a_e + 1;
1094
          a_m <= a_m >> 1;
1095
        end else begin
1096
          if (a_m[31]) begin
1097
            z <= 32'h80000000;
1098
          end else begin
1099
            z <= a_s ? -a_m : a_m;
1100
          end
1101
          state <= put_z;
1102
        end
1103
      end
1104
 
1105
      put_z:
1106
      begin
1107
        s_output_z_stb <= 1;
1108
        s_output_z <= z;
1109
        if (s_output_z_stb && output_z_ack) begin
1110
          s_output_z_stb <= 0;
1111
          state <= get_a;
1112
        end
1113
      end
1114
 
1115
    endcase
1116
 
1117
    if (rst == 1) begin
1118
      state <= get_a;
1119
      s_input_a_ack <= 0;
1120
      s_output_z_stb <= 0;
1121
    end
1122
 
1123
  end
1124
  assign input_a_ack = s_input_a_ack;
1125
  assign output_z_stb = s_output_z_stb;
1126
  assign output_z = s_output_z;
1127
 
1128
endmodule
1129
 
1130
"""

powered by: WebSVN 2.1.0

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