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

Subversion Repositories xilinx_virtex_fp_library

[/] [xilinx_virtex_fp_library/] [trunk/] [DualPathFPAdder/] [DualPathFPAdder.v] - Blame information for rev 18

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 constantin
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3 18 constantin
// Company:     UPT
4
// Engineer:    Constantina-Elena Gavriliu
5 8 constantin
// 
6
// Create Date:    00:31:28 11/19/2013 
7
// Design Name: 
8
// Module Name:    DualPathFPAdder 
9
// Project Name: 
10
// Target Devices: 
11
// Tool versions: 
12
// Description: A ± B
13 18 constantin
//                              //do not take into consideration cases for which the operation generates a NaN or Infinity exception (with corresponding sign) when initial "special cases" are not such exceptions
14 8 constantin
//
15 18 constantin
// Dependencies:        ClosePath.v
16
//                                      FarPath.v
17
//                                      special_cases.v
18
//                                      effective_op.v
19 8 constantin
//
20
// Revision: 
21
// Revision 0.01 - File Created
22
// Additional Comments: 
23
//
24
//////////////////////////////////////////////////////////////////////////////////
25
module DualPathFPAdder #(       parameter size_mantissa                         = 24, //1.M
26 18 constantin
                                                        parameter size_exponent                         = 8,
27
                                                        parameter size_exception_field          = 2,
28
                                                        parameter size_counter                          = 5,    //log2(size_mantissa) + 1 = 5)
29
                                                        parameter [size_exception_field - 1 : 0] zero                    = 0, //00
30
                                                        parameter [size_exception_field - 1 : 0] normal_number   = 1, //01
31
                                                        parameter [size_exception_field - 1 : 0] infinity                = 2, //10
32
                                                        parameter [size_exception_field - 1 : 0] NaN                     = 3, //11
33
                                                        parameter [1 : 0] FP_operation   = 0,
34
                                                        parameter [1 : 0] FP_to_int              = 1,
35
                                                        parameter [1 : 0] int_operation = 3,
36
 
37
                                                        parameter pipeline                                      = 0,
38
                                                        parameter pipeline_pos                          = 0,     // 8 bits
39
                                                        parameter double_size_mantissa  = size_mantissa + size_mantissa,
40
                                                        parameter double_size_counter           = size_counter + 1,
41
                                                        parameter size  = size_mantissa + size_exponent + size_exception_field)
42
 
43
                                                        (       input [size - 1 : 0] a_number_i,
44
                                                                input [size - 1 : 0] b_number_i,
45
                                                                input sub,
46
                                                                output[size - 1 : 0] resulted_number_o);
47 8 constantin
 
48 9 constantin
        wire [size_exception_field - 1 : 0] sp_case_a_number, sp_case_b_number;
49 8 constantin
        wire [size_mantissa - 1 : 0] m_a_number, m_b_number;
50
        wire [size_exponent - 1 : 0] e_a_number, e_b_number;
51 9 constantin
        wire s_a_number, s_b_number;
52
 
53
        wire [size_exponent     : 0] a_greater_exponent, b_greater_exponent;
54
 
55 8 constantin
        wire [size_exponent - 1 : 0] exp_difference;
56 9 constantin
        wire [size_exponent     : 0] exp_inter;
57
        wire [size_mantissa - 1 : 0] shifted_m_b;
58
        wire [size_mantissa - 1 : 0] initial_rounding_bits, inter_rounding_bits;
59
        wire eff_op;
60 8 constantin
 
61 9 constantin
        wire [size_mantissa     : 0] unnormalized_mantissa;
62
 
63 8 constantin
        wire [size_mantissa-1 : 0] fp_resulted_m_o, cp_resulted_m_o;
64
        wire [size_exponent-1 : 0] fp_resulted_e_o, cp_resulted_e_o;
65
 
66 9 constantin
        wire [size_exception_field - 1 : 0] resulted_exception_field;
67 8 constantin
        wire resulted_sign;
68 9 constantin
 
69
        wire zero_flag;
70 18 constantin
        wire [4:0] sign_cases;
71
        reg intermediar_sign;
72 9 constantin
 
73 8 constantin
 
74
        assign e_a_number       = a_number_i[size_mantissa + size_exponent - 1 : size_mantissa - 1];
75
        assign e_b_number = b_number_i[size_mantissa + size_exponent - 1 : size_mantissa - 1];
76
        assign s_a_number = a_number_i[size - size_exception_field - 1];
77
        assign s_b_number = b_number_i[size - size_exception_field - 1];
78
        assign sp_case_a_number = a_number_i[size - 1 : size - size_exception_field];
79
        assign sp_case_b_number = b_number_i[size - 1 : size - size_exception_field];
80 9 constantin
 
81
 
82
        //find the greater exponent
83
        assign a_greater_exponent = e_a_number - e_b_number;
84
        assign b_greater_exponent = e_b_number - e_a_number;
85
 
86
        //find the difference between exponents
87
        assign exp_difference   = (a_greater_exponent[size_exponent])? b_greater_exponent[size_exponent - 1 : 0] : a_greater_exponent[size_exponent - 1 : 0];
88
        assign exp_inter                = (b_greater_exponent[size_exponent])? {1'b0, e_a_number} : {1'b0, e_b_number};
89
 
90
        //set shifter always on m_b_number
91 18 constantin
        assign {m_a_number, m_b_number} = (b_greater_exponent[size_exponent])?
92
                                                                                                        {{1'b1, a_number_i[size_mantissa - 2 :0]}, {1'b1, b_number_i[size_mantissa - 2 :0]}} :
93
                                                                                                        {{1'b1, b_number_i[size_mantissa - 2 :0]}, {1'b1, a_number_i[size_mantissa - 2 :0]}};
94 8 constantin
 
95 10 constantin
        effective_op effective_op_instance( .a_sign(s_a_number), .b_sign(s_b_number), .sub(sub), .eff_op(eff_op));
96 8 constantin
 
97 10 constantin
 
98 8 constantin
        //instantiate FarPath component
99 9 constantin
        FarPath #(      .size_in_mantissa(size_mantissa),
100 8 constantin
                                        .size_out_mantissa(size_mantissa),
101
                                        .size_exponent(size_exponent),
102
                                        .pipeline(pipeline),
103
                                        .pipeline_pos(pipeline_pos),
104
                                        .size_counter(size_counter),
105 9 constantin
                                        .double_size_in_mantissa(double_size_mantissa))
106 10 constantin
                FarPath_instance (      .m_a_number(m_a_number),
107
                                                        .m_b_number(m_b_number),
108
                                                        .eff_op(eff_op),
109
                                                        .exp_difference(exp_difference),
110 9 constantin
                                    .exp_inter(exp_inter),
111
                                    .resulted_m_o(fp_resulted_m_o),
112
                                    .resulted_e_o(fp_resulted_e_o));
113
 
114
        //instantiate ClosePath component
115
        ClosePath #(.size_in_mantissa(size_mantissa),
116 8 constantin
                                        .size_out_mantissa(size_mantissa),
117
                                        .size_exponent(size_exponent),
118
                                        .pipeline(pipeline),
119
                                        .pipeline_pos(pipeline_pos),
120
                                        .size_counter(size_counter),
121 9 constantin
                                        .double_size_in_mantissa(double_size_mantissa))
122 10 constantin
                ClosePath_instance(     .m_a_number(m_a_number),
123
                                                        .m_b_number(m_b_number),
124
                                                        .exp_difference(exp_difference[0]),
125 9 constantin
                                                                .exp_inter(exp_inter),
126
                                                                .resulted_m_o(cp_resulted_m_o),
127 10 constantin
                                                                .resulted_e_o(cp_resulted_e_o),
128
                                                                .ovf(ovf));
129 9 constantin
 
130
        //compute exception_field
131
        special_cases   #(      .size_exception_field(size_exception_field),
132
                                                        .zero(zero),
133
                                                        .normal_number(normal_number),
134
                                                        .infinity(infinity),
135
                                                        .NaN(NaN))
136
                special_cases_instance( .sp_case_a_number(sp_case_a_number),
137
                                                                                .sp_case_b_number(sp_case_b_number),
138
                                                                                .sp_case_result_o(resulted_exception_field));
139
 
140
        //set zero_flag in case of equal numbers
141 17 constantin
        assign zero_flag = (exp_difference > 1 | !eff_op)?
142
                                                                ~((|{fp_resulted_m_o, resulted_exception_field[1]}) & (|resulted_exception_field))  :
143
                                                                ~((|{cp_resulted_m_o, resulted_exception_field[1]}) & (|resulted_exception_field));
144 10 constantin
 
145 18 constantin
 
146
        assign sign_cases = {eff_op, s_a_number, s_b_number, a_greater_exponent[size_exponent], b_greater_exponent[size_exponent]};
147
 
148
        always
149
                @(*)
150
        begin
151
                case (sign_cases)
152
                        5'b00000:       intermediar_sign = 1'b0;
153
                        5'b00001:       intermediar_sign = 1'b0;
154
                        5'b00010:       intermediar_sign = 1'b0;
155
 
156
                        5'b10000:       intermediar_sign = ~ovf;
157
                        5'b10001:       intermediar_sign = 1'b0;
158
                        5'b10010:       intermediar_sign = 1'b1;
159
 
160
                        5'b10100:       intermediar_sign = ~ovf;
161
                        5'b10101:       intermediar_sign = 1'b0;
162
                        5'b10110:       intermediar_sign = 1'b1;
163
 
164
                        5'b00100:       intermediar_sign = 1'b0;
165
                        5'b00101:       intermediar_sign = 1'b0;
166
                        5'b00110:       intermediar_sign = 1'b0;
167
 
168
                        5'b11000:       intermediar_sign = ovf;
169
                        5'b11001:       intermediar_sign = 1'b1;
170
                        5'b11010:       intermediar_sign = 1'b0;
171 13 constantin
 
172 18 constantin
                        5'b01000:       intermediar_sign = 1'b1;
173
                        5'b01001:       intermediar_sign = 1'b1;
174
                        5'b01010:       intermediar_sign = 1'b1;
175
 
176
                        5'b01100:       intermediar_sign = 1'b1;
177
                        5'b01101:       intermediar_sign = 1'b1;
178
                        5'b01110:       intermediar_sign = 1'b1;
179
 
180
                        5'b11100:       intermediar_sign = ovf;
181
                        5'b11101:       intermediar_sign = 1'b1;
182
                        5'b11110:       intermediar_sign = 1'b0;
183
 
184
                        default: intermediar_sign = 1'b1;
185
                endcase
186
        end
187
 
188
        assign resulted_sign = intermediar_sign;
189
 
190 9 constantin
        assign resulted_number_o = (zero_flag)? {size{1'b0}} :
191 18 constantin
                                                                        (!sp_case_a_number)? {b_number_i[size-1 : size-size_exception_field], eff_op ^ s_b_number, b_number_i[size-1-size_exception_field-1 : 0]} :
192
                                                                        (!sp_case_b_number)? {a_number_i[size-1 : 0]} :
193 10 constantin
                                                                        (exp_difference > 1 | !eff_op)?         {resulted_exception_field, resulted_sign, fp_resulted_e_o, fp_resulted_m_o[size_mantissa-2 : 0]}:
194 8 constantin
                                                                                                                                                {resulted_exception_field, resulted_sign, cp_resulted_e_o, cp_resulted_m_o[size_mantissa-2 : 0]};
195
endmodule

powered by: WebSVN 2.1.0

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