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

Subversion Repositories fft2_size

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 Papayaved
`ifndef _cascade_0_
2
`define _cascade_0_
3
`include "bitrev.sv"
4
 
5
module cascade_0 #(parameter
6
        ADDR_WIDTH = 9,
7
        DATA_WIDTH = 32
8
)(
9
        input clk, aclr, sink_sop, sink_eop, sink_valid,
10
        input signed [DATA_WIDTH-1:0] sink_Re, sink_Im,
11
 
12
        input [ADDR_WIDTH-1:0] source_rdaddr,
13
        output reg signed [DATA_WIDTH-1:0] source_Re, source_Im,
14
        output reg source_ready,
15
        input source_rdack,
16
        output reg error
17
);
18
        reg wr_buf = 1'b0, rd_buf = 1'b0;
19
        reg signed [DATA_WIDTH-1:0] mem_Re[2][2**ADDR_WIDTH];
20
        reg signed [DATA_WIDTH-1:0] mem_Im[2][2**ADDR_WIDTH];
21
 
22
        reg [ADDR_WIDTH-1:0] wraddr = '0;
23
        wire [ADDR_WIDTH-1:0] wraddr_rev;
24
        reg valid_reg = 1'b0, eop_reg = 1'b0;
25
        reg signed [DATA_WIDTH-1:0] Re_reg, Im_reg;
26
 
27
        always_ff @(posedge clk, posedge aclr)
28
                if (aclr)
29
                        wraddr <= '0;
30
                else if (sink_valid)
31
                        if (sink_sop)
32
                                wraddr <= '0;
33
                        else if (wraddr != 2**ADDR_WIDTH - 1)
34
                                wraddr <= wraddr + 1'b1;
35
 
36
        bitrev #(.WIDTH(ADDR_WIDTH)) bitrev_inst(.x(wraddr), .y(wraddr_rev));
37
 
38
        always_ff @(posedge clk, posedge aclr) begin
39
                valid_reg <= (aclr) ? 1'b0 : sink_valid;
40
                eop_reg <= (aclr) ? 1'b0 : sink_eop;
41
        end
42
 
43
        always_ff @(posedge clk) begin
44
                Re_reg <= sink_Re;
45
                Im_reg <= sink_Im;
46
 
47
                if (valid_reg) begin
48
                        mem_Re[wr_buf][wraddr_rev] <= Re_reg;
49
                        mem_Im[wr_buf][wraddr_rev] <= Im_reg;
50
                end
51
        end
52
 
53
        always_ff @(posedge clk) begin
54
                source_Re <= mem_Re[rd_buf][source_rdaddr];
55
                source_Im <= mem_Im[rd_buf][source_rdaddr];
56
        end
57
 
58
        always_ff @(posedge clk, posedge aclr)
59
                if (aclr)
60
                        source_ready <= 1'b0;
61
                else if (valid_reg && eop_reg && wraddr == {ADDR_WIDTH{1'b1}})
62
                        source_ready <= 1'b1;
63
                else if (source_rdack)
64
                        source_ready <= 1'b0;
65
 
66
        always_ff @(posedge clk, posedge aclr)
67
                if (aclr)
68
                        wr_buf <= 1'b0;
69
                else if (valid_reg && eop_reg && wraddr == {ADDR_WIDTH{1'b1}})
70
                        wr_buf <= !wr_buf;
71
 
72
        always_ff @(posedge clk, posedge aclr)
73
                if (aclr)
74
                        rd_buf <= 1'b0;
75
                else if (source_rdack)
76
                        rd_buf <= !rd_buf;
77
 
78
        always_ff @(posedge clk, posedge aclr)
79
                error <= (aclr) ? 1'b0 : (sink_sop || sink_eop) && !sink_valid || sink_eop && wraddr != {ADDR_WIDTH{1'b1}} - 1'b1;
80
endmodule :cascade_0
81
 
82
`endif

powered by: WebSVN 2.1.0

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