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

Subversion Repositories fft2_size

[/] [fft2_size/] [fft_int_size/] [cascade_0.sv] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 Papayaved
/*
2
Pre-processing cascade
3
It make bit-reversal permutation
4
First FFT cascade reads data from it
5
*/
6
 
7
 
8
`ifndef _cascade_0_
9
`define _cascade_0_
10
`include "bitrev_cnt.sv"
11
 
12
module cascade_0 #(parameter
13
        ADDR_WIDTH = 9,
14
        DATA_WIDTH = 32,
15
        POW_WIDTH = (2**$clog2(ADDR_WIDTH) > ADDR_WIDTH - 1) ? $clog2(ADDR_WIDTH) : $clog2(ADDR_WIDTH) + 1
16
)(
17
        input clk, aclr,
18
 
19
        // input data stream
20
        input sink_sop, sink_eop, sink_valid, // valid must be solid
21
        input signed [DATA_WIDTH-1:0] sink_Re, sink_Im,
22
 
23
        // current pow and last addr
24
        input [POW_WIDTH-1:0] pow,
25
        input [ADDR_WIDTH-1:0] addr_max,
26
 
27
        // access to output buffer
28
        input [ADDR_WIDTH-1:0] rdaddr, // read address
29
        output reg signed [DATA_WIDTH-1:0] q_Re, q_Im, // read data
30
        output reg ready, // buffer ready
31
        input rdack, // read data acknowledge
32
 
33
        output reg error // input stream error
34
);
35
        reg wr_buf = 1'b0, rd_buf = 1'b0;
36
        reg signed [DATA_WIDTH-1:0] mem_Re[2][2**ADDR_WIDTH];
37
        reg signed [DATA_WIDTH-1:0] mem_Im[2][2**ADDR_WIDTH];
38
 
39
        wire [ADDR_WIDTH-1:0] wraddr, wraddr_rev;
40
        reg valid_reg = 1'b0, eop_reg = 1'b0;
41
        reg signed [DATA_WIDTH-1:0] Re_reg, Im_reg;
42
 
43
        bitrev_cnt #(.WIDTH(ADDR_WIDTH)) cnt_inst(
44
                .clk, .aclr,
45
                .clk_ena(sink_valid), .sclr(sink_sop),
46
                .width(pow), .cnt_max(addr_max),
47
                .cnt(wraddr), .cnt_rev(wraddr_rev)
48
        );
49
 
50
        always_ff @(posedge clk, posedge aclr)
51
                valid_reg <= (aclr) ? 1'b0 : sink_valid;
52
 
53
        always_ff @(posedge clk) begin
54
                Re_reg <= sink_Re;
55
                Im_reg <= sink_Im;
56
                eop_reg <= sink_eop;
57
 
58
                if (valid_reg) begin
59
                        mem_Re[wr_buf][wraddr_rev] <= Re_reg;
60
                        mem_Im[wr_buf][wraddr_rev] <= Im_reg;
61
                end
62
        end
63
 
64
        always_ff @(posedge clk) begin
65
                q_Re <= mem_Re[rd_buf][rdaddr];
66
                q_Im <= mem_Im[rd_buf][rdaddr];
67
        end
68
 
69
        always_ff @(posedge clk, posedge aclr)
70
                if (aclr)
71
                        ready <= 1'b0;
72
                else if (valid_reg && eop_reg && wraddr == addr_max)
73
                        ready <= 1'b1;
74
                else if (rdack)
75
                        ready <= 1'b0;
76
 
77
        always_ff @(posedge clk, posedge aclr)
78
                if (aclr)
79
                        wr_buf <= 1'b0;
80
                else if (valid_reg && eop_reg && wraddr == addr_max)
81
                        wr_buf <= !wr_buf;
82
 
83
        always_ff @(posedge clk, posedge aclr)
84
                if (aclr)
85
                        rd_buf <= 1'b0;
86
                else if (rdack)
87
                        rd_buf <= !rd_buf;
88
 
89
        always_ff @(posedge clk, posedge aclr)
90
                error <= (aclr) ? 1'b0 : (sink_sop || sink_eop) && !sink_valid || sink_eop && wraddr != addr_max - 1'b1;
91
endmodule :cascade_0
92
 
93
`endif

powered by: WebSVN 2.1.0

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