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

Subversion Repositories fft2_size

[/] [fft2_size/] [fft_int/] [cascade_n.sv] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 Papayaved
`ifndef _cascade_n_
2
`define _cascade_n_
3
`include "butterfly.sv"
4
`include "yx_addr.sv"
5
`include "delay_line.sv"
6
 
7
module cascade_n #(parameter
8
        ADDR_WIDTH = 9,
9
        DATA_WIDTH = 32,
10
//      RES_WIDTH = DATA_WIDTH + 1,
11
        POW = 3 // 1...ADDR_WIDTH/2
12
)(
13
        input aclr, clk, sink_ready,
14
        output [ADDR_WIDTH-1:0] sink_rdaddr,
15
        input signed [DATA_WIDTH-1:0] sink_Re, sink_Im,
16
        output reg sink_rdack,
17
        input [ADDR_WIDTH-1:0] source_rdaddr,
18
        output reg signed [DATA_WIDTH:0] source_Re, source_Im,
19
        output reg source_ready,
20
        input source_rdack
21
);
22
        localparam DELAY = (POW == 1 || POW == 2) ? 3 : 4;
23
 
24
        reg wr_buf = 1'b0, rd_buf = 1'b0;
25
        reg signed [DATA_WIDTH:0] mem_Re[2][2**ADDR_WIDTH];
26
        reg signed [DATA_WIDTH:0] mem_Im[2][2**ADDR_WIDTH];
27
 
28
        reg [ADDR_WIDTH-1:0] cnt, cnt_dly;
29
        reg sop = 1'b0;
30
        wire [ADDR_WIDTH-1:0] wraddr;
31
        wire wrvalid;
32
        wire [DATA_WIDTH:0] bf_Re, bf_Im;
33
 
34
        always @(posedge clk, posedge aclr)
35
                if (aclr)
36
                        cnt <= '0;
37
                else if (!sink_ready || sink_rdack)
38
                        cnt <= '0;
39
                else
40
                        cnt <= cnt + 1'b1;
41
 
42
        yx_addr #(.WIDTH(ADDR_WIDTH), .POW(POW)) yx0(.cnt, .yx_cnt(sink_rdaddr));
43
 
44
        always_ff @(posedge clk) begin
45
                sink_rdack <= cnt == 2**ADDR_WIDTH - 2; // at last addr
46
                sop <= cnt == 'h0;
47
        end
48
 
49
        butterfly #(.DATA_WIDTH(DATA_WIDTH), .POW(POW)) bf( // 3,4 clocks delay
50
                .clk, .sync(sop), .sink_Re, .sink_Im, // y, x
51
                .source_Re(bf_Re), .source_Im(bf_Im) // y, x
52
        );
53
 
54
        // Delay line. Butterfly (3 or 4) + memory read (1)
55
        delay_lines_reg #(.DELAY(DELAY + 1), .WIDTH(ADDR_WIDTH)) dly0(
56
                .aclr(1'b0), .sclr(1'b0), .clock(clk), .clock_ena(1'b1),
57
                .sig_in(cnt), .sig_out(cnt_dly)
58
        );
59
 
60
        delay_line_reg #(.DELAY(DELAY + 1)) dly1(
61
                .aclr, .sclr(1'b0), .clock(clk), .clock_ena(1'b1),
62
                .sig_in(sink_ready), .sig_out(wrvalid)
63
        );
64
 
65
        yx_addr #(.WIDTH(ADDR_WIDTH), .POW(POW)) yx1(.cnt(cnt_dly), .yx_cnt(wraddr));
66
 
67
        always_ff @(posedge clk)
68
                if (wrvalid)
69
                        begin
70
                                mem_Re[wr_buf][wraddr] <= bf_Re;
71
                                mem_Im[wr_buf][wraddr] <= bf_Im;
72
                        end
73
 
74
        always_ff @(posedge clk) begin
75
                source_Re <= mem_Re[rd_buf][source_rdaddr];
76
                source_Im <= mem_Im[rd_buf][source_rdaddr];
77
        end
78
 
79
        generate
80
                if (POW == ADDR_WIDTH)
81
                        begin
82
                                always_ff @(posedge clk, posedge aclr)
83
                                        if (aclr)
84
                                                source_ready <= 1'b0;
85
                                        else if (wrvalid && cnt_dly == 2**(POW-1))
86
                                                source_ready <= 1'b1;
87
                                        else if (source_rdack) // end
88
                                                source_ready <= 1'b0;
89
                        end
90
                else
91
                        begin
92
                                always_ff @(posedge clk, posedge aclr)
93
                                        if (aclr)
94
                                                source_ready <= 1'b0;
95
                                        else if (wrvalid && wraddr == 2**POW)
96
                                                source_ready <= 1'b1;
97
                                        else if (source_rdack) // end
98
                                                source_ready <= 1'b0;
99
                        end
100
        endgenerate
101
 
102
        always_ff @(posedge clk, posedge aclr)
103
                if (aclr)
104
                        wr_buf <= 1'b0;
105
                else if (wrvalid && cnt_dly == {ADDR_WIDTH{1'b1}})
106
                        wr_buf <= !wr_buf;
107
 
108
        always_ff @(posedge clk, posedge aclr)
109
                if (aclr)
110
                        rd_buf <= 1'b0;
111
                else if (source_ready && source_rdack)
112
                        rd_buf <= !rd_buf;
113
 
114
endmodule :cascade_n
115
 
116
`endif

powered by: WebSVN 2.1.0

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