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

Subversion Repositories sdr_ctrl

[/] [sdr_ctrl/] [trunk/] [rtl/] [core/] [sdrc_req_gen.v] - Diff between revs 46 and 47

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 46 Rev 47
Line 38... Line 38...
  To Do:
  To Do:
    nothing
    nothing
 
 
  Author(s):
  Author(s):
      - Dinesh Annayya, dinesha@opencores.org
      - Dinesh Annayya, dinesha@opencores.org
  Version  : 1.0 - 8th Jan 2012
  Version  : 0.0 - 8th Jan 2012
 
             0.1 - 5th Feb 2012, column/row/bank address are register to improve the timing issue in FPGA synthesis
 
 
 
 
 
 
 Copyright (C) 2000 Authors and OPENCORES.ORG
 Copyright (C) 2000 Authors and OPENCORES.ORG
 
 
Line 71... Line 72...
 
 
`include "sdrc_define.v"
`include "sdrc_define.v"
 
 
module sdrc_req_gen (clk,
module sdrc_req_gen (clk,
                    reset_n,
                    reset_n,
 
                    cfg_colbits,
 
                    sdr_width,
 
 
                    /* Request from app */
                    /* Request from app */
                    req,                // Transfer Request
                    req,                // Transfer Request
                    req_id,             // ID for this transfer
                    req_id,             // ID for this transfer
                    req_addr,           // SDRAM Address
                    req_addr,           // SDRAM Address
                    req_len,            // Burst Length (in 32 bit words)
                    req_len,            // Burst Length (in 32 bit words)
                    req_wrap,           // Wrap mode request (xfr_len = 4)
                    req_wrap,           // Wrap mode request (xfr_len = 4)
                    req_wr_n,           // 0 => Write request, 1 => read req
                    req_wr_n,           // 0 => Write request, 1 => read req
                    req_ack,            // Request has been accepted
                    req_ack,            // Request has been accepted
                    sdr_core_busy_n,    // SDRAM Core Busy Indication
 
                    cfg_colbits,
 
 
 
                    /* Req to bank_ctl */
                    /* Req to xfr_ctl */
                    r2x_idle,
                    r2x_idle,
 
 
 
                    /* Req to bank_ctl */
                    r2b_req,    // request
                    r2b_req,    // request
                    r2b_req_id, // ID
                    r2b_req_id, // ID
                    r2b_start,  // First chunk of burst
                    r2b_start,  // First chunk of burst
                    r2b_last,   // Last chunk of burst
                    r2b_last,   // Last chunk of burst
                    r2b_wrap,   // Wrap Mode
                    r2b_wrap,   // Wrap Mode
Line 96... Line 99...
                    r2b_raddr,  // row address
                    r2b_raddr,  // row address
                    r2b_caddr,  // col address
                    r2b_caddr,  // col address
                    r2b_len,    // length
                    r2b_len,    // length
                    r2b_write,  // write request
                    r2b_write,  // write request
                    b2r_ack,
                    b2r_ack,
                    b2r_arb_ok,
                    b2r_arb_ok
                    sdr_width,
                    );
                    sdr_init_done);
 
 
 
parameter  APP_AW   = 30;  // Application Address Width
parameter  APP_AW   = 30;  // Application Address Width
parameter  APP_DW   = 32;  // Application Data Width 
parameter  APP_DW   = 32;  // Application Data Width 
parameter  APP_BW   = 4;   // Application Byte Width
parameter  APP_BW   = 4;   // Application Byte Width
parameter  APP_RW   = 9;   // Application Request Width
parameter  APP_RW   = 9;   // Application Request Width
 
 
parameter  SDR_DW   = 16;  // SDR Data Width 
parameter  SDR_DW   = 16;  // SDR Data Width 
parameter  SDR_BW   = 2;   // SDR Byte Width
parameter  SDR_BW   = 2;   // SDR Byte Width
 
 
   input                        clk, reset_n;
input                   clk           ;
 
input                   reset_n       ;
   input [1:0]                  cfg_colbits; // 2'b00 - 8 Bit column address, 2'b01 - 9 Bit, 10 - 10 bit, 11 - 11Bits
   input [1:0]                  cfg_colbits; // 2'b00 - 8 Bit column address, 2'b01 - 9 Bit, 10 - 10 bit, 11 - 11Bits
 
 
   /* Request from app */
   /* Request from app */
   input                        req;
input                   req           ; // Request 
   input [`SDR_REQ_ID_W-1:0]     req_id;
input [`SDR_REQ_ID_W-1:0] req_id      ; // Request ID
   input [APP_AW-1:0]    req_addr;
input [APP_AW-1:0]       req_addr      ; // Request Address
   input [APP_RW-1:0]    req_len;
input [APP_RW-1:0]       req_len       ; // Request length
   input                        req_wr_n, req_wrap;
input                   req_wr_n      ; // 0 -Write, 1 - Read
   output                       req_ack, sdr_core_busy_n;
input                   req_wrap      ; // 1 - Wrap the Address on page boundary
 
output                  req_ack       ; // Request Ack
 
 
   /* Req to bank_ctl */
   /* Req to bank_ctl */
   output                       r2x_idle, r2b_req, r2b_start, r2b_last,
output                  r2x_idle      ;
                                r2b_write, r2b_wrap;
output                  r2b_req       ;
 
output                  r2b_start     ;
 
output                  r2b_last      ;
 
output                  r2b_write     ;
 
output                  r2b_wrap      ;
   output [`SDR_REQ_ID_W-1:0]    r2b_req_id;
   output [`SDR_REQ_ID_W-1:0]    r2b_req_id;
   output [1:0]          r2b_ba;
   output [1:0]          r2b_ba;
   output [11:0]                 r2b_raddr;
   output [11:0]                 r2b_raddr;
   output [11:0]                 r2b_caddr;
   output [11:0]                 r2b_caddr;
   output [APP_RW-1:0]   r2b_len;
   output [APP_RW-1:0]   r2b_len;
   input                        b2r_ack, b2r_arb_ok, sdr_init_done;
input                   b2r_ack       ;
 
input                   b2r_arb_ok    ;
//
//
   input [1:0]                   sdr_width; // 2'b00 - 32 Bit, 2'b01 - 16 Bit, 2'b1x - 8Bit
   input [1:0]                   sdr_width; // 2'b00 - 32 Bit, 2'b01 - 16 Bit, 2'b1x - 8Bit
 
 
 
 
   /****************************************************************************/
   /****************************************************************************/
Line 148... Line 157...
 
 
   wire                         r2b_last, page_ovflw;
   wire                         r2b_last, page_ovflw;
   wire [APP_RW-1:0]     r2b_len, next_req_len;
   wire [APP_RW-1:0]     r2b_len, next_req_len;
   wire [APP_RW:0]       max_r2b_len;
   wire [APP_RW:0]       max_r2b_len;
 
 
   wire [1:0]                    r2b_ba;
   reg [1:0]             r2b_ba;
   wire [11:0]                   r2b_raddr;
   reg [11:0]            r2b_raddr;
   wire [11:0]                   r2b_caddr;
   reg [11:0]            r2b_caddr;
 
 
   reg [APP_AW-1:0]      curr_sdr_addr ;
   reg [APP_AW-1:0]      curr_sdr_addr ;
   wire [APP_AW-1:0]     next_sdr_addr ;
   wire [APP_AW-1:0]     next_sdr_addr ;
 
 
 
 
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Generate the internal Adress and Burst length Based on sdram width
// Generate the internal Adress and Burst length Based on sdram width
//--------------------------------------------------------------------
//--------------------------------------------------------------------
reg [APP_AW:0]           req_addr_int;
reg [APP_AW:0]           req_addr_int;
reg [APP_RW-1:0]         req_len_int;
reg [APP_RW-1:0]         req_len_int;
 
 
always @(*) begin
always @(*) begin
   if(sdr_width == 2'b00) begin // 32 Bit SDR Mode
   if(sdr_width == 2'b00) begin // 32 Bit SDR Mode
      req_addr_int     = {1'b0,req_addr};
      req_addr_int     = {1'b0,req_addr};
      req_len_int      = req_len;
      req_len_int      = req_len;
   end else if(sdr_width == 2'b01) begin // 16 Bit SDR Mode
   end else if(sdr_width == 2'b01) begin // 16 Bit SDR Mode
Line 207... Line 217...
 
 
   assign next_req_len = lcl_req_len - r2b_len;
   assign next_req_len = lcl_req_len - r2b_len;
 
 
   assign next_sdr_addr = curr_sdr_addr + r2b_len;
   assign next_sdr_addr = curr_sdr_addr + r2b_len;
 
 
   assign sdr_core_busy_n = req_idle & b2r_arb_ok & sdr_init_done;
 
 
 
   assign r2b_wrap = lcl_wrap;
   assign r2b_wrap = lcl_wrap;
 
 
   assign r2b_last = ~page_ovflw;
   assign r2b_last = ~page_ovflw;
//
//
Line 270... Line 279...
         req_st <= next_req_st;
         req_st <= next_req_st;
      end // else: !if(~reset_n)
      end // else: !if(~reset_n)
//
//
// addrs bits for the bank, row and column
// addrs bits for the bank, row and column
//
//
 
// Register row/column/bank to improve fpga timing issue
 
wire [APP_AW-1:0]        map_address ;
 
 
 
assign      map_address  = (req_ack) ? req_addr_int :
 
                           (req_ld)  ? next_sdr_addr : curr_sdr_addr;
 
 
 
always @ (posedge clk) begin
// Bank Bits are always - 2 Bits
// Bank Bits are always - 2 Bits
   assign r2b_ba = (cfg_colbits == 2'b00) ? {curr_sdr_addr[9:8]}   :
    r2b_ba <= (cfg_colbits == 2'b00) ? {map_address[9:8]}   :
                   (cfg_colbits == 2'b01) ? {curr_sdr_addr[10:9]}  :
                   (cfg_colbits == 2'b01) ? {map_address[10:9]}  :
                   (cfg_colbits == 2'b10) ? {curr_sdr_addr[11:10]} : curr_sdr_addr[12:11];
                   (cfg_colbits == 2'b10) ? {map_address[11:10]} : map_address[12:11];
 
 
/********************
/********************
*  Colbits Mapping:
*  Colbits Mapping:
*           2'b00 - 8 Bit
*           2'b00 - 8 Bit
*           2'b01 - 16 Bit
*           2'b01 - 16 Bit
*           2'b10 - 10 Bit
*           2'b10 - 10 Bit
*           2'b11 - 11 Bits
*           2'b11 - 11 Bits
************************/
************************/
   assign r2b_caddr = (cfg_colbits == 2'b00) ? {4'b0, curr_sdr_addr[7:0]} :
    r2b_caddr <= (cfg_colbits == 2'b00) ? {4'b0, map_address[7:0]} :
                      (cfg_colbits == 2'b01) ? {3'b0, curr_sdr_addr[8:0]} :
                       (cfg_colbits == 2'b01) ? {3'b0, map_address[8:0]} :
                      (cfg_colbits == 2'b10) ? {2'b0, curr_sdr_addr[9:0]} : {1'b0, curr_sdr_addr[10:0]};
                       (cfg_colbits == 2'b10) ? {2'b0, map_address[9:0]} : {1'b0, map_address[10:0]};
 
 
   assign r2b_raddr = (cfg_colbits == 2'b00)  ? curr_sdr_addr[21:10] :
    r2b_raddr <= (cfg_colbits == 2'b00)  ? map_address[21:10] :
                      (cfg_colbits == 2'b01)  ? curr_sdr_addr[22:11] :
                       (cfg_colbits == 2'b01)  ? map_address[22:11] :
                      (cfg_colbits == 2'b10)  ? curr_sdr_addr[23:12] : curr_sdr_addr[24:13];
                       (cfg_colbits == 2'b10)  ? map_address[23:12] : map_address[24:13];
 
end
 
 
endmodule // sdr_req_gen
endmodule // sdr_req_gen
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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