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

Subversion Repositories sdr_ctrl

[/] [sdr_ctrl/] [trunk/] [rtl/] [core/] [sdrc_req_gen.v] - Blame information for rev 13

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

Line No. Rev Author Line
1 3 dinesha
/*********************************************************************
2
 
3
  SDRAM Controller Request Generation
4
 
5
  This file is part of the sdram controller project
6
  http://www.opencores.org/cores/sdr_ctrl/
7
 
8
  Description: SDRAM Controller Reguest Generation
9
  The 2Mx32 SDRAM is addressed by a 21 bit address,
10
  each loation is 32 bits wide.
11
  This 21 bit address is mapped as follows:
12
  ADDR [7:0]      : Column Address (256 columns)
13
  ADDR [18:8]     : Row Address (2K Rows)
14
  ADDR [20:19]    : Bank Address (2 banks)
15
 
16
  The 4Mx16 SDRAM is addressed by a 22 bit address,
17
  each loation is 16 bits wide.
18
  This 22 bit address is mapped as follows:
19
  ADDR [7:0]      : Column Address (256 columns)
20
  ADDR [21:10]    : Row Address (4K Rows)
21
  ADDR [21:20]    : Bank Address (4 banks)
22
 
23
  The 8Mx16 SDRAM is addressed by a 23 bit address,
24
  each loation is 16 bits wide.
25
  This 23 bit address is mapped as follows:
26
  ADDR [8:0]      : Column Address (512 columns)
27
  ADDR [20:9]     : Row Address (4K Rows)
28
  ADDR [22:21]    : Bank Address (4 banks)
29
 
30
  The SDRAMs are operated in 4 beat burst mode.
31
  This module takes requests from the mc,
32
  chops them to page boundaries if wrap=0,
33
  and passes the request to bank_ctl
34
 
35
  To Do:
36
    nothing
37
 
38
  Author(s):
39
      - Dinesh Annayya, dinesha@opencores.org
40
  Version  : 1.0 - 8th Jan 2012
41
 
42
 
43
 
44
 Copyright (C) 2000 Authors and OPENCORES.ORG
45
 
46
 This source file may be used and distributed without
47
 restriction provided that this copyright statement is not
48
 removed from the file and that any derivative work contains
49
 the original copyright notice and the associated disclaimer.
50
 
51
 This source file is free software; you can redistribute it
52
 and/or modify it under the terms of the GNU Lesser General
53
 Public License as published by the Free Software Foundation;
54
 either version 2.1 of the License, or (at your option) any
55
later version.
56
 
57
 This source is distributed in the hope that it will be
58
 useful, but WITHOUT ANY WARRANTY; without even the implied
59
 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
60
 PURPOSE.  See the GNU Lesser General Public License for more
61
 details.
62
 
63
 You should have received a copy of the GNU Lesser General
64
 Public License along with this source; if not, download it
65
 from http://www.opencores.org/lgpl.shtml
66
 
67
*******************************************************************/
68
 
69
`include "sdrc.def"
70
 
71
module sdrc_req_gen (clk,
72
                    reset_n,
73
 
74
                    /* Request from app */
75
                    req,        // Transfer Request
76
                    req_id,     // ID for this transfer
77
                    req_addr,   // SDRAM Address
78
                    req_addr_mask,
79
                    req_len,    // Burst Length (in 32 bit words)
80
                    req_wrap,   // Wrap mode request (xfr_len = 4)
81
                    req_wr_n,   // 0 => Write request, 1 => read req
82
                    req_ack,    // Request has been accepted
83
                    sdr_core_busy_n,    // SDRAM Core Busy Indication
84
                    sdr_dev_config, // sdram configuration
85 13 dinesha
                    cfg_colbits,
86 3 dinesha
 
87
                    /* Req to bank_ctl */
88
                    r2x_idle,
89
                    r2b_req,    // request
90
                    r2b_req_id, // ID
91
                    r2b_start,  // First chunk of burst
92
                    r2b_last,   // Last chunk of burst
93
                    r2b_wrap,   // Wrap Mode
94
                    r2b_ba,     // bank address
95
                    r2b_raddr,  // row address
96
                    r2b_caddr,  // col address
97
                    r2b_len,    // length
98
                    r2b_write,  // write request
99
                    b2r_ack,
100
                    b2r_arb_ok,
101
                    sdr_width,
102
                    sdr_init_done);
103
 
104
parameter  APP_AW   = 30;  // Application Address Width
105
parameter  APP_DW   = 32;  // Application Data Width 
106
parameter  APP_BW   = 4;   // Application Byte Width
107
parameter  APP_RW   = 9;   // Application Request Width
108
 
109
parameter  SDR_DW   = 16;  // SDR Data Width 
110
parameter  SDR_BW   = 2;   // SDR Byte Width
111
 
112
   input                        clk, reset_n;
113 13 dinesha
   input [1:0]                  cfg_colbits; // 2'b00 - 8 Bit column address, 2'b01 - 9 Bit, 10 - 10 bit, 11 - 11Bits
114 3 dinesha
 
115
   /* Request from app */
116
   input                        req;
117
   input [`SDR_REQ_ID_W-1:0]     req_id;
118
   input [APP_AW:0]      req_addr;
119
   input [APP_AW-2:0]    req_addr_mask;
120
   input [APP_RW-1:0]    req_len;
121
   input                        req_wr_n, req_wrap;
122
   output                       req_ack, sdr_core_busy_n;
123
 
124
   /* Req to bank_ctl */
125
   output                       r2x_idle, r2b_req, r2b_start, r2b_last,
126
                                r2b_write, r2b_wrap;
127
   output [`SDR_REQ_ID_W-1:0]    r2b_req_id;
128
   output [1:0]          r2b_ba;
129
   output [11:0]                 r2b_raddr;
130
   output [11:0]                 r2b_caddr;
131
   output [APP_RW-1:0]   r2b_len;
132
   input                        b2r_ack, b2r_arb_ok, sdr_init_done;
133
//
134
   input                        sdr_width;
135
   input  [1:0]                 sdr_dev_config;
136
 
137
   /****************************************************************************/
138
   // Internal Nets
139
 
140
   `define REQ_IDLE        1'b0
141
   `define REQ_ACTIVE      1'b1
142
 
143
   reg                          req_st, next_req_st;
144
   reg                          r2x_idle, req_ack, r2b_req, r2b_start,
145
                                r2b_write, req_idle, req_ld, lcl_wrap;
146
   reg [`SDR_REQ_ID_W-1:0]       r2b_req_id;
147
   reg [APP_RW-1:0]      lcl_req_len;
148
 
149
   wire                         r2b_last, page_ovflw;
150
   wire [APP_RW-1:0]     r2b_len, next_req_len;
151
   wire [APP_RW:0]       max_r2b_len;
152
 
153
   wire [1:0]                    r2b_ba;
154
   wire [11:0]                   r2b_raddr;
155
   wire [11:0]                   r2b_caddr;
156
 
157
   reg [APP_AW-1:0]      curr_sdr_addr, sdr_addrs_mask;
158
   wire [APP_AW-1:0]     next_sdr_addr, next_sdr_addr1;
159
 
160
   //
161
   // The maximum length for no page overflow is 200h/100h - caddr. Split a request
162
   // into 2 or more requests if it crosses a page boundary.
163
   // For non-queue accesses req_addr_mask is set to all 1 and the accesses
164
   // proceed linearly. 
165
   // All queues end on a 512 byte boundary (actually a 1K boundary). For Q
166
   // accesses req_addr_mask is set to LSB of 1 and MSB of 0 to constrain the
167
   // accesses within the space for a Q. When splitting and calculating the next
168
   // address only the LSBs are incremented, the MSBs remain = req_addr.
169
   //
170 13 dinesha
   assign max_r2b_len = (cfg_colbits == 2'b00) ? (12'h100 - r2b_caddr) :
171
                        (cfg_colbits == 2'b01) ? (12'h200 - r2b_caddr) :
172
                        (cfg_colbits == 2'b10) ? (12'h400 - r2b_caddr) : (12'h800 - r2b_caddr);
173 3 dinesha
 
174
   assign page_ovflw = ({1'b0, lcl_req_len} > max_r2b_len) ? ~lcl_wrap : 1'b0;
175
 
176
   assign r2b_len = (page_ovflw) ? max_r2b_len : lcl_req_len;
177
 
178
   assign next_req_len = lcl_req_len - r2b_len;
179
 
180
   assign next_sdr_addr1 = curr_sdr_addr + r2b_len;
181
 
182
   // Wrap back based on the mask
183
   assign next_sdr_addr = (sdr_addrs_mask & next_sdr_addr1) |
184
                          (~sdr_addrs_mask & curr_sdr_addr);
185
 
186
   assign sdr_core_busy_n = req_idle & b2r_arb_ok & sdr_init_done;
187
 
188
   assign r2b_wrap = lcl_wrap;
189
 
190
   assign r2b_last = ~page_ovflw;
191
//
192
//
193
//
194
   always @ (posedge clk) begin
195
 
196
      r2b_start <= (req_ack) ? 1'b1 :
197
                   (b2r_ack) ? 1'b0 : r2b_start;
198
 
199
      r2b_write <= (req_ack) ? ~req_wr_n : r2b_write;
200
 
201
      r2b_req_id <= (req_ack) ? req_id : r2b_req_id;
202
 
203
      lcl_wrap <= (req_ack) ? req_wrap : lcl_wrap;
204
 
205
      lcl_req_len <= (req_ack) ? req_len  :
206
                   (req_ld) ? next_req_len : lcl_req_len;
207
 
208
      curr_sdr_addr <= (req_ack) ? req_addr :
209
                       (req_ld) ? next_sdr_addr : curr_sdr_addr;
210
 
211
      sdr_addrs_mask <= (req_ack) ? (sdr_width ? {req_addr_mask,req_addr_mask[0]} : req_addr_mask) : sdr_addrs_mask;
212
 
213
   end // always @ (posedge clk)
214
 
215
   always @ (*) begin
216
 
217
      case (req_st)      // synopsys full_case parallel_case
218
 
219
        `REQ_IDLE : begin
220
           r2x_idle = ~req;
221
           req_idle = 1'b1;
222
           req_ack = req & b2r_arb_ok;
223
           req_ld = 1'b0;
224
           r2b_req = 1'b0;
225
           next_req_st = (req & b2r_arb_ok) ? `REQ_ACTIVE : `REQ_IDLE;
226
        end // case: `REQ_IDLE
227
 
228
        `REQ_ACTIVE : begin
229
           r2x_idle = 1'b0;
230
           req_idle = 1'b0;
231
           req_ack = 1'b0;
232
           req_ld = b2r_ack;
233
           r2b_req = 1'b1;                       // req_gen to bank_req
234
           next_req_st = (b2r_ack & r2b_last) ? `REQ_IDLE : `REQ_ACTIVE;
235
        end // case: `REQ_ACTIVE
236
 
237
      endcase // case(req_st)
238
 
239
   end // always @ (req_st or ....)
240
 
241
   always @ (posedge clk)
242
      if (~reset_n) begin
243
         req_st <= `REQ_IDLE;
244
      end // if (~reset_n)
245
      else begin
246
         req_st <= next_req_st;
247
      end // else: !if(~reset_n)
248
//
249
// addrs bits for the bank, row and column
250
//
251
 
252 13 dinesha
// Bank Bits are always - 2 Bits
253
   assign r2b_ba = (cfg_colbits == 2'b00) ? {curr_sdr_addr[9:8]}   :
254
                   (cfg_colbits == 2'b01) ? {curr_sdr_addr[10:9]}  :
255
                   (cfg_colbits == 2'b10) ? {curr_sdr_addr[11:10]} : curr_sdr_addr[12:11];
256 3 dinesha
 
257 13 dinesha
   /********************
258
   *  Colbits Mapping:
259
   *           2'b00 - 8 Bit
260
   *           2'b01 - 16 Bit
261
   *           2'b10 - 10 Bit
262
   *           2'b11 - 11 Bits
263
   ************************/
264
   assign r2b_caddr = (cfg_colbits == 2'b00) ? {4'b0, curr_sdr_addr[7:0]} :
265
                      (cfg_colbits == 2'b01) ? {3'b0, curr_sdr_addr[8:0]} :
266
                      (cfg_colbits == 2'b10) ? {2'b0, curr_sdr_addr[9:0]} : {1'b0, curr_sdr_addr[10:0]};
267 3 dinesha
 
268 13 dinesha
   assign r2b_raddr = (cfg_colbits == 2'b00)  ? curr_sdr_addr[21:10] :
269
                      (cfg_colbits == 2'b01)  ? curr_sdr_addr[22:11] :
270
                      (cfg_colbits == 2'b10)  ? curr_sdr_addr[23:12] : curr_sdr_addr[24:13];
271
 
272 3 dinesha
 
273
endmodule // sdr_req_gen

powered by: WebSVN 2.1.0

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