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/] [GeneralPrecMAFMappedConversions/] [Multiply_AccumulateConversion.v] - Blame information for rev 16

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 16 constantin
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company: 
4
// Engineer: 
5
// 
6
// Create Date:    17:53:05 10/15/2013 
7
// Design Name: 
8
// Module Name:    Multiply_AccumulateConversion
9
// Project Name: 
10
// Target Devices: 
11
// Tool versions: 
12
// Description: C ± A*B with mapped conversions, conversion applies to C number
13
//
14
// Dependencies: 
15
//
16
// Revision: 
17
// Revision 0.01 - File Created
18
// Additional Comments: 
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
module Multiply_AccumulateConversion #( parameter size_mantissa = 24,   //mantissa bits(1.M)
22
                                                                                parameter size_exponent = 8,    //exponent bits
23
                                                                                parameter size_counter  = 5,    //log2(size_mantissa) + 1 = 5
24
                                                                                parameter size_exception_field = 2,     // zero/normal numbers/infinity/NaN
25
                                                                                parameter zero                  = 00, //00
26
                                                                                parameter normal_number = 01, //01
27
                                                                                parameter infinity              = 10, //10
28
                                                                                parameter NaN                   = 11, //11
29
                                                                                parameter size_integer                  = 32,
30
                                                                                parameter counter_integer               = 6, //log2(size_integer) + 1 = 6)
31
                                                                                parameter [1 : 0] FP_operation   = 0, //00 
32
                                                                                parameter [1 : 0] FP_to_int              = 1, //01 
33
                                                                                parameter [1 : 0] int_to_FP              = 2, //10 
34
                                                                                parameter pipeline              = 0,
35
                                                                                parameter pipeline_pos  = 0,  //8 bits
36
 
37
                                                                                parameter size = size_exponent + size_mantissa + size_exception_field)
38
                                                                        (       input clk,
39
                                                                                input rst,
40
                                                                                input [1 : 0] conversion,
41
                                                                                input [size - 1:0] c_number_i,
42
                                                                                input [size - 1:0] a_number_i,
43
                                                                                input [size - 1:0] b_number_i,
44
                                                                                input sub,
45
                                                                                output[size - 1:0] resulting_number_o);
46
 
47
        parameter size_mul_mantissa = size_mantissa + size_mantissa;
48
        parameter size_mul_counter      = size_counter + 1;
49
        parameter max_size                      = (size_integer > size_mantissa)? size_integer : size_mantissa;
50
        parameter max_counter           = (counter_integer > size_counter)? counter_integer : size_counter;
51
        parameter size_diff_i_m         = (size_integer > size_mantissa)? (size_integer - size_mantissa) : (size_mantissa - size_integer);
52
        parameter bias                          = {1'b0,{(size_exponent-1){1'b1}}};
53
        parameter exp_biased            = bias + size_mantissa;
54
        parameter exponent                      = (size_mul_mantissa - max_size) + exp_biased;
55
        parameter subtr                         = max_size -2'd2;
56
 
57
        parameter bias_0_bits           = size_exponent - 1;
58
        parameter shift_mantissa_0_bits = size_mantissa-1'b1;
59
 
60
 
61
        wire [size_exception_field - 1 : 0] sp_case_a_number, sp_case_b_number, sp_case_c_number;
62
        wire [size_mantissa - 1 : 0] m_a_number, m_b_number, m_c_number;
63
        wire [size_exponent - 1 : 0] e_a_number, e_b_number, e_c_number;
64
        wire s_a_number, s_b_number, s_c_number;
65
 
66
        wire [size_exponent     : 0] ab_greater_exponent, c_greater_exponent;
67
 
68
        wire [size_exponent - 1 : 0] exp_difference;
69
        wire [size_exponent     : 0] exp_inter;
70
 
71
        wire [size_mul_mantissa - 1     : 0] m_ab_mantissa, c_mantissa;
72
        wire [size_exponent                     : 0] e_ab_number_inter, e_ab_number;
73
        wire [size_mul_counter - 1      : 0] lz_mul;
74
 
75
        wire zero_flag;
76
        wire sign_res;
77
        wire eff_op;
78
 
79
        wire [size_mantissa - 1         : 0] initial_rounding_bits, inter_rounding_bits, final_rounding_bits;
80
        wire [size_mul_mantissa + 1 : 0] normalized_mantissa, adder_mantissa;
81
        wire [size_mul_mantissa         : 0] unnormalized_mantissa;
82
        wire [size_mul_mantissa - 1 : 0] shifted_m_ab, convert_neg_mantissa, mantissa_to_shift;
83
        wire [size_mul_mantissa - 1 : 0] m_c, m_ab;
84
 
85
        wire [size_exception_field - 1 : 0] sp_case_o, sp_case_result_o;
86
        wire [size_mantissa - 2 : 0] final_mantissa;
87
        wire [size_exponent - 1 : 0] final_exponent;
88
        wire [size_mantissa : 0] rounded_mantissa;
89
 
90
 
91
        wire [size_mantissa - 1 : 0] resulted_mantissa;
92
        wire [size_exponent - 1 : 0] resulted_exponent;
93
 
94
        wire [size_exponent  : 0] subtracter;
95
 
96
        wire [size_mul_mantissa-max_size : 0] max_entityINT_FP_msb;
97
        wire [size_exponent     : 0] shift_value_when_positive_exponent, shift_value_when_negative_exponent;
98
        wire [size_exponent - 1 : 0] shift_value, shft_val;
99
        wire [size_exponent - 1 : 0] max_unadjusted_exponent, max_adjust_exponent, adjust;
100
        wire [size_exponent - 1 : 0] max_exp_selection;
101
        wire [size_exponent - 1 : 0] max_resulted_e_o;
102
        wire [max_size - 1 : 0] max_entityINT_FP, max_entityFP_INT;
103
        wire lsb_shft_bit;
104
        wire arith_shift;
105
        wire max_ovf;
106
 
107
        wire do_conversion;
108
 
109
        assign do_conversion = |conversion; //let me know if there is a conversion
110
 
111
        assign m_a_number                       = {1'b1, a_number_i[size_mantissa - 2 :0]};
112
        assign m_b_number                       = {1'b1, b_number_i[size_mantissa - 2 :0]};
113
        assign m_c_number                       = {1'b1, c_number_i[size_mantissa - 2 :0]};
114
        assign e_a_number                       = a_number_i[size_mantissa + size_exponent - 1 : size_mantissa - 1];
115
        assign e_b_number                       = b_number_i[size_mantissa + size_exponent - 1 : size_mantissa - 1];
116
        assign e_c_number                       = c_number_i[size_mantissa + size_exponent - 1 : size_mantissa - 1];
117
        assign s_a_number                       = a_number_i[size - size_exception_field - 1];
118
        assign s_b_number                       = b_number_i[size - size_exception_field - 1];
119
        assign s_c_number                       = c_number_i[size - size_exception_field - 1];
120
        assign sp_case_a_number = a_number_i[size - 1 : size - size_exception_field];
121
        assign sp_case_b_number = b_number_i[size - 1 : size - size_exception_field];
122
        assign sp_case_c_number = c_number_i[size - 1 : size - size_exception_field];
123
 
124
 
125
        //instantiate multiply component
126
        multiply #(     .size_mantissa(size_mantissa),
127
                                        .size_counter(size_counter),
128
                                        .size_mul_mantissa(size_mul_mantissa))
129
                multiply_instance (     .a_mantissa_i(m_a_number),
130
                                                                        .b_mantissa_i(m_b_number),
131
                                                                        .mul_mantissa(m_ab_mantissa));
132
 
133
        assign c_mantissa       = {1'b0,m_c_number, {(shift_mantissa_0_bits){1'b0}}};
134
        assign e_ab_number_inter = e_a_number + e_b_number;
135
        assign e_ab_number = e_ab_number_inter  - {(bias_0_bits){1'b1}};
136
 
137
        //find the greater exponent
138
        assign ab_greater_exponent = e_ab_number - e_c_number;
139
        assign c_greater_exponent = e_c_number - e_ab_number;
140
 
141
        //find the difference between exponents
142
        assign exp_difference   = (ab_greater_exponent[size_exponent])? c_greater_exponent[size_exponent - 1 : 0] : ab_greater_exponent[size_exponent - 1 : 0];
143
        assign exp_inter                = (c_greater_exponent[size_exponent])? {1'b0, e_ab_number} : {1'b0, e_c_number};
144
 
145
        //set shifter always on m_ab_number
146
        assign {m_c, m_ab} = (ab_greater_exponent[size_exponent])? {c_mantissa, m_ab_mantissa} :
147
                                                        {m_ab_mantissa, c_mantissa};
148
 
149
        assign subtracter =  e_c_number - bias;
150
        assign shift_value_when_positive_exponent = subtr - subtracter[size_exponent-1 : 0];
151
        assign shift_value_when_negative_exponent = max_size + (~subtracter[size_exponent-1 : 0]);
152
        assign shift_value = (subtracter[size_exponent])? shift_value_when_negative_exponent[size_exponent - 1 : 0] :
153
                             (shift_value_when_positive_exponent[size_exponent])? (~shift_value_when_positive_exponent[size_exponent - 1 : 0]):
154
                                                                                   shift_value_when_positive_exponent[size_exponent - 1 : 0];
155
        assign shft_val = do_conversion? shift_value : exp_difference;
156
        assign convert_neg_mantissa = {1'b0, ~c_number_i[size_mantissa-2 : 0]};
157
        assign mantissa_to_shift = conversion[0]?        (s_c_number? {{size_mantissa{1'b0}}, convert_neg_mantissa + 1'b1} :
158
                                                                                                {{size_mantissa{1'b0}}, 1'b1, c_number_i[size_mantissa-2 : 0]}) : m_ab;
159
        assign arith_shift = conversion[0]? s_c_number : 1'b0;
160
 
161
        //shift m_ab_number                             
162
        shifter #(      .INPUT_SIZE(size_mul_mantissa),
163
                                .SHIFT_SIZE(size_exponent),
164
                                .OUTPUT_SIZE(size_mul_mantissa + size_mantissa),
165
                                .DIRECTION(1'b0), //0=right, 1=left
166
                                .PIPELINE(pipeline),
167
                                .POSITION(pipeline_pos))
168
                m_b_shifter_instance(   .a(mantissa_to_shift),//mantissa
169
                                                                .arith(arith_shift),//logical shift
170
                                                                .shft(shft_val),
171
                                                                .shifted_a({shifted_m_ab, initial_rounding_bits}));
172
 
173
        assign max_entityFP_INT = {s_c_number, shifted_m_ab[max_size - size_diff_i_m - 1 : 0], initial_rounding_bits[size_mantissa - 1 : size_mantissa - size_diff_i_m + 1]};
174
 
175
 
176
        //instantiate effective_op component
177
        effective_op effective_op_instance(     .sign_a(s_a_number),
178
                                                                                .sign_b(s_b_number),
179
                                                                                .sign_c(s_c_number),
180
                                                                                .sub(sub),
181
                                                                                .eff_sub(eff_op));
182
 
183
        //instantiate accumulate component
184
        accumulate #(.size_mul_mantissa(size_mul_mantissa))
185
                accumulate_instance (   .m_a(m_c),
186
                                                                .m_b(shifted_m_ab),
187
                                                                .eff_op(eff_op),
188
                                                                .adder_mantissa(adder_mantissa));
189
 
190
        //compute unnormalized_mantissa
191
        assign  unnormalized_mantissa =
192
                                (adder_mantissa[size_mul_mantissa + 1])?        (~adder_mantissa[size_mul_mantissa : 0]) : adder_mantissa[size_mul_mantissa      : 0];
193
        assign  inter_rounding_bits = do_conversion?    (s_c_number? {size_mantissa{1'b1}} : {size_mantissa{1'b0}}) :
194
                                                                                                        ((adder_mantissa[size_mul_mantissa + 1])? ~initial_rounding_bits : initial_rounding_bits);
195
 
196
        assign max_entityINT_FP = do_conversion? (s_c_number? (~c_number_i[max_size-1 : 0]) :  c_number_i[max_size-1 : 0]) :
197
                                                                                                        unnormalized_mantissa[max_size-1 : 0];
198
        assign max_entityINT_FP_msb = do_conversion? {(size_mul_mantissa-max_size+1){1'b0}} : unnormalized_mantissa[size_mul_mantissa : max_size];
199
 
200
        assign lsb_shft_bit = (do_conversion)? s_c_number : max_entityINT_FP[0];
201
 
202
        assign max_ovf = do_conversion? 1'b0 : unnormalized_mantissa[size_mul_mantissa];
203
 
204
 
205
        //instantiate leading_zeros component
206
        leading_zeros #(.SIZE_INT(size_mul_mantissa + 1'b1),
207
                                        .SIZE_COUNTER(size_mul_counter),
208
                                        .PIPELINE(pipeline))
209
                leading_zeros_instance( .a({max_entityINT_FP_msb, max_entityINT_FP}),
210
                                                                .ovf(max_ovf),
211
                                                                .lz(lz_mul));
212
 
213
        //instantiate shifter component
214
        shifter #(      .INPUT_SIZE(size_mul_mantissa + size_mantissa + 1),
215
                                .SHIFT_SIZE(size_mul_counter),
216
                                .OUTPUT_SIZE(size_mul_mantissa + size_mantissa + 2),
217
                                .DIRECTION(1'b1),
218
                                .PIPELINE(pipeline),
219
                                .POSITION(pipeline_pos))
220
                shifter_instance(       .a({{max_entityINT_FP_msb, max_entityINT_FP}, inter_rounding_bits}),
221
                                                        .arith(lsb_shft_bit),
222
                                                        .shft(lz_mul),
223
                                                        .shifted_a({normalized_mantissa, final_rounding_bits}));
224
 
225
        //instantiate rounding_component
226
        rounding #(     .SIZE_MOST_S_MANTISSA(size_mantissa+1),
227
                                .SIZE_LEAST_S_MANTISSA(size_mul_mantissa+2))
228
                rounding_instance(      .unrounded_mantissa({1'b0, normalized_mantissa[size_mul_mantissa+1 : size_mantissa + 2]}),
229
                                    .dummy_bits({normalized_mantissa[size_mantissa + 1 : 0],final_rounding_bits}),
230
                                    .rounded_mantissa(rounded_mantissa));
231
 
232
 
233
        assign max_exp_selection = do_conversion? exponent : exp_inter;
234
        assign max_adjust_exponent = max_exp_selection - lz_mul;
235
        assign adjust = do_conversion? size_diff_i_m : 2'd2;
236
        assign max_unadjusted_exponent = max_adjust_exponent + adjust;
237
        assign max_resulted_e_o = (do_conversion & ~(|{max_entityINT_FP_msb, max_entityINT_FP}))? bias : max_unadjusted_exponent + rounded_mantissa[size_mantissa];
238
 
239
        assign resulted_exponent = conversion[0]?        max_entityFP_INT[size_mantissa+size_exponent-2 : size_mantissa-1] : max_resulted_e_o;
240
        assign resulted_mantissa = conversion[0]?        max_entityFP_INT[size_mantissa-1 : 0] :
241
                                                                                                (rounded_mantissa[size_mantissa])?      (rounded_mantissa[size_mantissa : 1]) :
242
                                                                                                                                                                                (rounded_mantissa[size_mantissa-1 : 0]);
243
 
244
        //instantiate special_cases_mul_acc component
245
        special_cases_mul_acc   #(      .size_exception_field(size_exception_field),
246
                                                                .zero(zero),
247
                                                                .normal_number(normal_number),
248
                                                                .infinity(infinity),
249
                                                                .NaN(NaN))
250
                special_cases_mul_acc_instance  (       .sp_case_a_number(sp_case_a_number),
251
                                                                                        .sp_case_b_number(sp_case_b_number),
252
                                                                                        .sp_case_c_number(sp_case_c_number),
253
                                                                                        .sp_case_result_o(sp_case_o));
254
 
255
        assign sp_case_result_o = do_conversion? sp_case_c_number : sp_case_o;
256
 
257
        //set zero_flag in case of equal numbers
258
        assign zero_flag = ~((|{resulted_mantissa,sp_case_o[1]}) & (|sp_case_o));
259
 
260
        //compute resulted_sign
261
        assign sign_res =       do_conversion? s_c_number : ((eff_op)?  (!c_greater_exponent[size_exponent]?
262
                                                                                (!ab_greater_exponent[size_exponent]? ~adder_mantissa[size_mul_mantissa+1] : s_c_number) : ~(s_b_number^s_a_number)) : s_c_number);
263
 
264
        assign final_mantissa = resulted_mantissa;
265
 
266
        assign final_exponent = resulted_exponent;
267
        assign resulting_number_o = (zero_flag)? {size{1'b0}} :{sp_case_result_o, sign_res, final_exponent, final_mantissa};
268
endmodule

powered by: WebSVN 2.1.0

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