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

Subversion Repositories sdr_ctrl

[/] [sdr_ctrl/] [trunk/] [rtl/] [core/] [sdrc_core.v] - Blame information for rev 55

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 dinesha
/*********************************************************************
2
 
3
  SDRAM Controller Core File
4
 
5
  This file is part of the sdram controller project
6
  http://www.opencores.org/cores/sdr_ctrl/
7
 
8
  Description: SDRAM Controller Core Module
9
    2 types of SDRAMs are supported, 1Mx16 2 bank, or 4Mx16 4 bank.
10
    This block integrate following sub modules
11
 
12
    sdrc_bs_convert
13 33 dinesha
        convert the system side 32 bit into equvailent 8/16/32 SDR format
14 3 dinesha
    sdrc_req_gen
15
        This module takes requests from the app, chops them to burst booundaries
16
        if wrap=0, decodes the bank and passe the request to bank_ctl
17
   sdrc_xfr_ctl
18
      This module takes requests from sdr_bank_ctl, runs the transfer and
19
      controls data flow to/from the app. At the end of the transfer it issues a
20
      burst terminate if not at the end of a burst and another command to this
21
      bank is not available.
22
 
23
   sdrc_bank_ctl
24
      This module takes requests from sdr_req_gen, checks for page hit/miss and
25
      issues precharge/activate commands and then passes the request to
26
      sdr_xfr_ctl.
27
 
28
 
29
  Assumption: SDRAM Pads should be placed near to this module. else
30
  user should add a FF near the pads
31
 
32
  To Do:
33
    nothing
34
 
35
  Author(s):
36
      - Dinesh Annayya, dinesha@opencores.org
37 44 dinesha
  Version  : 0.0 - 8th Jan 2012
38 16 dinesha
                Initial version with 16/32 Bit SDRAM Support
39 44 dinesha
           : 0.1 - 24th Jan 2012
40 16 dinesha
                 8 Bit SDRAM Support is added
41 44 dinesha
             0.2 - 2nd Feb 2012
42 50 dinesha
                   Improved the command pipe structure to accept up-to
43
                   4 command of different bank.
44
             0.3 - 7th Feb 2012
45
                   Bug fix for parameter defination for request length has changed from 9 to 12
46 3 dinesha
 
47
 
48
 Copyright (C) 2000 Authors and OPENCORES.ORG
49
 
50
 This source file may be used and distributed without
51
 restriction provided that this copyright statement is not
52
 removed from the file and that any derivative work contains
53
 the original copyright notice and the associated disclaimer.
54
 
55
 This source file is free software; you can redistribute it
56
 and/or modify it under the terms of the GNU Lesser General
57
 Public License as published by the Free Software Foundation;
58
 either version 2.1 of the License, or (at your option) any
59
later version.
60
 
61
 This source is distributed in the hope that it will be
62
 useful, but WITHOUT ANY WARRANTY; without even the implied
63
 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
64
 PURPOSE.  See the GNU Lesser General Public License for more
65
 details.
66
 
67
 You should have received a copy of the GNU Lesser General
68
 Public License along with this source; if not, download it
69
 from http://www.opencores.org/lgpl.shtml
70
 
71
*******************************************************************/
72
 
73
 
74 37 dinesha
`include "sdrc_define.v"
75 3 dinesha
module sdrc_core
76
           (
77 4 dinesha
                clk,
78
                pad_clk,
79 3 dinesha
                reset_n,
80
                sdr_width,
81 13 dinesha
                cfg_colbits,
82 3 dinesha
 
83
                /* Request from app */
84
                app_req,                // Transfer Request
85
                app_req_addr,           // SDRAM Address
86
                app_req_len,            // Burst Length (in 16 bit words)
87
                app_req_wrap,           // Wrap mode request (xfr_len = 4)
88
                app_req_wr_n,           // 0 => Write request, 1 => read req
89
                app_req_ack,            // Request has been accepted
90
                cfg_req_depth,          //how many req. buffer should hold
91
 
92
                app_wr_data,
93
                app_wr_en_n,
94 45 dinesha
                app_last_wr,
95
 
96 3 dinesha
                app_rd_data,
97
                app_rd_valid,
98 31 dinesha
                app_last_rd,
99 3 dinesha
                app_wr_next_req,
100
                sdr_init_done,
101
                app_req_dma_last,
102
 
103
                /* Interface to SDRAMs */
104
                sdr_cs_n,
105
                sdr_cke,
106
                sdr_ras_n,
107
                sdr_cas_n,
108
                sdr_we_n,
109
                sdr_dqm,
110
                sdr_ba,
111
                sdr_addr,
112
                pad_sdr_din,
113
                sdr_dout,
114
                sdr_den_n,
115
 
116
                /* Parameters */
117
                cfg_sdr_en,
118
                cfg_sdr_mode_reg,
119
                cfg_sdr_tras_d,
120
                cfg_sdr_trp_d,
121
                cfg_sdr_trcd_d,
122
                cfg_sdr_cas,
123
                cfg_sdr_trcar_d,
124
                cfg_sdr_twr_d,
125
                cfg_sdr_rfsh,
126
                cfg_sdr_rfmax);
127
 
128 55 dinesha
parameter  APP_AW   = 25;  // Application Address Width
129 3 dinesha
parameter  APP_DW   = 32;  // Application Data Width 
130
parameter  APP_BW   = 4;   // Application Byte Width
131
parameter  APP_RW   = 9;   // Application Request Width
132
 
133
parameter  SDR_DW   = 16;  // SDR Data Width 
134
parameter  SDR_BW   = 2;   // SDR Byte Width
135
 
136
 
137
//-----------------------------------------------
138
// Global Variable
139
// ----------------------------------------------
140 4 dinesha
input                   clk                 ; // SDRAM Clock 
141
input                   pad_clk             ; // SDRAM Clock from Pad, used for registering Read Data
142 3 dinesha
input                   reset_n             ; // Reset Signal
143 16 dinesha
input [1:0]             sdr_width           ; // 2'b00 - 32 Bit SDR, 2'b01 - 16 Bit SDR, 2'b1x - 8 Bit
144 13 dinesha
input [1:0]             cfg_colbits         ; // 2'b00 - 8 Bit column address, 2'b01 - 9 Bit, 10 - 10 bit, 11 - 11Bits
145 3 dinesha
 
146 13 dinesha
 
147 3 dinesha
//------------------------------------------------
148
// Request from app
149
//------------------------------------------------
150
input                   app_req             ; // Application Request
151
input [APP_AW-1:0]       app_req_addr        ; // Address 
152
input                   app_req_wr_n        ; // 0 - Write, 1 - Read
153
input                   app_req_wrap        ; // Address Wrap
154
output                  app_req_ack         ; // Application Request Ack
155
 
156
input [APP_DW-1:0]       app_wr_data         ; // Write Data
157
output                  app_wr_next_req     ; // Next Write Data Request
158
input [APP_BW-1:0]       app_wr_en_n         ; // Byte wise Write Enable
159 45 dinesha
output                  app_last_wr         ; // Last Write trannsfer of a given Burst
160 3 dinesha
output [APP_DW-1:0]      app_rd_data         ; // Read Data
161
output                  app_rd_valid        ; // Read Valid
162 31 dinesha
output                  app_last_rd         ; // Last Read Transfer of a given Burst
163 3 dinesha
 
164
//------------------------------------------------
165
// Interface to SDRAMs
166
//------------------------------------------------
167
output                  sdr_cke             ; // SDRAM CKE
168
output                  sdr_cs_n            ; // SDRAM Chip Select
169
output                  sdr_ras_n           ; // SDRAM ras
170
output                  sdr_cas_n           ; // SDRAM cas
171
output                  sdr_we_n            ; // SDRAM write enable
172
output [SDR_BW-1:0]      sdr_dqm             ; // SDRAM Data Mask
173
output [1:0]             sdr_ba              ; // SDRAM Bank Enable
174
output [11:0]            sdr_addr            ; // SDRAM Address
175
input [SDR_DW-1:0]       pad_sdr_din         ; // SDRA Data Input
176
output [SDR_DW-1:0]      sdr_dout            ; // SDRAM Data Output
177
output [SDR_BW-1:0]      sdr_den_n           ; // SDRAM Data Output enable
178
 
179
//------------------------------------------------
180
// Configuration Parameter
181
//------------------------------------------------
182 13 dinesha
output                  sdr_init_done       ; // Indicate SDRAM Initialisation Done
183
input [3:0]              cfg_sdr_tras_d      ; // Active to precharge delay
184
input [3:0]             cfg_sdr_trp_d       ; // Precharge to active delay
185
input [3:0]             cfg_sdr_trcd_d      ; // Active to R/W delay
186
input                   cfg_sdr_en          ; // Enable SDRAM controller
187
input [1:0]              cfg_req_depth       ; // Maximum Request accepted by SDRAM controller
188
input [APP_RW-1:0]       app_req_len         ; // Application Burst Request length in 32 bit 
189 3 dinesha
input [11:0]             cfg_sdr_mode_reg    ;
190 13 dinesha
input [2:0]              cfg_sdr_cas         ; // SDRAM CAS Latency
191
input [3:0]              cfg_sdr_trcar_d     ; // Auto-refresh period
192
input [3:0]             cfg_sdr_twr_d       ; // Write recovery delay
193 3 dinesha
input [`SDR_RFSH_TIMER_W-1 : 0] cfg_sdr_rfsh;
194
input [`SDR_RFSH_ROW_CNT_W -1 : 0] cfg_sdr_rfmax;
195
input                   app_req_dma_last;    // this signal should close the bank
196
 
197
/****************************************************************************/
198
// Internal Nets
199
 
200
// SDR_REQ_GEN
201
wire [`SDR_REQ_ID_W-1:0]r2b_req_id;
202
wire [1:0]               r2b_ba;
203
wire [11:0]              r2b_raddr;
204
wire [11:0]              r2b_caddr;
205 54 dinesha
wire [`REQ_BW-1:0]       r2b_len;
206 3 dinesha
 
207
// SDR BANK CTL
208
wire [`SDR_REQ_ID_W-1:0]b2x_id;
209
wire [1:0]               b2x_ba;
210
wire [11:0]              b2x_addr;
211 54 dinesha
wire [`REQ_BW-1:0]       b2x_len;
212 3 dinesha
wire [1:0]               b2x_cmd;
213
 
214
// SDR_XFR_CTL
215
wire [3:0]               x2b_pre_ok;
216
wire [`SDR_REQ_ID_W-1:0]xfr_id;
217
wire [APP_DW-1:0]        app_rd_data;
218
wire                    sdr_cs_n, sdr_cke, sdr_ras_n, sdr_cas_n, sdr_we_n;
219
wire [SDR_BW-1:0]        sdr_dqm;
220
wire [1:0]               sdr_ba;
221
wire [11:0]              sdr_addr;
222
wire [SDR_DW-1:0]        sdr_dout;
223
wire [SDR_DW-1:0]        sdr_dout_int;
224
wire [SDR_BW-1:0]        sdr_den_n;
225
wire [SDR_BW-1:0]        sdr_den_n_int;
226
 
227
wire [1:0]               xfr_bank_sel;
228
 
229
wire [APP_AW-1:0]        app_req_addr;
230
wire [APP_RW-1:0]        app_req_len;
231
 
232
wire [APP_DW-1:0]        app_wr_data;
233 45 dinesha
wire [SDR_DW-1:0]        a2x_wrdt       ;
234 3 dinesha
wire [APP_BW-1:0]        app_wr_en_n;
235 45 dinesha
wire [SDR_BW-1:0]        a2x_wren_n;
236 3 dinesha
 
237
//wire [31:0] app_rd_data;
238 45 dinesha
wire [SDR_DW-1:0]        x2a_rddt;
239 3 dinesha
 
240
 
241
// synopsys translate_off 
242
   wire [3:0]           sdr_cmd;
243
   assign sdr_cmd = {sdr_cs_n, sdr_ras_n, sdr_cas_n, sdr_we_n};
244
// synopsys translate_on 
245
 
246 45 dinesha
assign sdr_den_n = sdr_den_n_int ;
247
assign sdr_dout  = sdr_dout_int ;
248 3 dinesha
 
249
 
250 23 dinesha
// To meet the timing at read path, read data is registered w.r.t pad_sdram_clock and register back to sdram_clk
251
// assumption, pad_sdram_clk is synhronous and delayed clock of sdram_clk.
252
// register w.r.t pad sdram clk
253
reg [SDR_DW-1:0] pad_sdr_din1;
254
reg [SDR_DW-1:0] pad_sdr_din2;
255
always@(posedge pad_clk) begin
256
   pad_sdr_din1 <= pad_sdr_din;
257
end
258
 
259
always@(posedge clk) begin
260
   pad_sdr_din2 <= pad_sdr_din1;
261
end
262
 
263 45 dinesha
 
264 3 dinesha
   /****************************************************************************/
265
   // Instantiate sdr_req_gen
266
   // This module takes requests from the app, chops them to burst booundaries
267
   // if wrap=0, decodes the bank and passe the request to bank_ctl
268
 
269 9 dinesha
sdrc_req_gen #(.SDR_DW(SDR_DW) , .SDR_BW(SDR_BW)) u_req_gen (
270 4 dinesha
          .clk                (clk          ),
271 3 dinesha
          .reset_n            (reset_n            ),
272 13 dinesha
          .cfg_colbits        (cfg_colbits        ),
273 47 dinesha
          .sdr_width          (sdr_width          ),
274 3 dinesha
 
275 47 dinesha
        /* Req to xfr_ctl */
276
          .r2x_idle           (r2x_idle           ),
277
 
278 3 dinesha
        /* Request from app */
279 45 dinesha
          .req                (app_req            ),
280 3 dinesha
          .req_id             (4'b0               ),
281 45 dinesha
          .req_addr           (app_req_addr       ),
282
          .req_len            (app_req_len        ),
283 3 dinesha
          .req_wrap           (app_req_wrap       ),
284
          .req_wr_n           (app_req_wr_n       ),
285 45 dinesha
          .req_ack            (app_req_ack        ),
286 3 dinesha
 
287
       /* Req to bank_ctl */
288
          .r2b_req            (r2b_req            ),
289
          .r2b_req_id         (r2b_req_id         ),
290
          .r2b_start          (r2b_start          ),
291
          .r2b_last           (r2b_last           ),
292
          .r2b_wrap           (r2b_wrap           ),
293
          .r2b_ba             (r2b_ba             ),
294
          .r2b_raddr          (r2b_raddr          ),
295
          .r2b_caddr          (r2b_caddr          ),
296
          .r2b_len            (r2b_len            ),
297
          .r2b_write          (r2b_write          ),
298
          .b2r_ack            (b2r_ack            ),
299 47 dinesha
          .b2r_arb_ok         (b2r_arb_ok         )
300 3 dinesha
     );
301
 
302
   /****************************************************************************/
303
   // Instantiate sdr_bank_ctl
304
   // This module takes requests from sdr_req_gen, checks for page hit/miss and
305
   // issues precharge/activate commands and then passes the request to
306
   // sdr_xfr_ctl. 
307
 
308 9 dinesha
sdrc_bank_ctl #(.SDR_DW(SDR_DW) ,  .SDR_BW(SDR_BW)) u_bank_ctl (
309 4 dinesha
          .clk                (clk          ),
310 3 dinesha
          .reset_n            (reset_n            ),
311
          .a2b_req_depth      (cfg_req_depth      ),
312
 
313
      /* Req from req_gen */
314
          .r2b_req            (r2b_req            ),
315
          .r2b_req_id         (r2b_req_id         ),
316
          .r2b_start          (r2b_start          ),
317
          .r2b_last           (r2b_last           ),
318
          .r2b_wrap           (r2b_wrap           ),
319
          .r2b_ba             (r2b_ba             ),
320
          .r2b_raddr          (r2b_raddr          ),
321
          .r2b_caddr          (r2b_caddr          ),
322
          .r2b_len            (r2b_len            ),
323
          .r2b_write          (r2b_write          ),
324
          .b2r_arb_ok         (b2r_arb_ok         ),
325
          .b2r_ack            (b2r_ack            ),
326
 
327
      /* Transfer request to xfr_ctl */
328
          .b2x_idle           (b2x_idle           ),
329
          .b2x_req            (b2x_req            ),
330
          .b2x_start          (b2x_start          ),
331
          .b2x_last           (b2x_last           ),
332
          .b2x_wrap           (b2x_wrap           ),
333
          .b2x_id             (b2x_id             ),
334
          .b2x_ba             (b2x_ba             ),
335
          .b2x_addr           (b2x_addr           ),
336
          .b2x_len            (b2x_len            ),
337
          .b2x_cmd            (b2x_cmd            ),
338
          .x2b_ack            (x2b_ack            ),
339
 
340
      /* Status from xfr_ctl */
341
          .b2x_tras_ok        (b2x_tras_ok        ),
342
          .x2b_refresh        (x2b_refresh        ),
343
          .x2b_pre_ok         (x2b_pre_ok         ),
344
          .x2b_act_ok         (x2b_act_ok         ),
345
          .x2b_rdok           (x2b_rdok           ),
346
          .x2b_wrok           (x2b_wrok           ),
347
 
348
      /* for generate cuurent xfr address msb */
349 45 dinesha
          .sdr_req_norm_dma_last(app_req_dma_last),
350 3 dinesha
          .xfr_bank_sel       (xfr_bank_sel       ),
351
 
352
       /* SDRAM Timing */
353
          .tras_delay         (cfg_sdr_tras_d     ),
354
          .trp_delay          (cfg_sdr_trp_d      ),
355
          .trcd_delay         (cfg_sdr_trcd_d     )
356
      );
357
 
358
   /****************************************************************************/
359
   // Instantiate sdr_xfr_ctl
360
   // This module takes requests from sdr_bank_ctl, runs the transfer and
361
   // controls data flow to/from the app. At the end of the transfer it issues a
362
   // burst terminate if not at the end of a burst and another command to this
363
   // bank is not available.
364
 
365 9 dinesha
sdrc_xfr_ctl #(.SDR_DW(SDR_DW) ,  .SDR_BW(SDR_BW)) u_xfr_ctl (
366 4 dinesha
          .clk                (clk          ),
367 3 dinesha
          .reset_n            (reset_n            ),
368
 
369
      /* Transfer request from bank_ctl */
370
          .r2x_idle           (r2x_idle           ),
371
          .b2x_idle           (b2x_idle           ),
372
          .b2x_req            (b2x_req            ),
373
          .b2x_start          (b2x_start          ),
374
          .b2x_last           (b2x_last           ),
375
          .b2x_wrap           (b2x_wrap           ),
376
          .b2x_id             (b2x_id             ),
377
          .b2x_ba             (b2x_ba             ),
378
          .b2x_addr           (b2x_addr           ),
379
          .b2x_len            (b2x_len            ),
380
          .b2x_cmd            (b2x_cmd            ),
381
          .x2b_ack            (x2b_ack            ),
382
 
383
       /* Status to bank_ctl, req_gen */
384
          .b2x_tras_ok        (b2x_tras_ok        ),
385
          .x2b_refresh        (x2b_refresh        ),
386
          .x2b_pre_ok         (x2b_pre_ok         ),
387
          .x2b_act_ok         (x2b_act_ok         ),
388
          .x2b_rdok           (x2b_rdok           ),
389
          .x2b_wrok           (x2b_wrok           ),
390
 
391
       /* SDRAM I/O */
392
          .sdr_cs_n           (sdr_cs_n           ),
393
          .sdr_cke            (sdr_cke            ),
394
          .sdr_ras_n          (sdr_ras_n          ),
395
          .sdr_cas_n          (sdr_cas_n          ),
396
          .sdr_we_n           (sdr_we_n           ),
397
          .sdr_dqm            (sdr_dqm            ),
398
          .sdr_ba             (sdr_ba             ),
399
          .sdr_addr           (sdr_addr           ),
400 23 dinesha
          .sdr_din            (pad_sdr_din2       ),
401 3 dinesha
          .sdr_dout           (sdr_dout_int       ),
402
          .sdr_den_n          (sdr_den_n_int      ),
403
      /* Data Flow to the app */
404 45 dinesha
          .x2a_rdstart        (x2a_rdstart        ),
405
          .x2a_wrstart        (x2a_wrstart        ),
406 3 dinesha
          .x2a_id             (xfr_id             ),
407 44 dinesha
          .x2a_rdlast         (x2a_rdlast         ),
408 45 dinesha
          .x2a_wrlast         (x2a_wrlast         ),
409
          .a2x_wrdt           (a2x_wrdt           ),
410
          .a2x_wren_n         (a2x_wren_n         ),
411
          .x2a_wrnext         (x2a_wrnext         ),
412
          .x2a_rddt           (x2a_rddt           ),
413
          .x2a_rdok           (x2a_rdok           ),
414 3 dinesha
          .sdr_init_done      (sdr_init_done      ),
415
 
416
      /* SDRAM Parameters */
417
          .sdram_enable       (cfg_sdr_en         ),
418
          .sdram_mode_reg     (cfg_sdr_mode_reg   ),
419
 
420
      /* current xfr bank */
421
          .xfr_bank_sel       (xfr_bank_sel       ),
422
 
423
      /* SDRAM Timing */
424
          .cas_latency        (cfg_sdr_cas        ),
425
          .trp_delay          (cfg_sdr_trp_d      ),
426
          .trcar_delay        (cfg_sdr_trcar_d    ),
427
          .twr_delay          (cfg_sdr_twr_d      ),
428
          .rfsh_time          (cfg_sdr_rfsh       ),
429
          .rfsh_rmax          (cfg_sdr_rfmax      )
430
    );
431
 
432 33 dinesha
   /****************************************************************************/
433
   // Instantiate sdr_bs_convert
434
   //    This model handle the bus with transaltion from application layer to
435
   //       8/16/32 SDRAM Memory format
436
   //     During Write Phase, this block split the data as per SDRAM Width
437
   //     During Read Phase, This block does the re-packing based on SDRAM
438
   //     Width
439
   //---------------------------------------------------------------------------
440 9 dinesha
sdrc_bs_convert #(.SDR_DW(SDR_DW) ,  .SDR_BW(SDR_BW)) u_bs_convert (
441 4 dinesha
          .clk                (clk          ),
442 3 dinesha
          .reset_n            (reset_n            ),
443
          .sdr_width          (sdr_width          ),
444
 
445 44 dinesha
   /* Control Signal from xfr ctrl */
446 45 dinesha
          // Read Interface Inputs
447
          .x2a_rdstart        (x2a_rdstart        ),
448 44 dinesha
          .x2a_rdlast         (x2a_rdlast         ),
449 45 dinesha
          .x2a_rdok           (x2a_rdok           ),
450
          // Read Interface outputs
451
          .x2a_rddt           (x2a_rddt           ),
452 44 dinesha
 
453 45 dinesha
          // Write Interface, Inputs
454
          .x2a_wrstart        (x2a_wrstart        ),
455
          .x2a_wrlast         (x2a_wrlast         ),
456
          .x2a_wrnext         (x2a_wrnext         ),
457 44 dinesha
 
458 45 dinesha
          // Write Interface, Outputs
459
          .a2x_wrdt           (a2x_wrdt           ),
460
          .a2x_wren_n         (a2x_wren_n         ),
461 44 dinesha
 
462 45 dinesha
   /* Control Signal from sdrc_bank_ctl  */
463
 
464 44 dinesha
   /*  Control Signal from/to to application i/f  */
465 3 dinesha
          .app_wr_data        (app_wr_data        ),
466
          .app_wr_en_n        (app_wr_en_n        ),
467
          .app_wr_next        (app_wr_next_req    ),
468 45 dinesha
          .app_last_wr        (app_last_wr        ),
469 3 dinesha
          .app_rd_data        (app_rd_data        ),
470 45 dinesha
          .app_rd_valid       (app_rd_valid       ),
471
          .app_last_rd        (app_last_rd        )
472 44 dinesha
 
473 3 dinesha
       );
474
 
475
endmodule // sdrc_core

powered by: WebSVN 2.1.0

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