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

Subversion Repositories ddr3_sdram

[/] [ddr3_sdram/] [trunk/] [adapter.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 eschabor
/*
2
        MicroBlaze MCS to DDR3 glue
3
        (C) Copyright 2012 Silicon On Inspiration
4
        www.sioi.com.au
5
        86 Longueville Road
6
        Lane Cove 2066
7
        New South Wales
8
        AUSTRALIA
9
 
10
    This program is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU Lesser General Public License as published by
12
    the Free Software Foundation, either version 3 of the License, or
13
    (at your option) any later version.
14
 
15
    This program is distributed in the hope that it will be useful,
16
    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU Lesser General Public License for more details.
19
 
20
    You should have received a copy of the GNU Lesser General Public License
21
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
*/
23
 
24
`timescale 1ns / 1ps
25
 
26
module adapter
27
(
28
        input                           ckmb,
29
        input                           ckdr,
30
        input                           reset,
31
 
32
        output                          srd,
33
        output                          swr,
34
        output  [33:5]          sa,
35
        output  [255:0]          swdat,
36
        output  [31:0]           smsk,
37
        input   [255:0]          srdat,
38
        input                           srdy,
39
 
40
        output                          IO_Ready,
41
        input                           IO_Addr_Strobe,
42
        input                           IO_Read_Strobe,
43
        input                           IO_Write_Strobe,
44
        output  [31 : 0] IO_Read_Data,
45
        input   [31 : 0]         IO_Address,
46
        input   [3 : 0]  IO_Byte_Enable,
47
        input   [31 : 0]         IO_Write_Data,
48
        input   [3 : 0]  page,
49
        input   [2:0]            dbg_out
50
);
51
 
52
reg             [31 : 0] rdat;
53
reg             [255 : 0]        wdat;
54
reg             [31 : 0] msk;
55
reg             [33 : 2]        addr;
56
reg                                             rdy1;
57
reg                                             rdy2;
58
reg                                             read;
59
reg                                             write;
60
 
61
wire            [31:0]           iowd;
62
wire            [3:0]            mask;
63
 
64
parameter                               BADBAD = 256'hBAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0BAD0;
65
 
66
always @ (posedge ckmb) begin
67
 
68
        if (IO_Addr_Strobe && IO_Write_Strobe) begin
69
                case (IO_Address[4:2])
70
                        0:       wdat[31:0] <= iowd;
71
                        1:      wdat[63:32] <= iowd;
72
                        2:      wdat[95:64] <= iowd;
73
                        3:      wdat[127:96] <= iowd;
74
                        4:      wdat[159:128] <= iowd;
75
                        5:      wdat[191:160] <= iowd;
76
                        6:      wdat[223:192] <= iowd;
77
                        7:      wdat[255:224] <= iowd;
78
 
79
// BADBAD markers for bebugging byte masking
80
// NB: This approach breaks the per-pin IODELAY2 software adjustment on the DQ lines
81
//                      0:      wdat <= {BADBAD[255:32], iowd};
82
//                      1:      wdat <= {BADBAD[255:64], iowd, BADBAD[31:0]};
83
//                      2:      wdat <= {BADBAD[255:96], iowd, BADBAD[63:0]};
84
//                      3:      wdat <= {BADBAD[255:128], iowd, BADBAD[95:0]};
85
//                      4:      wdat <= {BADBAD[255:160], iowd, BADBAD[127:0]};
86
//                      5:      wdat <= {BADBAD[255:192], iowd, BADBAD[159:0]};
87
//                      6:      wdat <= {BADBAD[255:224], iowd, BADBAD[191:0]};
88
//                      7:      wdat <= {iowd, BADBAD[223:0]};
89
                endcase
90
 
91
                case (IO_Address[4:2])
92
 
93
                        0:       msk <= {28'hFFFFFFF, mask};
94
                        1:      msk <= {24'hFFFFFF, mask, 4'hF};
95
                        2:      msk <= {20'hFFFFF, mask, 8'hFF};
96
                        3:      msk <= {16'hFFFF, mask, 12'hFFF};
97
                        4:      msk <= {12'hFFF, mask, 16'hFFFF};
98
                        5:      msk <= {8'hFF, mask, 20'hFFFFF};
99
                        6:      msk <= {4'hF, mask, 24'hFFFFFF};
100
                        7:      msk <= {mask, 28'hFFFFFFF};
101
/*
102
ZZ - write full 256 bits during testing !
103
                        0:      msk <= {28'h0000000, mask};
104
                        1:      msk <= {24'h000000, mask, 4'h0};
105
                        2:      msk <= {20'h00000, mask, 8'h00};
106
                        3:      msk <= {16'h0000, mask, 12'h000};
107
                        4:      msk <= {12'h000, mask, 16'h0000};
108
                        5:      msk <= {8'h00, mask, 20'h00000};
109
                        6:      msk <= {4'h0, mask, 24'h000000};
110
                        7:      msk <= {mask, 28'h0000000};
111
*/
112
                endcase
113
        end
114
 
115
        if (IO_Addr_Strobe)
116
                addr <= {page[3:0], IO_Address[29:2]};
117
end
118
 
119
always @ (posedge ckmb or posedge reset) begin
120
        if (reset) begin
121
                read            <= 1'b0;
122
                write           <= 1'b0;
123
                rdy2            <= 1'b0;
124
        end     else begin
125
                if (IO_Addr_Strobe && IO_Read_Strobe)
126
                        read    <= 1'b1;
127
                else if (IO_Addr_Strobe && IO_Write_Strobe)
128
                        write   <= 1'b1;
129
                if (rdy1) begin
130
                        read    <= 1'b0;
131
                        write   <= 1'b0;
132
                        rdy2    <= 1'b1;
133
                end
134
                if (rdy2)
135
                        rdy2    <= 1'b0;
136
        end
137
end
138
 
139
always @ (posedge ckdr or posedge reset) begin
140
        if (reset) begin
141
                rdy1            <= 1'b0;
142
        end     else begin
143
                if (srdy)
144
                        rdy1    <= 1'b1;
145
                if (rdy2)
146
                        rdy1    <= 1'b0;
147
                if (srdy) case (addr[4:2])
148
                        0:       rdat <= srdat[31:0];
149
                        1:      rdat <= srdat[63:32];
150
                        2:      rdat <= srdat[95:64];
151
                        3:      rdat <= srdat[127:96];
152
                        4:      rdat <= srdat[159:128];
153
                        5:      rdat <= srdat[191:160];
154
                        6:      rdat <= srdat[223:192];
155
                        7:      rdat <= srdat[255:224];
156
                endcase
157
        end
158
end
159
 
160
assign iowd                     = IO_Write_Data;
161
assign mask                     = ~IO_Byte_Enable;
162
 
163
assign IO_Read_Data             = rdat;
164
assign IO_Ready                 = rdy2;
165
assign srd                              = read;
166
assign swr                              = write;
167
assign swdat                    = wdat;
168
assign smsk                             = msk;
169
assign sa                               = addr[33:5];
170
 
171
endmodule
172
 

powered by: WebSVN 2.1.0

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