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

Subversion Repositories wb2axip

[/] [wb2axip/] [trunk/] [rtl/] [migsdram.v] - Blame information for rev 16

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 dgisselq
////////////////////////////////////////////////////////////////////////////////
2
//
3
// Filename:    migsdram.v
4
//
5
// Project:     Pipelined Wishbone to AXI converter
6
//
7
// Purpose:     This file isn't really a part of the synthesis implementation 
8
//              of the wb2axip project itself, but rather it is an example
9
//      of how the wb2axip project can be used to connect a MIG generated
10
//      IP component.
11
//
12 8 dgisselq
//      This implementation depends upon the existence of a MIG generated
13
//      core, named "mig_axis", and illustrates how such a core might be
14
//      connected to the wbm2axip bridge.  Specific options of the mig_axis
15
//      setup include 6 identifier bits, and a full-sized bus width of 128
16
//      bits.   These two settings are both appropriate for driving a DDR3
17
//      memory (whose minimum transfer size is 128 bits), but may need to be
18
//      adjusted to support other memories.
19
//
20 6 dgisselq
// Creator:     Dan Gisselquist, Ph.D.
21
//              Gisselquist Technology, LLC
22
//
23
////////////////////////////////////////////////////////////////////////////////
24
//
25 8 dgisselq
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
26 6 dgisselq
//
27 16 dgisselq
// This file is part of the pipelined Wishbone to AXI converter project, a
28
// project that contains multiple bus bridging designs and formal bus property
29
// sets.
30 6 dgisselq
//
31 16 dgisselq
// The bus bridge designs and property sets are free RTL designs: you can
32
// redistribute them and/or modify any of them under the terms of the GNU
33
// Lesser General Public License as published by the Free Software Foundation,
34
// either version 3 of the License, or (at your option) any later version.
35 6 dgisselq
//
36 16 dgisselq
// The bus bridge designs and property sets are distributed in the hope that
37
// they will be useful, but WITHOUT ANY WARRANTY; without even the implied
38
// warranty of MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
39
// GNU Lesser General Public License for more details.
40
//
41
// You should have received a copy of the GNU Lesser General Public License
42
// along with these designs.  (It's in the $(ROOT)/doc directory.  Run make
43
// with no target there if the PDF file isn't present.)  If not, see
44 6 dgisselq
// <http://www.gnu.org/licenses/> for a copy.
45
//
46 16 dgisselq
// License:     LGPL, v3, as defined and found on www.gnu.org,
47
//              http://www.gnu.org/licenses/lgpl.html
48 6 dgisselq
//
49
////////////////////////////////////////////////////////////////////////////////
50
//
51
//
52 8 dgisselq
`default_nettype        none
53
//
54 6 dgisselq
module  migsdram(i_clk, i_clk_200mhz, o_sys_clk, i_rst, o_sys_reset,
55
        // Wishbone components
56
                i_wb_cyc, i_wb_stb, i_wb_we, i_wb_addr, i_wb_data, i_wb_sel,
57
                o_wb_ack, o_wb_stall, o_wb_data, o_wb_err,
58
        // SDRAM connections
59
                o_ddr_ck_p, o_ddr_ck_n,
60
                o_ddr_reset_n, o_ddr_cke,
61
                o_ddr_cs_n, o_ddr_ras_n, o_ddr_cas_n, o_ddr_we_n,
62
                o_ddr_ba, o_ddr_addr,
63
                o_ddr_odt, o_ddr_dm,
64
                io_ddr_dqs_p, io_ddr_dqs_n,
65
                io_ddr_data
66
        );
67
        parameter       DDRWIDTH = 16, WBDATAWIDTH=32;
68
        parameter       AXIDWIDTH = 6;
69
        // The SDRAM address bits (RAMABITS) are a touch more difficult to work
70
        // out.  Here we leave them as a fixed parameter, but there are 
71
        // consequences to this.  Specifically, the wishbone data width, the
72
        // wishbone address width, and this number have interactions not
73
        // well captured here.
74
        parameter       RAMABITS = 28;
75
        // All DDR3 memories have 8 timeslots.  This, if the DDR3 memory
76
        // has 16 bits to it (as above), the entire transaction must take
77
        // AXIWIDTH bits ...
78
        localparam      AXIWIDTH= DDRWIDTH *8;
79
        localparam      DW=WBDATAWIDTH;
80
        localparam      AW=(WBDATAWIDTH==32)? RAMABITS-2
81
                                :((WBDATAWIDTH==64) ? RAMABITS-3
82
                                :((WBDATAWIDTH==128) ? RAMABITS-4
83
                                : RAMABITS-5)); // (WBDATAWIDTH==256)
84
        localparam      SELW= (WBDATAWIDTH/8);
85
        //
86 8 dgisselq
        input   wire            i_clk, i_clk_200mhz, i_rst;
87
        output  wire            o_sys_clk;
88 6 dgisselq
        output  reg             o_sys_reset;
89
        //
90 8 dgisselq
        input   wire            i_wb_cyc, i_wb_stb, i_wb_we;
91
        input   wire    [(AW-1):0]       i_wb_addr;
92
        input   wire    [(DW-1):0]       i_wb_data;
93
        input   wire    [(SELW-1):0]     i_wb_sel;
94 6 dgisselq
        output  wire                    o_wb_ack, o_wb_stall;
95
        output  wire    [(DW-1):0]       o_wb_data;
96
        output  wire                    o_wb_err;
97
        //
98
        output  wire    [0:0]             o_ddr_ck_p, o_ddr_ck_n;
99
        output  wire    [0:0]             o_ddr_cke;
100
        output  wire                    o_ddr_reset_n,
101
                                        o_ddr_ras_n, o_ddr_cas_n, o_ddr_we_n;
102
        output  wire    [0:0]                     o_ddr_cs_n;
103
        output  wire    [2:0]                    o_ddr_ba;
104
        output  wire    [13:0]                   o_ddr_addr;
105
        output  wire    [0:0]                     o_ddr_odt;
106
        output  wire    [(DDRWIDTH/8-1):0]       o_ddr_dm;
107
        inout   wire    [1:0]                    io_ddr_dqs_p, io_ddr_dqs_n;
108
        inout   wire    [(DDRWIDTH-1):0] io_ddr_data;
109
 
110
 
111
`define SDRAM_ACCESS
112
`ifdef  SDRAM_ACCESS
113
 
114
        wire    aresetn;
115
        assign  aresetn = 1'b1; // Never reset
116
 
117
        // Write address channel
118
        wire    [(AXIDWIDTH-1):0]        s_axi_awid;
119
        wire    [(RAMABITS-1):0] s_axi_awaddr;
120
        wire    [7:0]                    s_axi_awlen;
121
        wire    [2:0]                    s_axi_awsize;
122
        wire    [1:0]                    s_axi_awburst;
123
        wire    [0:0]                     s_axi_awlock;
124
        wire    [3:0]                    s_axi_awcache;
125
        wire    [2:0]                    s_axi_awprot;
126
        wire    [3:0]                    s_axi_awqos;
127
        wire                            s_axi_awvalid;
128
        wire                            s_axi_awready;
129
        // Writei data channel
130
        wire    [(AXIWIDTH-1):0] s_axi_wdata;
131
        wire    [(AXIWIDTH/8-1):0]       s_axi_wstrb;
132
        wire                            s_axi_wlast, s_axi_wvalid, s_axi_wready;
133
        // Write response channel
134
        wire                            s_axi_bready;
135
        wire    [(AXIDWIDTH-1):0]        s_axi_bid;
136
        wire    [1:0]                    s_axi_bresp;
137
        wire                            s_axi_bvalid;
138
 
139
        // Read address channel
140
        wire    [(AXIDWIDTH-1):0]        s_axi_arid;
141
        wire    [(RAMABITS-1):0] s_axi_araddr;
142
        wire    [7:0]                    s_axi_arlen;
143
        wire    [2:0]                    s_axi_arsize;
144
        wire    [1:0]                    s_axi_arburst;
145
        wire    [0:0]                     s_axi_arlock;
146
        wire    [3:0]                    s_axi_arcache;
147
        wire    [2:0]                    s_axi_arprot;
148
        wire    [3:0]                    s_axi_arqos;
149
        wire                            s_axi_arvalid;
150 8 dgisselq
        wire                            s_axi_arready;
151 6 dgisselq
        // Read response/data channel
152
        wire    [(AXIDWIDTH-1):0]        s_axi_rid;
153
        wire    [(AXIWIDTH-1):0] s_axi_rdata;
154
        wire    [1:0]                    s_axi_rresp;
155
        wire                            s_axi_rlast;
156
        wire                            s_axi_rvalid;
157 8 dgisselq
        wire                            s_axi_rready;
158 6 dgisselq
 
159
        // Other wires ...
160
        wire            init_calib_complete, mmcm_locked;
161
        wire            app_sr_active, app_ref_ack, app_zq_ack;
162
        wire            app_sr_req, app_ref_req, app_zq_req;
163
        wire            w_sys_reset;
164
        wire    [11:0]   w_device_temp;
165
 
166
 
167
        mig_axis        mig_sdram(
168
                .ddr3_ck_p(o_ddr_ck_p),         .ddr3_ck_n(o_ddr_ck_n),
169
                .ddr3_reset_n(o_ddr_reset_n),   .ddr3_cke(o_ddr_cke),
170
                .ddr3_cs_n(o_ddr_cs_n),         .ddr3_ras_n(o_ddr_ras_n),
171
                .ddr3_we_n(o_ddr_we_n),         .ddr3_cas_n(o_ddr_cas_n),
172
                .ddr3_ba(o_ddr_ba),             .ddr3_addr(o_ddr_addr),
173
                .ddr3_odt(o_ddr_odt),
174
                .ddr3_dqs_p(io_ddr_dqs_p),      .ddr3_dqs_n(io_ddr_dqs_n),
175
                .ddr3_dq(io_ddr_data),          .ddr3_dm(o_ddr_dm),
176
                //
177
                .sys_clk_i(i_clk),
178
                .clk_ref_i(i_clk_200mhz),
179
                .ui_clk(o_sys_clk),
180
                .ui_clk_sync_rst(w_sys_reset),
181
                .mmcm_locked(mmcm_locked),
182
                .aresetn(aresetn),
183
                .app_sr_req(1'b0),
184
                .app_ref_req(1'b0),
185
                .app_zq_req(1'b0),
186
                .app_sr_active(app_sr_active),
187
                .app_ref_ack(app_ref_ack),
188
                .app_zq_ack(app_zq_ack),
189
                //
190
                .s_axi_awid(s_axi_awid),        .s_axi_awaddr(s_axi_awaddr),
191
                .s_axi_awlen(s_axi_awlen),      .s_axi_awsize(s_axi_awsize),
192
                .s_axi_awburst(s_axi_awburst),  .s_axi_awlock(s_axi_awlock),
193
                .s_axi_awcache(s_axi_awcache),  .s_axi_awprot(s_axi_awprot),
194
                .s_axi_awqos(s_axi_awqos),      .s_axi_awvalid(s_axi_awvalid),
195
                .s_axi_awready(s_axi_awready),
196
                //
197
                .s_axi_wready(  s_axi_wready),
198
                .s_axi_wdata(   s_axi_wdata),
199
                .s_axi_wstrb(   s_axi_wstrb),
200
                .s_axi_wlast(   s_axi_wlast),
201
                .s_axi_wvalid(  s_axi_wvalid),
202
                //
203
                .s_axi_bready(s_axi_bready),    .s_axi_bid(s_axi_bid),
204
                .s_axi_bresp(s_axi_bresp),      .s_axi_bvalid(s_axi_bvalid),
205
                //
206
                .s_axi_arid(s_axi_arid),        .s_axi_araddr(s_axi_araddr),
207
                .s_axi_arlen(s_axi_arlen),      .s_axi_arsize(s_axi_arsize),
208
                .s_axi_arburst(s_axi_arburst),  .s_axi_arlock(s_axi_arlock),
209
                .s_axi_arcache(s_axi_arcache),  .s_axi_arprot(s_axi_arprot),
210
                .s_axi_arqos(s_axi_arqos),      .s_axi_arvalid(s_axi_arvalid),
211
                .s_axi_arready(s_axi_arready),
212
                // 
213
                .s_axi_rready(s_axi_rready),    .s_axi_rid(s_axi_rid),
214
                .s_axi_rdata(s_axi_rdata),      .s_axi_rresp(s_axi_rresp),
215
                .s_axi_rlast(s_axi_rlast),      .s_axi_rvalid(s_axi_rvalid),
216
                .init_calib_complete(init_calib_complete),
217
                .sys_rst(i_rst),
218
                .device_temp(w_device_temp)
219
                );
220
 
221
        wbm2axisp       #(
222
                        .C_AXI_ID_WIDTH(AXIDWIDTH),
223
                        .C_AXI_DATA_WIDTH(AXIWIDTH),
224
                        .C_AXI_ADDR_WIDTH(RAMABITS),
225
                        .AW(AW), .DW(DW)
226
                        )
227
                        bus_translator(
228
                                .i_clk(o_sys_clk),
229
                                // .i_reset(i_rst), // internally unused
230
                                // Write address channel signals
231
                                .o_axi_awid(    s_axi_awid),
232
                                .o_axi_awaddr(  s_axi_awaddr),
233
                                .o_axi_awlen(   s_axi_awlen),
234
                                .o_axi_awsize(  s_axi_awsize),
235
                                .o_axi_awburst( s_axi_awburst),
236
                                .o_axi_awlock(  s_axi_awlock),
237
                                .o_axi_awcache( s_axi_awcache),
238
                                .o_axi_awprot(  s_axi_awprot),  // s_axi_awqos
239
                                .o_axi_awqos(   s_axi_awqos),  // s_axi_awqos
240
                                .o_axi_awvalid( s_axi_awvalid),
241
                                .i_axi_awready( s_axi_awready),
242
                        //
243
                                .i_axi_wready(  s_axi_wready),
244
                                .o_axi_wdata(   s_axi_wdata),
245
                                .o_axi_wstrb(   s_axi_wstrb),
246
                                .o_axi_wlast(   s_axi_wlast),
247
                                .o_axi_wvalid(  s_axi_wvalid),
248
                        //
249
                                .o_axi_bready(  s_axi_bready),
250
                                .i_axi_bid(     s_axi_bid),
251
                                .i_axi_bresp(   s_axi_bresp),
252
                                .i_axi_bvalid(  s_axi_bvalid),
253
                        //
254
                                .i_axi_arready( s_axi_arready),
255
                                .o_axi_arid(    s_axi_arid),
256
                                .o_axi_araddr(  s_axi_araddr),
257
                                .o_axi_arlen(   s_axi_arlen),
258
                                .o_axi_arsize(  s_axi_arsize),
259
                                .o_axi_arburst( s_axi_arburst),
260
                                .o_axi_arlock(  s_axi_arlock),
261
                                .o_axi_arcache( s_axi_arcache),
262
                                .o_axi_arprot(  s_axi_arprot),
263
                                .o_axi_arqos(   s_axi_arqos),
264
                                .o_axi_arvalid( s_axi_arvalid),
265
                        //
266
                                .o_axi_rready(  s_axi_rready),
267
                                .i_axi_rid(     s_axi_rid),
268
                                .i_axi_rdata(   s_axi_rdata),
269
                                .i_axi_rresp(   s_axi_rresp),
270
                                .i_axi_rlast(   s_axi_rlast),
271
                                .i_axi_rvalid(  s_axi_rvalid),
272
                        //
273
                                .i_wb_cyc(      i_wb_cyc),
274
                                .i_wb_stb(      i_wb_stb),
275
                                .i_wb_we(       i_wb_we),
276
                                .i_wb_addr(     i_wb_addr),
277
                                .i_wb_data(     i_wb_data),
278
                                .i_wb_sel(      i_wb_sel),
279
                        //
280
                                .o_wb_ack(      o_wb_ack),
281
                                .o_wb_stall(    o_wb_stall),
282
                                .o_wb_data(     o_wb_data),
283
                                .o_wb_err(      o_wb_err)
284
                );
285
 
286
        // Convert from active low to active high, *and* hold the system in
287
        // reset until the memory comes up.     
288
        initial o_sys_reset = 1'b1;
289
        always @(posedge o_sys_clk)
290
                o_sys_reset <= (!w_sys_reset)
291
                                ||(!init_calib_complete)
292
                                ||(!mmcm_locked);
293
`else
294
        BUFG    sysclk(i_clk, o_sys_clk);
295
        initial o_sys_reset <= 1'b1;
296
        always  @(posedge i_clk)
297
                o_sys_reset <= 1'b1;
298
 
299
        OBUFDS ckobuf(.I(i_clk), .O(o_ddr_ck_p), .OB(o_ddr_ck_n));
300
 
301
        assign  o_ddr_reset_n   = 1'b0;
302
        assign  o_ddr_cke[0]     = 1'b0;
303
        assign  o_ddr_cs_n[0]    = 1'b1;
304
        assign  o_ddr_cas_n     = 1'b1;
305
        assign  o_ddr_ras_n     = 1'b1;
306
        assign  o_ddr_we_n      = 1'b1;
307
        assign  o_ddr_ba        = 3'h0;
308
        assign  o_ddr_addr      = 14'h00;
309
        assign  o_ddr_dm        = 2'b00;
310
        assign  io_ddr_data     = 16'h0;
311
 
312
        OBUFDS  dqsbufa(.I(i_clk), .O(io_ddr_dqs_p[1]), .OB(io_ddr_dqs_n[1]));
313
        OBUFDS  dqsbufb(.I(i_clk), .O(io_ddr_dqs_p[0]), .OB(io_ddr_dqs_n[0]));
314
 
315
`endif
316
 
317
endmodule
318
 
319
 

powered by: WebSVN 2.1.0

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