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

Subversion Repositories adder_tree

[/] [adder_tree/] [adder_tree.sv] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 Papayaved
`ifndef _adder_tree_
2
`define _adder_tree_
3
 
4
// DELAY = $clog2(N)
5
(* multstyle = "dsp" *) module adder_tree #(parameter
6
        N = 32, DATA_WIDTH = 33, RESULT_WIDTH = ((N-1) < 2**$clog2(N)) ? DATA_WIDTH + $clog2(N) : DATA_WIDTH + $clog2(N) + 1
7
)(
8
        input clock, clock_ena,
9
        input signed [DATA_WIDTH-1:0] data[N-1:0],
10
        output signed [RESULT_WIDTH-1:0] result
11
);
12
        generate
13
                if (N == 2)
14
                        add #(.DATAA_WIDTH(DATA_WIDTH), .DATAB_WIDTH(DATA_WIDTH), .RESULT_WIDTH(RESULT_WIDTH))
15
                                add_inst(.clock(clock), .clock_ena(clock_ena), .dataa(data[0]), .datab(data[1]), .result(result));
16
                else
17
                        begin
18
                                localparam RES_WIDTH = (RESULT_WIDTH > DATA_WIDTH + 1) ? DATA_WIDTH + 1 : RESULT_WIDTH;
19
                                localparam RESULTS = (N % 2 == 0) ? N/2 : N/2 + 1;
20
 
21
                                wire signed [RES_WIDTH-1:0] res[RESULTS - 1:0];
22
 
23
                                add_pairs #(.N(N), .DATA_WIDTH(DATA_WIDTH), .RESULT_WIDTH(RES_WIDTH))
24
                                        add_pairs_inst(.clock(clock), .clock_ena(clock_ena), .data(data), .result(res));
25
 
26
                                adder_tree #(.N(RESULTS), .DATA_WIDTH(RES_WIDTH))
27
                                        adder_tree_inst(.clock(clock), .clock_ena(clock_ena), .data(res), .result(result));
28
                        end
29
        endgenerate
30
 
31
endmodule :adder_tree
32
 
33
//////////////////////
34
module add_pairs #(parameter
35
        N = 32, DATA_WIDTH = 18, RESULT_WIDTH = DATA_WIDTH + 1, RESULTS = (N % 2 == 0) ? N/2 : N/2 + 1
36
)(
37
        input clock, clock_ena,
38
        input signed [DATA_WIDTH-1:0] data[N - 1:0],
39
        output signed [RESULT_WIDTH-1:0] result[RESULTS - 1:0]
40
);
41
        genvar i;
42
 
43
        generate
44
                for (i = 0; i < N/2; i++)
45
                        begin :a
46
                                add #(.DATAA_WIDTH(DATA_WIDTH), .DATAB_WIDTH(DATA_WIDTH), .RESULT_WIDTH(RESULT_WIDTH))
47
                                        add_inst(.clock, .clock_ena, .dataa(data[2*i]), .datab(data[2*i + 1]), .result(result[i]));
48
                        end
49
 
50
                if (RESULTS == N/2 + 1)
51
                        begin
52
                                reg [RESULT_WIDTH-1:0] res;
53
 
54
                                always @(posedge clock)
55
                                        if (clock_ena)
56
                                                res <= data[N-1];
57
 
58
                                assign result[RESULTS-1] = res;
59
                        end
60
        endgenerate
61
endmodule :add_pairs
62
 
63
//////////////////////
64
module add #(parameter
65
        DATAA_WIDTH = 16, DATAB_WIDTH = 17, RESULT_WIDTH = (DATAA_WIDTH > DATAB_WIDTH) ? DATAA_WIDTH + 1 : DATAB_WIDTH + 1
66
)(
67
        input clock, clock_ena,
68
        input signed [DATAA_WIDTH-1:0] dataa,
69
        input signed [DATAB_WIDTH-1:0] datab,
70
        output reg signed [RESULT_WIDTH-1:0] result
71
);
72
        always_ff @(posedge clock)
73
                if (clock_ena)
74
                        result <= dataa + datab;
75
endmodule :add
76
 
77
`endif

powered by: WebSVN 2.1.0

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