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

Subversion Repositories sdr_ctrl

[/] [sdr_ctrl/] [trunk/] [rtl/] [core/] [sdrc_bank_ctl.v] - Blame information for rev 4

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

Line No. Rev Author Line
1 3 dinesha
/*********************************************************************
2
 
3
  SDRAM Controller Bank Controller
4
 
5
  This file is part of the sdram controller project
6
  http://www.opencores.org/cores/sdr_ctrl/
7
 
8
  Description:
9
    This module takes requests from sdrc_req_gen, checks for page hit/miss and
10
    issues precharge/activate commands and then passes the request to sdrc_xfr_ctl.
11
 
12
  To Do:
13
    nothing
14
 
15
  Author(s):
16
      - Dinesh Annayya, dinesha@opencores.org
17
  Version  :  1.0  - 8th Jan 2012
18
 
19
 
20
 
21
 Copyright (C) 2000 Authors and OPENCORES.ORG
22
 
23
 This source file may be used and distributed without
24
 restriction provided that this copyright statement is not
25
 removed from the file and that any derivative work contains
26
 the original copyright notice and the associated disclaimer.
27
 
28
 This source file is free software; you can redistribute it
29
 and/or modify it under the terms of the GNU Lesser General
30
 Public License as published by the Free Software Foundation;
31
 either version 2.1 of the License, or (at your option) any
32
later version.
33
 
34
 This source is distributed in the hope that it will be
35
 useful, but WITHOUT ANY WARRANTY; without even the implied
36
 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
37
 PURPOSE.  See the GNU Lesser General Public License for more
38
 details.
39
 
40
 You should have received a copy of the GNU Lesser General
41
 Public License along with this source; if not, download it
42
 from http://www.opencores.org/lgpl.shtml
43
 
44
*******************************************************************/
45
 
46
 
47
`include "sdrc.def"
48
 
49
module sdrc_bank_ctl (clk,
50
                     reset_n,
51 4 dinesha
                     a2b_req_depth,  // Number of requests we can buffer
52 3 dinesha
 
53
                     /* Req from req_gen */
54
                     r2b_req,      // request
55
                     r2b_req_id,   // ID
56
                     r2b_start,    // First chunk of burst
57
                     r2b_last,     // Last chunk of burst
58
                     r2b_wrap,
59 4 dinesha
                     r2b_ba,       // bank address
60 3 dinesha
                     r2b_raddr,    // row address
61
                     r2b_caddr,    // col address
62
                     r2b_len,      // length
63
                     r2b_write,    // write request
64 4 dinesha
                     b2r_arb_ok,   // OK to arbitrate for next xfr
65 3 dinesha
                     b2r_ack,
66
 
67
                     /* Transfer request to xfr_ctl */
68 4 dinesha
                     b2x_idle,     // All banks are idle
69 3 dinesha
                     b2x_req,      // Request to xfr_ctl
70
                     b2x_start,    // first chunk of transfer
71
                     b2x_last,     // last chunk of transfer
72
                     b2x_wrap,
73
                     b2x_id,       // Transfer ID
74 4 dinesha
                     b2x_ba,       // bank address
75 3 dinesha
                     b2x_addr,     // row/col address
76
                     b2x_len,      // transfer length
77
                     b2x_cmd,      // transfer command
78
                     x2b_ack,      // command accepted
79
 
80
                     /* Status to/from xfr_ctl */
81 4 dinesha
                     b2x_tras_ok,  // TRAS OK for all banks
82 3 dinesha
                     x2b_refresh,  // We did a refresh
83
                     x2b_pre_ok,   // OK to do a precharge (per bank)
84
                     x2b_act_ok,   // OK to do an activate
85
                     x2b_rdok,     // OK to do a read
86
                     x2b_wrok,     // OK to do a write
87
 
88 4 dinesha
                     /* xfr msb address */
89
                     sdr_dev_config,
90
                     xfr_bank_sel,
91
                     xfr_addr_msb,
92
                     sdr_req_norm_dma_last,
93 3 dinesha
 
94
                     /* SDRAM Timing */
95
                     tras_delay,   // Active to precharge delay
96
                     trp_delay,    // Precharge to active delay
97
                     trcd_delay);  // Active to R/W delay
98
 
99
parameter  APP_AW   = 30;  // Application Address Width
100
parameter  APP_DW   = 32;  // Application Data Width 
101
parameter  APP_BW   = 4;   // Application Byte Width
102
parameter  APP_RW   = 9;   // Application Request Width
103
 
104
parameter  SDR_DW   = 16;  // SDR Data Width 
105
parameter  SDR_BW   = 2;   // SDR Byte Width
106
   input                        clk, reset_n;
107
 
108 4 dinesha
   input [1:0]                   a2b_req_depth;
109
 
110 3 dinesha
   /* Req from bank_ctl */
111
   input                        r2b_req, r2b_start, r2b_last,
112
                                r2b_write, r2b_wrap;
113
   input [`SDR_REQ_ID_W-1:0]     r2b_req_id;
114 4 dinesha
   input [1:0]                   r2b_ba;
115 3 dinesha
   input [11:0]          r2b_raddr;
116
   input [11:0]          r2b_caddr;
117 4 dinesha
   input [APP_RW-1:0]            r2b_len;
118
   output                       b2r_arb_ok, b2r_ack;
119
   input                        sdr_req_norm_dma_last;
120 3 dinesha
 
121
   /* Req to xfr_ctl */
122 4 dinesha
   output                       b2x_idle, b2x_req, b2x_start, b2x_last,
123
                                b2x_tras_ok, b2x_wrap;
124 3 dinesha
   output [`SDR_REQ_ID_W-1:0]    b2x_id;
125 4 dinesha
   output [1:0]          b2x_ba;
126 3 dinesha
   output [11:0]                 b2x_addr;
127
   output [APP_RW-1:0]   b2x_len;
128
   output [1:0]          b2x_cmd;
129
   input                        x2b_ack;
130
 
131
   /* Status from xfr_ctl */
132 4 dinesha
   input [3:0]                   x2b_pre_ok;
133 3 dinesha
   input                        x2b_refresh, x2b_act_ok, x2b_rdok,
134 4 dinesha
                                x2b_wrok;
135 3 dinesha
 
136
   input [3:0]                   tras_delay, trp_delay, trcd_delay;
137
 
138 4 dinesha
   input [1:0] sdr_dev_config;
139
   input [1:0] xfr_bank_sel;
140
   output [13:0] xfr_addr_msb;
141 3 dinesha
 
142
   /****************************************************************************/
143
   // Internal Nets
144
 
145 4 dinesha
   wire [3:0]                    r2i_req, i2r_ack, i2x_req,
146
                                i2x_start, i2x_last, i2x_wrap, tras_ok;
147
   wire [11:0]                   i2x_addr0, i2x_addr1, i2x_addr2, i2x_addr3;
148
   wire [APP_RW-1:0]     i2x_len0, i2x_len1, i2x_len2, i2x_len3;
149
   wire [1:0]                    i2x_cmd0, i2x_cmd1, i2x_cmd2, i2x_cmd3;
150
   wire [`SDR_REQ_ID_W-1:0]      i2x_id0, i2x_id1, i2x_id2, i2x_id3;
151 3 dinesha
 
152 4 dinesha
   reg                          b2x_req;
153
   wire                         b2x_idle, b2x_start, b2x_last, b2x_wrap;
154 3 dinesha
   wire [`SDR_REQ_ID_W-1:0]      b2x_id;
155 4 dinesha
   wire [11:0]                   b2x_addr;
156 3 dinesha
   wire [APP_RW-1:0]     b2x_len;
157 4 dinesha
   wire [1:0]                    b2x_cmd;
158
   wire [3:0]                    x2i_ack;
159
   reg [1:0]                     b2x_ba;
160 3 dinesha
 
161 4 dinesha
   reg [`SDR_REQ_ID_W-1:0]       curr_id;
162
 
163
   wire [1:0]                    xfr_ba;
164
   wire                         xfr_ba_last;
165
   wire [3:0]                    xfr_ok;
166
 
167
   // This 8 bit register stores the bank addresses for upto 4 requests.
168
   reg [7:0]                     rank_ba;
169
   reg [3:0]                     rank_ba_last;
170
   // This 3 bit counter counts the number of requests we have
171
   // buffered so far, legal values are 0, 1, 2, 3, or 4.
172
   reg [2:0]                     rank_cnt;
173
   wire [3:0]                    rank_req, rank_wr_sel;
174
   wire                         rank_fifo_wr, rank_fifo_rd;
175
   wire                         rank_fifo_full, rank_fifo_mt;
176 3 dinesha
 
177 4 dinesha
   wire [11:0] bank0_row, bank1_row, bank2_row, bank3_row;
178 3 dinesha
 
179 4 dinesha
   assign b2x_tras_ok = &tras_ok;
180
 
181
   // Distribute the request from req_gen
182
 
183
   assign r2i_req[0] = (r2b_ba == 2'b00) ? r2b_req & ~rank_fifo_full : 1'b0;
184
   assign r2i_req[1] = (r2b_ba == 2'b01) ? r2b_req & ~rank_fifo_full : 1'b0;
185
   assign r2i_req[2] = (r2b_ba == 2'b10) ? r2b_req & ~rank_fifo_full : 1'b0;
186
   assign r2i_req[3] = (r2b_ba == 2'b11) ? r2b_req & ~rank_fifo_full : 1'b0;
187
 
188
   assign b2r_ack = (r2b_ba == 2'b00) ? i2r_ack[0] :
189
                    (r2b_ba == 2'b01) ? i2r_ack[1] :
190
                    (r2b_ba == 2'b10) ? i2r_ack[2] :
191
                    (r2b_ba == 2'b11) ? i2r_ack[3] : 1'b0;
192
 
193
   assign b2r_arb_ok = ~rank_fifo_full;
194
 
195
   // Put the requests from the 4 bank_fsms into a 4 deep shift
196
   // register file. The earliest request is prioritized over the
197
   // later requests. Also the number of requests we are allowed to
198
   // buffer is limited by a 2 bit external input
199
 
200
   // Mux the req/cmd to xfr_ctl. Allow RD/WR commands from the request in
201
   // rank0, allow only PR/ACT commands from the requests in other ranks
202
   // If the rank_fifo is empty, send the request from the bank addressed by
203
   // r2b_ba 
204
 
205
   assign xfr_ba = (rank_fifo_mt) ? r2b_ba : rank_ba[1:0];
206
   assign xfr_ba_last = (rank_fifo_mt) ? sdr_req_norm_dma_last : rank_ba_last[0];
207
 
208
   assign rank_req[0] = i2x_req[xfr_ba];     // each rank generates requests
209
 
210
   assign rank_req[1] = (rank_cnt < 3'h2) ? 1'b0 :
211
                        (rank_ba[3:2] == 2'b00) ? i2x_req[0] & ~i2x_cmd0[1] :
212
                        (rank_ba[3:2] == 2'b01) ? i2x_req[1] & ~i2x_cmd1[1] :
213
                        (rank_ba[3:2] == 2'b10) ? i2x_req[2] & ~i2x_cmd2[1] :
214
                        i2x_req[3] & ~i2x_cmd3[1];
215
 
216
   assign rank_req[2] = (rank_cnt < 3'h3) ? 1'b0 :
217
                        (rank_ba[5:4] == 2'b00) ? i2x_req[0] & ~i2x_cmd0[1] :
218
                        (rank_ba[5:4] == 2'b01) ? i2x_req[1] & ~i2x_cmd1[1] :
219
                        (rank_ba[5:4] == 2'b10) ? i2x_req[2] & ~i2x_cmd2[1] :
220
                        i2x_req[3] & ~i2x_cmd3[1];
221
 
222
   assign rank_req[3] = (rank_cnt < 3'h4) ? 1'b0 :
223
                        (rank_ba[7:6] == 2'b00) ? i2x_req[0] & ~i2x_cmd0[1] :
224
                        (rank_ba[7:6] == 2'b01) ? i2x_req[1] & ~i2x_cmd1[1] :
225
                        (rank_ba[7:6] == 2'b10) ? i2x_req[2] & ~i2x_cmd2[1] :
226
                        i2x_req[3] & ~i2x_cmd3[1];
227
 
228
   always @ (rank_req or rank_ba or xfr_ba or xfr_ba_last) begin
229
 
230
      if (rank_req[0]) begin
231
         b2x_req = 1'b1;
232
         b2x_ba = xfr_ba;
233
      end // if (rank_req[0])
234
 
235
      else if (rank_req[1]) begin
236
         b2x_req = 1'b1;
237
         b2x_ba = rank_ba[3:2];
238
      end // if (rank_req[1])
239
 
240
      else if (rank_req[2]) begin
241
         b2x_req = 1'b1;
242
         b2x_ba = rank_ba[5:4];
243
      end // if (rank_req[2])
244
 
245
      else if (rank_req[3]) begin
246
         b2x_req = 1'b1;
247
         b2x_ba = rank_ba[7:6];
248
      end // if (rank_req[3])
249
 
250
      else begin
251
         b2x_req = 1'b0;
252
         b2x_ba = 2'b00;
253
      end // else: !if(rank_req[3])
254
 
255
   end // always @ (rank_req or rank_fifo_mt or r2b_ba or rank_ba)
256
 
257
   assign b2x_idle = rank_fifo_mt;
258
   assign b2x_start = i2x_start[b2x_ba];
259
   assign b2x_last = i2x_last[b2x_ba];
260
   assign b2x_wrap = i2x_wrap[b2x_ba];
261
 
262
   assign b2x_addr = (b2x_ba == 2'b11) ? i2x_addr3 :
263
                     (b2x_ba == 2'b10) ? i2x_addr2 :
264
                     (b2x_ba == 2'b01) ? i2x_addr1 : i2x_addr0;
265
 
266
   assign b2x_len = (b2x_ba == 2'b11) ? i2x_len3 :
267
                    (b2x_ba == 2'b10) ? i2x_len2 :
268
                    (b2x_ba == 2'b01) ? i2x_len1 : i2x_len0;
269
 
270
   assign b2x_cmd = (b2x_ba == 2'b11) ? i2x_cmd3 :
271
                    (b2x_ba == 2'b10) ? i2x_cmd2 :
272
                    (b2x_ba == 2'b01) ? i2x_cmd1 : i2x_cmd0;
273
 
274
   assign b2x_id = (b2x_ba == 2'b11) ? i2x_id3 :
275
                   (b2x_ba == 2'b10) ? i2x_id2 :
276
                   (b2x_ba == 2'b01) ? i2x_id1 : i2x_id0;
277
 
278
   assign x2i_ack[0] = (b2x_ba == 2'b00) ? x2b_ack : 1'b0;
279
   assign x2i_ack[1] = (b2x_ba == 2'b01) ? x2b_ack : 1'b0;
280
   assign x2i_ack[2] = (b2x_ba == 2'b10) ? x2b_ack : 1'b0;
281
   assign x2i_ack[3] = (b2x_ba == 2'b11) ? x2b_ack : 1'b0;
282
 
283
   // Rank Fifo
284
   // On a write write to selected rank and increment rank_cnt
285
   // On a read shift rank_ba right 2 bits and decrement rank_cnt
286
 
287
   assign rank_fifo_wr = b2r_ack;
288
 
289
   assign rank_fifo_rd = b2x_req & b2x_cmd[1] & x2b_ack;
290
 
291
   assign rank_wr_sel[0] = (rank_cnt == 3'h0) ? rank_fifo_wr :
292
                           (rank_cnt == 3'h1) ? rank_fifo_wr & rank_fifo_rd :
293
                           1'b0;
294
 
295
   assign rank_wr_sel[1] = (rank_cnt == 3'h1) ? rank_fifo_wr & ~rank_fifo_rd :
296
                           (rank_cnt == 3'h2) ? rank_fifo_wr & rank_fifo_rd :
297
                           1'b0;
298
 
299
   assign rank_wr_sel[2] = (rank_cnt == 3'h2) ? rank_fifo_wr & ~rank_fifo_rd :
300
                           (rank_cnt == 3'h3) ? rank_fifo_wr & rank_fifo_rd :
301
                           1'b0;
302
 
303
   assign rank_wr_sel[3] = (rank_cnt == 3'h3) ? rank_fifo_wr & ~rank_fifo_rd :
304
                           (rank_cnt == 3'h4) ? rank_fifo_wr & rank_fifo_rd :
305
                           1'b0;
306
 
307
   assign rank_fifo_mt = (rank_cnt == 3'b0) ? 1'b1 : 1'b0;
308
 
309
   assign rank_fifo_full = (rank_cnt[2]) ? 1'b1 :
310
                           (rank_cnt[1:0] == a2b_req_depth) ? 1'b1 : 1'b0;
311
 
312
   // FIFO Check
313
 
314
   // synopsys translate_off
315
 
316
   always @ (posedge clk) begin
317
 
318
      if (~rank_fifo_wr & rank_fifo_rd && rank_cnt == 3'h0) begin
319
         $display ("%t: %m: ERROR!!! Read from empty Fifo", $time);
320
         $stop;
321
      end // if (rank_fifo_rd && rank_cnt == 3'h0)
322
 
323
      if (rank_fifo_wr && ~rank_fifo_rd && rank_cnt == 3'h4) begin
324
         $display ("%t: %m: ERROR!!! Write to full Fifo", $time);
325
         $stop;
326
      end // if (rank_fifo_wr && ~rank_fifo_rd && rank_cnt == 3'h4)
327
 
328
   end // always @ (posedge clk)
329
 
330
   // synopsys translate_on
331
 
332 3 dinesha
   always @ (posedge clk)
333
      if (~reset_n) begin
334 4 dinesha
         rank_cnt <= 3'b0;
335
         rank_ba <= 8'b0;
336
         rank_ba_last <= 4'b0;
337
 
338 3 dinesha
      end // if (~reset_n)
339
      else begin
340
 
341 4 dinesha
         rank_cnt <= (rank_fifo_wr & ~rank_fifo_rd) ? rank_cnt + 3'b1 :
342
                     (~rank_fifo_wr & rank_fifo_rd) ? rank_cnt - 3'b1 :
343
                     rank_cnt;
344 3 dinesha
 
345 4 dinesha
         rank_ba[1:0] <= (rank_wr_sel[0]) ? r2b_ba :
346
                         (rank_fifo_rd) ? rank_ba[3:2] : rank_ba[1:0];
347 3 dinesha
 
348 4 dinesha
         rank_ba[3:2] <= (rank_wr_sel[1]) ? r2b_ba :
349
                         (rank_fifo_rd) ? rank_ba[5:4] : rank_ba[3:2];
350 3 dinesha
 
351 4 dinesha
         rank_ba[5:4] <= (rank_wr_sel[2]) ? r2b_ba :
352
                         (rank_fifo_rd) ? rank_ba[7:6] : rank_ba[5:4];
353
 
354
         rank_ba[7:6] <= (rank_wr_sel[3]) ? r2b_ba :
355
                         (rank_fifo_rd) ? 2'b00 : rank_ba[7:6];
356 3 dinesha
 
357 4 dinesha
         rank_ba_last[0] <= (rank_wr_sel[0]) ? sdr_req_norm_dma_last :
358
                            (rank_fifo_rd) ?  rank_ba_last[1] : rank_ba_last[0];
359 3 dinesha
 
360 4 dinesha
         rank_ba_last[1] <= (rank_wr_sel[1]) ? sdr_req_norm_dma_last :
361
                            (rank_fifo_rd) ?  rank_ba_last[2] : rank_ba_last[1];
362 3 dinesha
 
363 4 dinesha
         rank_ba_last[2] <= (rank_wr_sel[2]) ? sdr_req_norm_dma_last :
364
                            (rank_fifo_rd) ?  rank_ba_last[3] : rank_ba_last[2];
365 3 dinesha
 
366 4 dinesha
         rank_ba_last[3] <= (rank_wr_sel[3]) ? sdr_req_norm_dma_last :
367
                            (rank_fifo_rd) ?  1'b0 : rank_ba_last[3];
368 3 dinesha
 
369 4 dinesha
      end // else: !if(~reset_n)
370 3 dinesha
 
371 4 dinesha
   assign xfr_ok[0] = (xfr_ba == 2'b00) ? 1'b1 : 1'b0;
372
   assign xfr_ok[1] = (xfr_ba == 2'b01) ? 1'b1 : 1'b0;
373
   assign xfr_ok[2] = (xfr_ba == 2'b10) ? 1'b1 : 1'b0;
374
   assign xfr_ok[3] = (xfr_ba == 2'b11) ? 1'b1 : 1'b0;
375
 
376
   /****************************************************************************/
377
   // Instantiate Bank Ctl FSM 0
378 3 dinesha
 
379 4 dinesha
   sdrc_bank_fsm bank0_fsm (.clk (clk),
380
                           .reset_n (reset_n),
381 3 dinesha
 
382 4 dinesha
                           /* Req from req_gen */
383
                           .r2b_req (r2i_req[0]),
384
                           .r2b_req_id (r2b_req_id),
385
                           .r2b_start (r2b_start),
386
                           .r2b_last (r2b_last),
387
                           .r2b_wrap (r2b_wrap),
388
                           .r2b_raddr (r2b_raddr),
389
                           .r2b_caddr (r2b_caddr),
390
                           .r2b_len (r2b_len),
391
                           .r2b_write (r2b_write),
392
                           .b2r_ack (i2r_ack[0]),
393
                           .sdr_dma_last(rank_ba_last[0]),
394 3 dinesha
 
395 4 dinesha
                           /* Transfer request to xfr_ctl */
396
                           .b2x_req (i2x_req[0]),
397
                           .b2x_start (i2x_start[0]),
398
                           .b2x_last (i2x_last[0]),
399
                           .b2x_wrap (i2x_wrap[0]),
400
                           .b2x_id (i2x_id0),
401
                           .b2x_addr (i2x_addr0),
402
                           .b2x_len (i2x_len0),
403
                           .b2x_cmd (i2x_cmd0),
404
                           .x2b_ack (x2i_ack[0]),
405
 
406
                           /* Status to/from xfr_ctl */
407
                           .tras_ok (tras_ok[0]),
408
                           .xfr_ok (xfr_ok[0]),
409
                           .x2b_refresh (x2b_refresh),
410
                           .x2b_pre_ok (x2b_pre_ok[0]),
411
                           .x2b_act_ok (x2b_act_ok),
412
                           .x2b_rdok (x2b_rdok),
413
                           .x2b_wrok (x2b_wrok),
414 3 dinesha
 
415 4 dinesha
                           .bank_row(bank0_row),
416 3 dinesha
 
417 4 dinesha
                           /* SDRAM Timing */
418
                           .tras_delay (tras_delay),
419
                           .trp_delay (trp_delay),
420
                           .trcd_delay (trcd_delay));
421 3 dinesha
 
422 4 dinesha
   /****************************************************************************/
423
   // Instantiate Bank Ctl FSM 1
424 3 dinesha
 
425 4 dinesha
   sdrc_bank_fsm bank1_fsm (.clk (clk),
426
                           .reset_n (reset_n),
427 3 dinesha
 
428 4 dinesha
                           /* Req from req_gen */
429
                           .r2b_req (r2i_req[1]),
430
                           .r2b_req_id (r2b_req_id),
431
                           .r2b_start (r2b_start),
432
                           .r2b_last (r2b_last),
433
                           .r2b_wrap (r2b_wrap),
434
                           .r2b_raddr (r2b_raddr),
435
                           .r2b_caddr (r2b_caddr),
436
                           .r2b_len (r2b_len),
437
                           .r2b_write (r2b_write),
438
                           .b2r_ack (i2r_ack[1]),
439
                           .sdr_dma_last(rank_ba_last[1]),
440 3 dinesha
 
441 4 dinesha
                           /* Transfer request to xfr_ctl */
442
                           .b2x_req (i2x_req[1]),
443
                           .b2x_start (i2x_start[1]),
444
                           .b2x_last (i2x_last[1]),
445
                           .b2x_wrap (i2x_wrap[1]),
446
                           .b2x_id (i2x_id1),
447
                           .b2x_addr (i2x_addr1),
448
                           .b2x_len (i2x_len1),
449
                           .b2x_cmd (i2x_cmd1),
450
                           .x2b_ack (x2i_ack[1]),
451
 
452
                           /* Status to/from xfr_ctl */
453
                           .tras_ok (tras_ok[1]),
454
                           .xfr_ok (xfr_ok[1]),
455
                           .x2b_refresh (x2b_refresh),
456
                           .x2b_pre_ok (x2b_pre_ok[1]),
457
                           .x2b_act_ok (x2b_act_ok),
458
                           .x2b_rdok (x2b_rdok),
459
                           .x2b_wrok (x2b_wrok),
460 3 dinesha
 
461 4 dinesha
                           .bank_row(bank1_row),
462 3 dinesha
 
463 4 dinesha
                           /* SDRAM Timing */
464
                           .tras_delay (tras_delay),
465
                           .trp_delay (trp_delay),
466
                           .trcd_delay (trcd_delay));
467
 
468
   /****************************************************************************/
469
   // Instantiate Bank Ctl FSM 2
470 3 dinesha
 
471 4 dinesha
   sdrc_bank_fsm bank2_fsm (.clk (clk),
472
                           .reset_n (reset_n),
473 3 dinesha
 
474 4 dinesha
                           /* Req from req_gen */
475
                           .r2b_req (r2i_req[2]),
476
                           .r2b_req_id (r2b_req_id),
477
                           .r2b_start (r2b_start),
478
                           .r2b_last (r2b_last),
479
                           .r2b_wrap (r2b_wrap),
480
                           .r2b_raddr (r2b_raddr),
481
                           .r2b_caddr (r2b_caddr),
482
                           .r2b_len (r2b_len),
483
                           .r2b_write (r2b_write),
484
                           .b2r_ack (i2r_ack[2]),
485
                           .sdr_dma_last(rank_ba_last[2]),
486 3 dinesha
 
487 4 dinesha
                           /* Transfer request to xfr_ctl */
488
                           .b2x_req (i2x_req[2]),
489
                           .b2x_start (i2x_start[2]),
490
                           .b2x_last (i2x_last[2]),
491
                           .b2x_wrap (i2x_wrap[2]),
492
                           .b2x_id (i2x_id2),
493
                           .b2x_addr (i2x_addr2),
494
                           .b2x_len (i2x_len2),
495
                           .b2x_cmd (i2x_cmd2),
496
                           .x2b_ack (x2i_ack[2]),
497
 
498
                           /* Status to/from xfr_ctl */
499
                           .tras_ok (tras_ok[2]),
500
                           .xfr_ok (xfr_ok[2]),
501
                           .x2b_refresh (x2b_refresh),
502
                           .x2b_pre_ok (x2b_pre_ok[2]),
503
                           .x2b_act_ok (x2b_act_ok),
504
                           .x2b_rdok (x2b_rdok),
505
                           .x2b_wrok (x2b_wrok),
506 3 dinesha
 
507 4 dinesha
                           .bank_row(bank2_row),
508 3 dinesha
 
509 4 dinesha
                           /* SDRAM Timing */
510
                           .tras_delay (tras_delay),
511
                           .trp_delay (trp_delay),
512
                           .trcd_delay (trcd_delay));
513
 
514
   /****************************************************************************/
515
   // Instantiate Bank Ctl FSM 3
516 3 dinesha
 
517 4 dinesha
   sdrc_bank_fsm bank3_fsm (.clk (clk),
518
                           .reset_n (reset_n),
519 3 dinesha
 
520 4 dinesha
                           /* Req from req_gen */
521
                           .r2b_req (r2i_req[3]),
522
                           .r2b_req_id (r2b_req_id),
523
                           .r2b_start (r2b_start),
524
                           .r2b_last (r2b_last),
525
                           .r2b_wrap (r2b_wrap),
526
                           .r2b_raddr (r2b_raddr),
527
                           .r2b_caddr (r2b_caddr),
528
                           .r2b_len (r2b_len),
529
                           .r2b_write (r2b_write),
530
                           .b2r_ack (i2r_ack[3]),
531
                           .sdr_dma_last(rank_ba_last[3]),
532 3 dinesha
 
533 4 dinesha
                           /* Transfer request to xfr_ctl */
534
                           .b2x_req (i2x_req[3]),
535
                           .b2x_start (i2x_start[3]),
536
                           .b2x_last (i2x_last[3]),
537
                           .b2x_wrap (i2x_wrap[3]),
538
                           .b2x_id (i2x_id3),
539
                           .b2x_addr (i2x_addr3),
540
                           .b2x_len (i2x_len3),
541
                           .b2x_cmd (i2x_cmd3),
542
                           .x2b_ack (x2i_ack[3]),
543
 
544
                           /* Status to/from xfr_ctl */
545
                           .tras_ok (tras_ok[3]),
546
                           .xfr_ok (xfr_ok[3]),
547
                           .x2b_refresh (x2b_refresh),
548
                           .x2b_pre_ok (x2b_pre_ok[3]),
549
                           .x2b_act_ok (x2b_act_ok),
550
                           .x2b_rdok (x2b_rdok),
551
                           .x2b_wrok (x2b_wrok),
552 3 dinesha
 
553 4 dinesha
                           .bank_row(bank3_row),
554
 
555
                           /* SDRAM Timing */
556
                           .tras_delay (tras_delay),
557
                           .trp_delay (trp_delay),
558
                           .trcd_delay (trcd_delay));
559 3 dinesha
 
560 4 dinesha
 
561
/* address for current xfr, debug only */
562
wire [11:0] cur_row = (xfr_bank_sel==3) ? bank3_row:
563
                        (xfr_bank_sel==2) ? bank2_row:
564
                        (xfr_bank_sel==1) ? bank1_row: bank0_row;
565
 
566
assign xfr_addr_msb = (sdr_dev_config == 2'b11) ? {cur_row, xfr_bank_sel[1:0]}:
567
                                  {cur_row, xfr_bank_sel[0]};
568
 
569
 
570
endmodule // sdr_bank_ctl

powered by: WebSVN 2.1.0

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