| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- module floating_add #(parameter N=16)(a, b, c);
- input logic [N-1:0] a, b;
- output logic [N-1:0] c;
- logic flag_a;
- logic flag_b;
- logic abs;
-
- // sign_x = x[N-1]
- // exponent_x = x[N-2:N-6]
- // mantissa_x = x[N-7:0]
-
- assign c[N-1] = a[N-1] ^ b[N-1];
-
- always_comb
- begin
- if (a[N-2:N-6] > b[N-2:N-6])
- begin
- flag_a = 1;
- flag_b = 0;
- abs = a[N-2:N-6] - b[N-2:N-6];
- c[N-2:N-6] = a[N-2:N-6];
- end
- else if (b[N-2:N-6] > a[N-2:N-6])
- begin
- flag_a = 0;
- flag_b = 1;
- abs = b[N-2:N-6] - a[N-2:N-6];
- c[N-2:N-6] = b[N-2:N-6];
- end
- else
- begin
- flag_a = 1;
- flag_b = 1;
- abs <= 0;
- c[N-2:N-6] = a[N-2:N-6];
- end
- end
-
- always_comb
- begin
- if (abs > 4'b1000)
- begin
- if (flag_a & ~flag_b) c = a;
- else if (~flag_a & flag_b) c = b;
- else c <= a;
- end
- else
- begin
- if (flag_a & ~flag_b)
- c[N-7:0] = a[N-7:0] + (b[N-7:0] >> abs);
- else if (~flag_a & flag_b)
- c[N-7:0] = b[N-7:0] + (a[N-7:0] >> abs);
- else c[N-7:0] <= b[N-7:0] << 1;
- end
- end
- endmodule
|