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 15

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 13 dinesha
                    cfg_colbits,
85 3 dinesha
 
86
                    /* Req to bank_ctl */
87
                    r2x_idle,
88
                    r2b_req,    // request
89
                    r2b_req_id, // ID
90
                    r2b_start,  // First chunk of burst
91
                    r2b_last,   // Last chunk of burst
92
                    r2b_wrap,   // Wrap Mode
93
                    r2b_ba,     // bank address
94
                    r2b_raddr,  // row address
95
                    r2b_caddr,  // col address
96
                    r2b_len,    // length
97
                    r2b_write,  // write request
98
                    b2r_ack,
99
                    b2r_arb_ok,
100
                    sdr_width,
101
                    sdr_init_done);
102
 
103
parameter  APP_AW   = 30;  // Application Address Width
104
parameter  APP_DW   = 32;  // Application Data Width 
105
parameter  APP_BW   = 4;   // Application Byte Width
106
parameter  APP_RW   = 9;   // Application Request Width
107
 
108
parameter  SDR_DW   = 16;  // SDR Data Width 
109
parameter  SDR_BW   = 2;   // SDR Byte Width
110
 
111
   input                        clk, reset_n;
112 13 dinesha
   input [1:0]                  cfg_colbits; // 2'b00 - 8 Bit column address, 2'b01 - 9 Bit, 10 - 10 bit, 11 - 11Bits
113 3 dinesha
 
114
   /* Request from app */
115
   input                        req;
116
   input [`SDR_REQ_ID_W-1:0]     req_id;
117
   input [APP_AW:0]      req_addr;
118
   input [APP_AW-2:0]    req_addr_mask;
119
   input [APP_RW-1:0]    req_len;
120
   input                        req_wr_n, req_wrap;
121
   output                       req_ack, sdr_core_busy_n;
122
 
123
   /* Req to bank_ctl */
124
   output                       r2x_idle, r2b_req, r2b_start, r2b_last,
125
                                r2b_write, r2b_wrap;
126
   output [`SDR_REQ_ID_W-1:0]    r2b_req_id;
127
   output [1:0]          r2b_ba;
128
   output [11:0]                 r2b_raddr;
129
   output [11:0]                 r2b_caddr;
130
   output [APP_RW-1:0]   r2b_len;
131
   input                        b2r_ack, b2r_arb_ok, sdr_init_done;
132
//
133
   input                        sdr_width;
134
 
135
   /****************************************************************************/
136
   // Internal Nets
137
 
138
   `define REQ_IDLE        1'b0
139
   `define REQ_ACTIVE      1'b1
140
 
141
   reg                          req_st, next_req_st;
142
   reg                          r2x_idle, req_ack, r2b_req, r2b_start,
143
                                r2b_write, req_idle, req_ld, lcl_wrap;
144
   reg [`SDR_REQ_ID_W-1:0]       r2b_req_id;
145
   reg [APP_RW-1:0]      lcl_req_len;
146
 
147
   wire                         r2b_last, page_ovflw;
148
   wire [APP_RW-1:0]     r2b_len, next_req_len;
149
   wire [APP_RW:0]       max_r2b_len;
150
 
151
   wire [1:0]                    r2b_ba;
152
   wire [11:0]                   r2b_raddr;
153
   wire [11:0]                   r2b_caddr;
154
 
155
   reg [APP_AW-1:0]      curr_sdr_addr, sdr_addrs_mask;
156
   wire [APP_AW-1:0]     next_sdr_addr, next_sdr_addr1;
157
 
158
   //
159
   // The maximum length for no page overflow is 200h/100h - caddr. Split a request
160
   // into 2 or more requests if it crosses a page boundary.
161
   // For non-queue accesses req_addr_mask is set to all 1 and the accesses
162
   // proceed linearly. 
163
   // All queues end on a 512 byte boundary (actually a 1K boundary). For Q
164
   // accesses req_addr_mask is set to LSB of 1 and MSB of 0 to constrain the
165
   // accesses within the space for a Q. When splitting and calculating the next
166
   // address only the LSBs are incremented, the MSBs remain = req_addr.
167
   //
168 13 dinesha
   assign max_r2b_len = (cfg_colbits == 2'b00) ? (12'h100 - r2b_caddr) :
169
                        (cfg_colbits == 2'b01) ? (12'h200 - r2b_caddr) :
170
                        (cfg_colbits == 2'b10) ? (12'h400 - r2b_caddr) : (12'h800 - r2b_caddr);
171 3 dinesha
 
172
   assign page_ovflw = ({1'b0, lcl_req_len} > max_r2b_len) ? ~lcl_wrap : 1'b0;
173
 
174
   assign r2b_len = (page_ovflw) ? max_r2b_len : lcl_req_len;
175
 
176
   assign next_req_len = lcl_req_len - r2b_len;
177
 
178
   assign next_sdr_addr1 = curr_sdr_addr + r2b_len;
179
 
180
   // Wrap back based on the mask
181
   assign next_sdr_addr = (sdr_addrs_mask & next_sdr_addr1) |
182
                          (~sdr_addrs_mask & curr_sdr_addr);
183
 
184
   assign sdr_core_busy_n = req_idle & b2r_arb_ok & sdr_init_done;
185
 
186
   assign r2b_wrap = lcl_wrap;
187
 
188
   assign r2b_last = ~page_ovflw;
189
//
190
//
191
//
192
   always @ (posedge clk) begin
193
 
194
      r2b_start <= (req_ack) ? 1'b1 :
195
                   (b2r_ack) ? 1'b0 : r2b_start;
196
 
197
      r2b_write <= (req_ack) ? ~req_wr_n : r2b_write;
198
 
199
      r2b_req_id <= (req_ack) ? req_id : r2b_req_id;
200
 
201
      lcl_wrap <= (req_ack) ? req_wrap : lcl_wrap;
202
 
203
      lcl_req_len <= (req_ack) ? req_len  :
204
                   (req_ld) ? next_req_len : lcl_req_len;
205
 
206
      curr_sdr_addr <= (req_ack) ? req_addr :
207
                       (req_ld) ? next_sdr_addr : curr_sdr_addr;
208
 
209
      sdr_addrs_mask <= (req_ack) ? (sdr_width ? {req_addr_mask,req_addr_mask[0]} : req_addr_mask) : sdr_addrs_mask;
210
 
211
   end // always @ (posedge clk)
212
 
213
   always @ (*) begin
214
 
215
      case (req_st)      // synopsys full_case parallel_case
216
 
217
        `REQ_IDLE : begin
218
           r2x_idle = ~req;
219
           req_idle = 1'b1;
220
           req_ack = req & b2r_arb_ok;
221
           req_ld = 1'b0;
222
           r2b_req = 1'b0;
223
           next_req_st = (req & b2r_arb_ok) ? `REQ_ACTIVE : `REQ_IDLE;
224
        end // case: `REQ_IDLE
225
 
226
        `REQ_ACTIVE : begin
227
           r2x_idle = 1'b0;
228
           req_idle = 1'b0;
229
           req_ack = 1'b0;
230
           req_ld = b2r_ack;
231
           r2b_req = 1'b1;                       // req_gen to bank_req
232
           next_req_st = (b2r_ack & r2b_last) ? `REQ_IDLE : `REQ_ACTIVE;
233
        end // case: `REQ_ACTIVE
234
 
235
      endcase // case(req_st)
236
 
237
   end // always @ (req_st or ....)
238
 
239
   always @ (posedge clk)
240
      if (~reset_n) begin
241
         req_st <= `REQ_IDLE;
242
      end // if (~reset_n)
243
      else begin
244
         req_st <= next_req_st;
245
      end // else: !if(~reset_n)
246
//
247
// addrs bits for the bank, row and column
248
//
249
 
250 13 dinesha
// Bank Bits are always - 2 Bits
251
   assign r2b_ba = (cfg_colbits == 2'b00) ? {curr_sdr_addr[9:8]}   :
252
                   (cfg_colbits == 2'b01) ? {curr_sdr_addr[10:9]}  :
253
                   (cfg_colbits == 2'b10) ? {curr_sdr_addr[11:10]} : curr_sdr_addr[12:11];
254 3 dinesha
 
255 13 dinesha
   /********************
256
   *  Colbits Mapping:
257
   *           2'b00 - 8 Bit
258
   *           2'b01 - 16 Bit
259
   *           2'b10 - 10 Bit
260
   *           2'b11 - 11 Bits
261
   ************************/
262
   assign r2b_caddr = (cfg_colbits == 2'b00) ? {4'b0, curr_sdr_addr[7:0]} :
263
                      (cfg_colbits == 2'b01) ? {3'b0, curr_sdr_addr[8:0]} :
264
                      (cfg_colbits == 2'b10) ? {2'b0, curr_sdr_addr[9:0]} : {1'b0, curr_sdr_addr[10:0]};
265 3 dinesha
 
266 13 dinesha
   assign r2b_raddr = (cfg_colbits == 2'b00)  ? curr_sdr_addr[21:10] :
267
                      (cfg_colbits == 2'b01)  ? curr_sdr_addr[22:11] :
268
                      (cfg_colbits == 2'b10)  ? curr_sdr_addr[23:12] : curr_sdr_addr[24:13];
269
 
270 3 dinesha
 
271
endmodule // sdr_req_gen

powered by: WebSVN 2.1.0

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